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: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470388464-28458-16-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
parent
e883d73503
commit
9ad3676148
|
@ -2182,10 +2182,6 @@ struct drm_i915_gem_object {
|
|||
*/
|
||||
unsigned int madv:2;
|
||||
|
||||
/**
|
||||
* Current tiling mode for the object.
|
||||
*/
|
||||
unsigned int tiling_mode:2;
|
||||
/**
|
||||
* Whether the tiling parameters for the currently associated fence
|
||||
* register have changed. Note that for the purposes of tracking
|
||||
|
@ -2218,6 +2214,14 @@ struct drm_i915_gem_object {
|
|||
|
||||
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;
|
||||
/** Count of VMA actually bound by this object */
|
||||
unsigned int bind_count;
|
||||
|
@ -2245,9 +2249,6 @@ struct drm_i915_gem_object {
|
|||
struct i915_gem_active last_write;
|
||||
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. */
|
||||
unsigned long framebuffer_references;
|
||||
|
||||
|
|
|
@ -303,10 +303,8 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
|
|||
if (!obj)
|
||||
return -ENOENT;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
||||
args->tiling_mode = obj->tiling_mode;
|
||||
switch (obj->tiling_mode) {
|
||||
args->tiling_mode = READ_ONCE(obj->tiling_mode);
|
||||
switch (args->tiling_mode) {
|
||||
case I915_TILING_X:
|
||||
args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x;
|
||||
break;
|
||||
|
@ -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)
|
||||
args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10;
|
||||
|
||||
i915_gem_object_put(obj);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
i915_gem_object_put_unlocked(obj);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue