From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 07/16] drm/i915: don't call shmem_read_mapping unnecessarily Date: Mon, 26 Mar 2012 11:10:05 +0200 Message-ID: <20120326091005.GF4014@phenom.ffwll.local> References: <1332697663-31256-1-git-send-email-daniel.vetter@ffwll.ch> <1332697663-31256-7-git-send-email-daniel.vetter@ffwll.ch> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: Received: from mail-wg0-f41.google.com (mail-wg0-f41.google.com [74.125.82.41]) by gabe.freedesktop.org (Postfix) with ESMTP id 03614A0878 for ; Mon, 26 Mar 2012 02:09:22 -0700 (PDT) Received: by wgbds1 with SMTP id ds1so2299994wgb.0 for ; Mon, 26 Mar 2012 02:09:22 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1332697663-31256-7-git-send-email-daniel.vetter@ffwll.ch> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: Intel Graphics Development Cc: Daniel Vetter List-Id: intel-gfx@lists.freedesktop.org On Sun, Mar 25, 2012 at 07:47:34PM +0200, Daniel Vetter wrote: > This speeds up pwrite and pread from ~120 =B5s ro ~100 =B5s for > reading/writing 1mb on my snb (if the backing storage pages > are already pinned, of course). > = > v2: Chris Wilson pointed out a claring page reference bug - I've s/claring/glaring, noticed by Chris. Note to self: Fix this when applying. -Daniel > unconditionally dropped the reference. With that fixed (and the > associated reduction of dirt in dmesg) it's now even a notch faster. > = > v3: Unconditionaly grab a page reference when dropping > dev->struct_mutex to simplify the code-flow. > = > Signed-off-by: Daniel Vetter > --- > drivers/gpu/drm/i915/i915_gem.c | 42 +++++++++++++++++++++++++++------= ----- > 1 files changed, 30 insertions(+), 12 deletions(-) > = > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_= gem.c > index c5b250c..117fda4 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -321,6 +321,7 @@ i915_gem_shmem_pread(struct drm_device *dev, > int obj_do_bit17_swizzling, page_do_bit17_swizzling; > int hit_slowpath =3D 0; > int needs_clflush =3D 0; > + int release_page; > = > user_data =3D (char __user *) (uintptr_t) args->data_ptr; > remain =3D args->size; > @@ -355,10 +356,16 @@ i915_gem_shmem_pread(struct drm_device *dev, > if ((shmem_page_offset + page_length) > PAGE_SIZE) > page_length =3D PAGE_SIZE - shmem_page_offset; > = > - page =3D shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); > - if (IS_ERR(page)) { > - ret =3D PTR_ERR(page); > - goto out; > + if (obj->pages) { > + page =3D obj->pages[offset >> PAGE_SHIFT]; > + release_page =3D 0; > + } else { > + page =3D shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); > + if (IS_ERR(page)) { > + ret =3D PTR_ERR(page); > + goto out; > + } > + release_page =3D 1; > } > = > page_do_bit17_swizzling =3D obj_do_bit17_swizzling && > @@ -378,7 +385,7 @@ i915_gem_shmem_pread(struct drm_device *dev, > } > = > hit_slowpath =3D 1; > - > + page_cache_get(page); > mutex_unlock(&dev->struct_mutex); > = > vaddr =3D kmap(page); > @@ -397,9 +404,11 @@ i915_gem_shmem_pread(struct drm_device *dev, > kunmap(page); > = > mutex_lock(&dev->struct_mutex); > + page_cache_release(page); > next_page: > mark_page_accessed(page); > - page_cache_release(page); > + if (release_page) > + page_cache_release(page); > = > if (ret) { > ret =3D -EFAULT; > @@ -680,6 +689,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev, > int shmem_page_offset, page_length, ret =3D 0; > int obj_do_bit17_swizzling, page_do_bit17_swizzling; > int hit_slowpath =3D 0; > + int release_page; > = > user_data =3D (char __user *) (uintptr_t) args->data_ptr; > remain =3D args->size; > @@ -704,10 +714,16 @@ i915_gem_shmem_pwrite(struct drm_device *dev, > if ((shmem_page_offset + page_length) > PAGE_SIZE) > page_length =3D PAGE_SIZE - shmem_page_offset; > = > - page =3D shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); > - if (IS_ERR(page)) { > - ret =3D PTR_ERR(page); > - goto out; > + if (obj->pages) { > + page =3D obj->pages[offset >> PAGE_SHIFT]; > + release_page =3D 0; > + } else { > + page =3D shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT); > + if (IS_ERR(page)) { > + ret =3D PTR_ERR(page); > + goto out; > + } > + release_page =3D 1; > } > = > page_do_bit17_swizzling =3D obj_do_bit17_swizzling && > @@ -725,7 +741,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev, > } > = > hit_slowpath =3D 1; > - > + page_cache_get(page); > mutex_unlock(&dev->struct_mutex); > = > vaddr =3D kmap(page); > @@ -740,10 +756,12 @@ i915_gem_shmem_pwrite(struct drm_device *dev, > kunmap(page); > = > mutex_lock(&dev->struct_mutex); > + page_cache_release(page); > next_page: > set_page_dirty(page); > mark_page_accessed(page); > - page_cache_release(page); > + if (release_page) > + page_cache_release(page); > = > if (ret) { > ret =3D -EFAULT; > -- = > 1.7.7.6 > = -- = Daniel Vetter Mail: daniel@ffwll.ch Mobile: +41 (0)79 365 57 48