drm/i915: Remove locking for get_tiling
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 5 Aug 2016 09:14:21 +0000 (10:14 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 5 Aug 2016 09:54:42 +0000 (10:54 +0100)
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
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_tiling.c

index 31a614fe9ed78c28eab55d128c1cd09bffd03fee..f18d8761305c7ad1af1a4d2f7118ba71c192659b 100644 (file)
@@ -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;
 
index b7f9875f69b40f785d3aba68e791d88486e4170c..c0e01333bddf593545f4526709d539e186e3601f 100644 (file)
@@ -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;
 }