[Intel-gfx] [PATCH] drm/i915: Fix some NUM_RING iterators

Chris Wilson chris at chris-wilson.co.uk
Sat Jun 28 08:20:38 CEST 2014


On Fri, Jun 27, 2014 at 03:21:20PM -0700, Rodrigo Vivi wrote:
>    Reviewed-by: Rodrigo Vivi <[1]rodrigo.vivi at intel.com>
> 
>    On Fri, Jun 27, 2014 at 3:09 PM, Ben Widawsky
>    <[2]benjamin.widawsky at intel.com> wrote:
> 
>      There are some cases in the code where we need to know how many rings to
>      iterate over, but cannot use for_each_ring(). These are always error
>      cases
>      which happen either before ring setup, or after ring teardown (or
>      reset).
> 
>      Note, a NUM_RINGS issue exists in semaphores, but this is fixed by the
>      remaining semaphore patches which Rodrigo will resubmit shortly. I'd
>      rather see those patches for fixing the problem than fix it here.
> 
>      I found this initially for the BSD2 case where on the same platform we
>      can have differing rings. AFAICT however this effects many platforms.
> 
>      I'd CC stable on this, except I think all the issues have been around
>      for multiple releases without bug reports.
> 
>      Compile tested only for now.
> 
>      Signed-off-by: Ben Widawsky <[3]ben at bwidawsk.net>
>      ---
>       drivers/gpu/drm/i915/i915_gem_context.c | 6 +++---
>       drivers/gpu/drm/i915/i915_gpu_error.c   | 2 +-
>       drivers/gpu/drm/i915/intel_ringbuffer.h | 2 ++
>       3 files changed, 6 insertions(+), 4 deletions(-)
> 
>      diff --git a/drivers/gpu/drm/i915/i915_gem_context.c
>      b/drivers/gpu/drm/i915/i915_gem_context.c
>      index b9bac25..0c044a9 100644
>      --- a/drivers/gpu/drm/i915/i915_gem_context.c
>      +++ b/drivers/gpu/drm/i915/i915_gem_context.c
>      @@ -403,7 +403,7 @@ void i915_gem_context_reset(struct drm_device *dev)
> 
>              /* Prevent the hardware from restoring the last context (which
>      hung) on
>               * the next switch */
>      -       for (i = 0; i < I915_NUM_RINGS; i++) {
>      +       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++) {
>                      struct intel_engine_cs *ring = &dev_priv->ring[i];
>                      struct intel_context *dctx = ring->default_context;
> 
>      @@ -456,7 +456,7 @@ int i915_gem_context_init(struct drm_device *dev)
>              }
> 
>              /* NB: RCS will hold a ref for all rings */
>      -       for (i = 0; i < I915_NUM_RINGS; i++)
>      +       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++)
>                      dev_priv->ring[i].default_context = ctx;
> 
>              DRM_DEBUG_DRIVER("%s context support initialized\n",
>      dev_priv->hw_context_size ? "HW" : "fake");
>      @@ -493,7 +493,7 @@ void i915_gem_context_fini(struct drm_device *dev)
>                      i915_gem_object_ggtt_unpin(dctx->obj);
>              }
> 
>      -       for (i = 0; i < I915_NUM_RINGS; i++) {
>      +       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++) {
>                      struct intel_engine_cs *ring = &dev_priv->ring[i];
> 
>                      if (ring->last_context)
>      diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c
>      b/drivers/gpu/drm/i915/i915_gpu_error.c
>      index 86362de..6e5250d 100644
>      --- a/drivers/gpu/drm/i915/i915_gpu_error.c
>      +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
>      @@ -848,7 +848,7 @@ static uint32_t i915_error_generate_code(struct
>      drm_i915_private *dev_priv,
>               * synchronization commands which almost always appear in the
>      case
>               * strictly a client bug. Use instdone to differentiate those
>      some.
>               */
>      -       for (i = 0; i < I915_NUM_RINGS; i++) {
>      +       for (i = 0; i < I915_ACTIVE_RINGS(dev_priv->dev); i++) {
>                      if (error->ring[i].hangcheck_action == HANGCHECK_HUNG) {
>                              if (ring_id)
>                                      *ring_id = i;
>      diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h
>      b/drivers/gpu/drm/i915/intel_ringbuffer.h
>      index e72017b..67e2919 100644
>      --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
>      +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
>      @@ -90,6 +90,8 @@ struct  intel_engine_cs {
>              } id;
>       #define I915_NUM_RINGS 5
>       #define LAST_USER_RING (VECS + 1)
>      +#define I915_ACTIVE_RINGS(dev) hweight8(INTEL_INFO(dev)->ring_mask)

What does the popcount of the mask have to do with the validity of the
arrays being iterated over in this patch?
-Chris


-- 
Chris Wilson, Intel Open Source Technology Centre



More information about the Intel-gfx mailing list