All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Wilson <chris@chris-wilson.co.uk>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>,
	Intel Graphics Development <intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH] drm/i915: fixup i915_gem_object_get_page inline helper
Date: Wed, 10 Oct 2012 11:36:48 +0100	[thread overview]
Message-ID: <b94cdc$6tc76g@fmsmga001.fm.intel.com> (raw)
In-Reply-To: <20121010092144.GC5533@phenom.ffwll.local>

On Wed, 10 Oct 2012 11:21:44 +0200, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Wed, Oct 10, 2012 at 10:01:47AM +0100, Chris Wilson wrote:
> > On Tue, 09 Oct 2012 23:16:02 +0100, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> > > On Tue,  9 Oct 2012 22:50:48 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > > > The obj->pages to obj->pages->sgl rework introduced this helper, but
> > > > it doesn't actually work for n >= SG_MAX_SINGLE_ALLOC.
> > > > 
> > > > For simplicity (and since right now I seem to be too stupid to see
> > > > the bug), let's just grab the right page with a for_each_sg loop.
> > > > 
> > > > This is exercised by the improved hangman tests and the gem_exec_big
> > > > test in i-g-t.
> > > > 
> > > > v2: Compared to v1, don't try to be clever since I seemingly only
> > > > manage to prove that I'm not clever.
> > > 
> > > Only I expect that loop to show up on profiles even higher than the
> > > sg_next() from pwrite. :|
> > > 
> > > I expect it to have a measureable impact upon relocation throughput,
> > > so I should measure it...
> > > -Chris
> > > 
> > > -- 
> > > Chris Wilson, Intel Open Source Technology Centre
> > > _______________________________________________
> > > Intel-gfx mailing list
> > > Intel-gfx@lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> > From: Chris Wilson <chris@chris-wilson.co.uk>
> > Subject: Re: [PATCH] drm/i915: fixup i915_gem_object_get_page inline helper
> > To: Daniel Vetter <daniel.vetter@ffwll.ch>, Intel Graphics Development <intel-gfx@lists.freedesktop.org>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > In-Reply-To: <1349815848-1824-1-git-send-email-daniel.vetter@ffwll.ch>
> > References: <84c8a8$624sk4@orsmga001.jf.intel.com> <1349815848-1824-1-git-send-email-daniel.vetter@ffwll.ch>
> > 
> > On Tue,  9 Oct 2012 22:50:48 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > > The obj->pages to obj->pages->sgl rework introduced this helper, but
> > > it doesn't actually work for n >= SG_MAX_SINGLE_ALLOC.
> > > 
> > > For simplicity (and since right now I seem to be too stupid to see
> > > the bug), let's just grab the right page with a for_each_sg loop.
> > > 
> > > This is exercised by the improved hangman tests and the gem_exec_big
> > > test in i-g-t.
> > > 
> > > v2: Compared to v1, don't try to be clever since I seemingly only
> > > manage to prove that I'm not clever.
> > > 
> > > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > 
> > Looks like my worries are baseless. It can always be attacked latter if
> > need be. I'd still like to know what the mistake was...
> > 
> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> 
> Merged to -fixes, with the missing regression-sha1 citation added.
> -Daniel
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
From: Chris Wilson <chris@chris-wilson.co.uk>
Subject: Re: [Intel-gfx] [PATCH] drm/i915: fixup i915_gem_object_get_page inline helper
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>, Intel Graphics Development <intel-gfx@lists.freedesktop.org>
In-Reply-To: <20121010091538.GB5533@phenom.ffwll.local>
References: <84c8a8$624sk4@orsmga001.jf.intel.com> <1349815848-1824-1-git-send-email-daniel.vetter@ffwll.ch> <6c3329$6m595h@orsmga002.jf.intel.com> <453bf0$61a4mf@azsmga001.ch.intel.com> <20121010091538.GB5533@phenom.ffwll.local>

