[Intel-gfx] [PATCH] drm/i915: set initialised only when init_context callback is NULL

Dong, Chuanxiao chuanxiao.dong at intel.com
Fri May 12 10:50:38 UTC 2017



> -----Original Message-----
> From: Chris Wilson [mailto:chris at chris-wilson.co.uk]
> Sent: Friday, May 12, 2017 6:11 PM
> To: Dong, Chuanxiao <chuanxiao.dong at intel.com>; intel-
> gfx at lists.freedesktop.org; intel-gvt-dev at lists.freedesktop.org
> Subject: Re: [Intel-gfx] [PATCH] drm/i915: set initialised only when
> init_context callback is NULL
> 
> On Fri, May 12, 2017 at 10:49:24AM +0100, Chris Wilson wrote:
> > On Thu, May 11, 2017 at 06:07:42PM +0800, Chuanxiao Dong wrote:
> > > initialised is fixup by the GVT shadow context as true to avoid the
> > > init from the host because it cannot take the settings from the
> > > host. Add a check to let host driver only overwrite it when the init
> > > callback is NULL
> >
> > During execlist_context_deferred_alloc() we presumed that the context
> > is uninitialised (we only just allocated the state object for it!) and
> > chose to optimise away the later call to engine->init_context() if
> > engine->init_context were NULL. This breaks with GVT's contexts that
> > engine->are
> > marked as pre-initialised to avoid us annoyingly calling
> > engine->init_context(). The fix is to not override ce->initialised if
> > engine->it
> > is already true.

Thanks Chris, will use this as commit message

> >
> > > Cc: Chris Wilson <chris at chris-wilson.co.uk>
> > > Signed-off-by: Chuanxiao Dong <chuanxiao.dong at intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/intel_lrc.c | 3 ++-
> > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/intel_lrc.c
> > > b/drivers/gpu/drm/i915/intel_lrc.c
> > > index 319d9a8..d0e9b61 100644
> > > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > > @@ -1956,7 +1956,8 @@ static int
> > > execlists_context_deferred_alloc(struct i915_gem_context *ctx,
> > >
> > >  	ce->ring = ring;
> > >  	ce->state = vma;
> > > -	ce->initialised = engine->init_context == NULL;
> > > +	if (!engine->init_context)
> > > +		ce->initialised = true;
> >
> > Does the compiler generate a cmov?

Just get the assembly code of this change, seems no cmov.
if (!engine->init_context)
ffffffff8156b6f3:       49 83 bf c0 01 00 00    cmpq   $0x0,0x1c0(%r15)
ffffffff8156b6fa:       00
ffffffff8156b6fb:       0f 84 e5 01 00 00       je     ffffffff8156b8e6 <execlists_context_pin+0x486>
.........
        ce->initialised = true;
ffffffff8156b8e6:       4d 6b ed 28             imul   $0x28,%r13,%r13
ffffffff8156b8ea:       43 c6 44 2e 7c 01       movb   $0x1,0x7c(%r14,%r13,1)
ffffffff8156b8f0:       e9 0c fe ff ff          jmpq   ffffffff8156b701 <execlists_context_pin+0x2a1>

> 
> Test and jump, may as well just use ce->initialised |= init_context == NULL; -
> Chris

This is the new assembly code for this new change:

         ce->initialised |= engine->init_context == NULL;
ffffffff8156b6f3:       49 83 bf c0 01 00 00    cmpq   $0x0,0x1c0(%r15)
ffffffff8156b6fa:       00
ffffffff8156b6fb:       0f 94 c2                sete   %dl
ffffffff8156b6fe:       08 50 7c                or     %dl,0x7c(%rax)

looks your change is better because the compiler doesn't generate a jump. :)

Will send out v2 with your idea.

Thanks
Chuanxiao


More information about the Intel-gfx mailing list