Commit 9ad36761 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Remove locking for get_tiling

Since we are not concerned with userspace racing itself with set-tiling
(the order is indeterminant even if we take a lock), then we can safely
read back the single obj->tiling_mode and do the static lookup of
swizzle mode without having to take a lock.

get-tiling is reasonably frequent due to the back-channel passing around
of tiling parameters in DRI2/DRI3.

v2: Make tiling_mode a full unsigned int so that we can trivially use it
with READ_ONCE(). Separating it out into manual control over the flags
field was too noisy for a simple patch. Note that we could use the lower
bits of obj->stride for the tiling mode.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1470388464-28458-16-git-send-email-chris@chris-wilson.co.uk
parent e883d735
...@@ -2182,10 +2182,6 @@ struct drm_i915_gem_object { ...@@ -2182,10 +2182,6 @@ struct drm_i915_gem_object {
*/ */
unsigned int madv:2; unsigned int madv:2;
/**
* Current tiling mode for the object.
*/
unsigned int tiling_mode:2;
/** /**
* Whether the tiling parameters for the currently associated fence * Whether the tiling parameters for the currently associated fence
* register have changed. Note that for the purposes of tracking * register have changed. Note that for the purposes of tracking
...@@ -2218,6 +2214,14 @@ struct drm_i915_gem_object { ...@@ -2218,6 +2214,14 @@ struct drm_i915_gem_object {
atomic_t frontbuffer_bits; atomic_t frontbuffer_bits;
/**
* Current tiling mode for the object.
*/
unsigned int tiling_mode;
/** Current tiling stride for the object, if it's tiled. */
uint32_t stride;
unsigned int has_wc_mmap; unsigned int has_wc_mmap;
/** Count of VMA actually bound by this object */ /** Count of VMA actually bound by this object */
unsigned int bind_count; unsigned int bind_count;
...@@ -2245,9 +2249,6 @@ struct drm_i915_gem_object { ...@@ -2245,9 +2249,6 @@ struct drm_i915_gem_object {
struct i915_gem_active last_write; struct i915_gem_active last_write;
struct i915_gem_active last_fence; struct i915_gem_active last_fence;
/** Current tiling stride for the object, if it's tiled. */
uint32_t stride;
/** References from framebuffers, locks out tiling changes. */ /** References from framebuffers, locks out tiling changes. */
unsigned long framebuffer_references; unsigned long framebuffer_references;
......
...@@ -303,10 +303,8 @@ i915_gem_get_tiling(struct drm_device *dev, void *data, ...@@ -303,10 +303,8 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
if (!obj) if (!obj)
return -ENOENT; return -ENOENT;
mutex_lock(&dev->struct_mutex); args->tiling_mode = READ_ONCE(obj->tiling_mode);
switch (args->tiling_mode) {
args->tiling_mode = obj->tiling_mode;
switch (obj->tiling_mode) {
case I915_TILING_X: case I915_TILING_X:
args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x;
break; break;
...@@ -330,8 +328,6 @@ i915_gem_get_tiling(struct drm_device *dev, void *data, ...@@ -330,8 +328,6 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17) if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17)
args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10; args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10;
i915_gem_object_put(obj); i915_gem_object_put_unlocked(obj);
mutex_unlock(&dev->struct_mutex);
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment