Re: [PATCH] drm/i915/execlists: Use rmb() to order CSB reads

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Mika Kuoppala (2018-05-08 14:21:34)
> Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes:
> 
> > We assume that the CSB is written using the normal ringbuffer
> > coherency protocols, as outlined in kernel/events/ring_buffer.c:
> >
> >     *   (HW)                              (DRIVER)
> >     *
> >     *   if (LOAD ->data_tail) {            LOAD ->data_head
> >     *                      (A)             smp_rmb()       (C)
> >     *      STORE $data                     LOAD $data
> >     *      smp_wmb()       (B)             smp_mb()        (D)
> >     *      STORE ->data_head               STORE ->data_tail
> >     *   }
> >
> > So we assume that the HW fulfils it's ordering requirements (B), and so
> > we should use a complimentary rmb (C) to ensure that our read of its
> > WRITE pointer is completed before we start accessing the data.
> >
> > The final mb (D) is implied by the uncached mmio we perform to inform
> > the HW of our READ pointer.
> >
> > References: https://bugs.freedesktop.org/show_bug.cgi?id=105064
> > References: https://bugs.freedesktop.org/show_bug.cgi?id=105888
> > References: https://bugs.freedesktop.org/show_bug.cgi?id=106185
> > References: 61bf9719fa17 ("drm/i915/cnl: Use mmio access to context status buffer")
> > Suggested-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>
> > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>
> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
> > Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx>
> > Cc: Rafael Antognolli <rafael.antognolli@xxxxxxxxx>
> > Cc: Michel Thierry <michel.thierry@xxxxxxxxx>
> > Cc: Timo Aaltonen <tjaalton@xxxxxxxxxx>
> > Tested-by: Timo Aaltonen <tjaalton@xxxxxxxxxx>
> > ---
> >
> > Just tweaked the commitmsg to cross reference the mb against the
> > diagram.
> > -Chris
> >
> > ---
> >  drivers/gpu/drm/i915/intel_engine_cs.c | 3 ---
> >  drivers/gpu/drm/i915/intel_lrc.c       | 1 +
> >  2 files changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> > index 70325e0824e3..8303e05b0c7d 100644
> > --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> > +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> > @@ -470,9 +470,6 @@ static bool csb_force_mmio(struct drm_i915_private *i915)
> >       if (intel_vgpu_active(i915) && !intel_vgpu_has_hwsp_emulation(i915))
> >               return true;
> >  
> > -     if (IS_CANNONLAKE(i915))
> > -             return true;
> > -
> >       return false;
> >  }
> >  
> > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> > index 911f288f78aa..8977600f0d81 100644
> > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > @@ -992,6 +992,7 @@ static void execlists_submission_tasklet(unsigned long data)
> >  
> >                       head = execlists->csb_head;
> >                       tail = READ_ONCE(buf[write_idx]);
> > +                     rmb(); /* Hopefully paired with a wmb() in HW */
> 
> If the gpu does ordered writes (with write buffer in between), this is ok.
> 
> If the gpu does not order writes, we would still need the rmb()
> to prevent cpu from loading an stale csb entry ahead of tail read?
> 
> Quoting memory-barries.txt:
> " (*) loads may be done speculatively, leading to the result having been fetched
>      at the wrong time in the expected sequence of events;
> "
> 
> So I would change the comment to /* Enforce tail vs csb entry read order */

Barriers are always paired, and the comment should tell the reader where
the other barrier is. Otherwise we would just need read_barrier_depends()
to enforce the read order (which is just READ_ONCE).
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux