Commit 6f633402 authored by Joonas Lahtinen's avatar Joonas Lahtinen
Browse files

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



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: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1472731101-21982-1-git-send-email-joonas.lahtinen@linux.intel.com
parent 5423adf1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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);
}

+3 −7
Original line number Diff line number Diff line
@@ -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;
}