On Wed, 10 Oct 2012 11:15:38 +0200, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Wed, Oct 10, 2012 at 10:01:47AM +0100, Chris Wilson wrote:
> > On Tue, 09 Oct 2012 23:16:02 +0100, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> > > On Tue,  9 Oct 2012 22:50:48 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > > > The obj->pages to obj->pages->sgl rework introduced this helper, but
> > > > it doesn't actually work for n >= SG_MAX_SINGLE_ALLOC.
> > > > 
> > > > For simplicity (and since right now I seem to be too stupid to see
> > > > the bug), let's just grab the right page with a for_each_sg loop.
> > > > 
> > > > This is exercised by the improved hangman tests and the gem_exec_big
> > > > test in i-g-t.
> > > > 
> > > > v2: Compared to v1, don't try to be clever since I seemingly only
> > > > manage to prove that I'm not clever.
> > > 
> > > Only I expect that loop to show up on profiles even higher than the
> > > sg_next() from pwrite. :|
> > > 
> > > I expect it to have a measureable impact upon relocation throughput,
> > > so I should measure it...
> > > -Chris
> > > 
> > > -- 
> > > Chris Wilson, Intel Open Source Technology Centre
> > > _______________________________________________
> > > Intel-gfx mailing list
> > > Intel-gfx@lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> > From: Chris Wilson <chris@chris-wilson.co.uk>
> > Subject: Re: [PATCH] drm/i915: fixup i915_gem_object_get_page inline helper
> > To: Daniel Vetter <daniel.vetter@ffwll.ch>, Intel Graphics Development <intel-gfx@lists.freedesktop.org>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > In-Reply-To: <1349815848-1824-1-git-send-email-daniel.vetter@ffwll.ch>
> > References: <84c8a8$624sk4@orsmga001.jf.intel.com> <1349815848-1824-1-git-send-email-daniel.vetter@ffwll.ch>
> > 
> > On Tue,  9 Oct 2012 22:50:48 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > > The obj->pages to obj->pages->sgl rework introduced this helper, but
> > > it doesn't actually work for n >= SG_MAX_SINGLE_ALLOC.
> > > 
> > > For simplicity (and since right now I seem to be too stupid to see
> > > the bug), let's just grab the right page with a for_each_sg loop.
> > > 
> > > This is exercised by the improved hangman tests and the gem_exec_big
> > > test in i-g-t.
> > > 
> > > v2: Compared to v1, don't try to be clever since I seemingly only
> > > manage to prove that I'm not clever.
> > > 
> > > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > 
> > Looks like my worries are baseless. It can always be attacked latter if
> > need be. I'd still like to know what the mistake was...
> 
> I think it was two mistakes:
> - One was the off-by-one fixed in v1.
> - Second seemed to be the special case that if the table fits exactly,
>   sg_alloc doesn't set a chain ptr with another sg table with just one
>   entry.

That oddity is the reason why the loop was structured so.

The mistake is that just because we have n == MAX, does not mean that
there are only n elements left in the sg! *hides*

diff --git a/drivers/gpu/drm/i915/i915_drv.h
b/drivers/gpu/drm/i915/i915_drv.h
index d2dda78..e6707e7 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1383,9 +1383,14 @@ int __must_check i915_gem_object_get_pages(struct drm_i91
 static inline struct page *i915_gem_object_get_page(struct drm_i915_gem_object 
 {
        struct scatterlist *sg = obj->pages->sgl;
-       while (n >= SG_MAX_SINGLE_ALLOC) {
+       int nents = obj->pages->orig;
+       while (nents > SG_MAX_SINGLE_ALLOC) {
+               if (n < SG_MAX_SINGLE_ALLOC - 1)
+                       break;
+
                sg = sg_chain_ptr(sg + SG_MAX_SINGLE_ALLOC - 1);
                n -= SG_MAX_SINGLE_ALLOC - 1;
+               nents -= SG_MAX_SINGLE_ALLOC - 1;
        }
        return sg_page(sg+n);
 }

-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

  reply	other threads:[~2012-10-10 10:36 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-09 17:59 [PATCH] drm/i915: fixup i915_gem_object_get_page inline helper Daniel Vetter
2012-10-09 20:41 ` Chris Wilson
2012-10-09 20:50   ` Daniel Vetter
2012-10-09 22:16     ` Chris Wilson
2012-10-10  9:01       ` Chris Wilson
2012-10-10  9:15         ` Daniel Vetter
2012-10-10  9:21         ` Daniel Vetter
2012-10-10 10:36           ` Chris Wilson [this message]
2012-10-10 11:11 Chris Wilson
2012-10-10 11:38 ` Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='b94cdc$6tc76g@fmsmga001.fm.intel.com' \
    --to=chris@chris-wilson.co.uk \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel@ffwll.ch \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.