diff mbox

drm/i915: Use atomic for dev_priv->mm.bsd_engine_dispatch_index

Message ID 1472731101-21982-1-git-send-email-joonas.lahtinen@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Joonas Lahtinen Sept. 1, 2016, 11:58 a.m. UTC
Use atomic type and operands for dev_priv->mm.bsd_engine_dispatch_index
to avoid one struct_mutex locking scenario.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Zhao Yakui <yakui.zhao@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h            |  2 +-
 drivers/gpu/drm/i915/i915_gem.c            |  2 ++
 drivers/gpu/drm/i915/i915_gem_execbuffer.c | 10 +++-------
 3 files changed, 6 insertions(+), 8 deletions(-)

Comments

Chris Wilson Sept. 1, 2016, 12:08 p.m. UTC | #1
On Thu, Sep 01, 2016 at 02:58:21PM +0300, Joonas Lahtinen wrote:
> Use atomic type and operands for dev_priv->mm.bsd_engine_dispatch_index
> to avoid one struct_mutex locking scenario.
> 
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Imre Deak <imre.deak@intel.com>
> Cc: Zhao Yakui <yakui.zhao@intel.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

Looks fine, it's one that I've simply been too lazy to worry about.
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
Chris Wilson Sept. 1, 2016, 12:27 p.m. UTC | #2
On Thu, Sep 01, 2016 at 12:20:18PM -0000, Patchwork wrote:
> == Series Details ==
> 
> Series: drm/i915: Use atomic for dev_priv->mm.bsd_engine_dispatch_index
> URL   : https://patchwork.freedesktop.org/series/11890/
> State : failure
> 
> == Summary ==
> 
> Series 11890v1 drm/i915: Use atomic for dev_priv->mm.bsd_engine_dispatch_index
> http://patchwork.freedesktop.org/api/1.0/series/11890/revisions/1/mbox/
> 
> Test prime_vgem:
>         Subgroup basic-fence-flip:
>                 pass       -> FAIL       (fi-bdw-5557u)

Hmm, this is probably some condition I forgot to drain before starting
the test. What's the actual failure?
-Chris
Joonas Lahtinen Sept. 1, 2016, 12:32 p.m. UTC | #3
On to, 2016-09-01 at 13:27 +0100, Chris Wilson wrote:
> On Thu, Sep 01, 2016 at 12:20:18PM -0000, Patchwork wrote:
> > Test prime_vgem:
> >         Subgroup basic-fence-flip:
> >                 pass       -> FAIL       (fi-bdw-5557u)
> Hmm, this is probably some condition I forgot to drain before starting
> the test. What's the actual failure?

(prime_vgem:29095) CRITICAL: Test assertion failure function flip_to_vgem, file prime_vgem.c:651:
(prime_vgem:29095) CRITICAL: Failed assertion: poll(&pfd, 1, 20000) == 1
(prime_vgem:29095) CRITICAL: error: 0 != 1
Subtest basic-fence-flip failed.
**** DEBUG ****
(prime_vgem:29089) ioctl-wrappers-DEBUG: Test requirement passed: has_modifiers
(prime_vgem:29089) ioctl-wrappers-DEBUG: Test requirement passed: has_modifiers
(prime_vgem:29089) DEBUG: Test requirement passed: (crtc_id = set_fb_on_crtc(i915, 0, &bo[0], fb_id[0]))
****  END  ****

Regards, Joonas
Joonas Lahtinen Sept. 1, 2016, 12:42 p.m. UTC | #4
On to, 2016-09-01 at 15:32 +0300, Joonas Lahtinen wrote:
> On to, 2016-09-01 at 13:27 +0100, Chris Wilson wrote:
> > 
> > On Thu, Sep 01, 2016 at 12:20:18PM -0000, Patchwork wrote:
> > > 
> > > Test prime_vgem:
> > >         Subgroup basic-fence-flip:
> > >                 pass       -> FAIL       (fi-bdw-5557u)
> > Hmm, this is probably some condition I forgot to drain before starting
> > the test. What's the actual failure?
> (prime_vgem:29095) CRITICAL: Test assertion failure function flip_to_vgem, file prime_vgem.c:651:
> (prime_vgem:29095) CRITICAL: Failed assertion: poll(&pfd, 1, 20000) == 1
> (prime_vgem:29095) CRITICAL: error: 0 != 1
> Subtest basic-fence-flip failed.
> **** DEBUG ****
> (prime_vgem:29089) ioctl-wrappers-DEBUG: Test requirement passed: has_modifiers
> (prime_vgem:29089) ioctl-wrappers-DEBUG: Test requirement passed: has_modifiers
> (prime_vgem:29089) DEBUG: Test requirement passed: (crtc_id = set_fb_on_crtc(i915, 0, &bo[0], fb_id[0]))
> ****  END  ****
> 

Anyway, pushed the patch, thanks for review.

Regards, Joonas

> Regards, Joonas
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c413587..43d5298 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1338,7 +1338,7 @@  struct i915_gem_mm {
 	bool interruptible;
 
 	/* the indicator for dispatch video commands on two BSD rings */
-	unsigned int bsd_engine_dispatch_index;
+	atomic_t bsd_engine_dispatch_index;
 
 	/** Bit 6 swizzling required for X tiling */
 	uint32_t bit_6_swizzle_x;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d37b441..2401818 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4622,6 +4622,8 @@  i915_gem_load_init(struct drm_device *dev)
 
 	dev_priv->mm.interruptible = true;
 
+	atomic_set(&dev_priv->mm.bsd_engine_dispatch_index, 0);
+
 	spin_lock_init(&dev_priv->fb_tracking.lock);
 }
 
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 57d096a..9432d4c 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1535,13 +1535,9 @@  gen8_dispatch_bsd_engine(struct drm_i915_private *dev_priv,
 	struct drm_i915_file_private *file_priv = file->driver_priv;
 
 	/* Check whether the file_priv has already selected one ring. */
-	if ((int)file_priv->bsd_engine < 0) {
-		/* If not, use the ping-pong mechanism to select one. */
-		mutex_lock(&dev_priv->drm.struct_mutex);
-		file_priv->bsd_engine = dev_priv->mm.bsd_engine_dispatch_index;
-		dev_priv->mm.bsd_engine_dispatch_index ^= 1;
-		mutex_unlock(&dev_priv->drm.struct_mutex);
-	}
+	if ((int)file_priv->bsd_engine < 0)
+		file_priv->bsd_engine = atomic_fetch_xor(1,
+			 &dev_priv->mm.bsd_engine_dispatch_index);
 
 	return file_priv->bsd_engine;
 }