drm/i915: Remove struct_mutex for destroying framebuffers
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 16 Feb 2017 09:46:21 +0000 (09:46 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 16 Feb 2017 20:31:13 +0000 (20:31 +0000)
We do not need to hold struct_mutex for destroying drm_i915_gem_objects
any longer, and with a little care taken over tracking
obj->framebuffer_references, we can relinquish BKL locking around the
destroy of intel_framebuffer.

v2: Use atomic check for WARN_ON framebuffer miscounting

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170216094621.3426-1-chris@chris-wilson.co.uk
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/i915_gem_object.h
drivers/gpu/drm/i915/i915_gem_shrinker.c
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/intel_display.c

index 02365a5f7c80b3ed7ce6155105dfa0690c526393..ef4893a4f08c3ba40b36aab95d4ce75155a7bfc7 100644 (file)
@@ -165,7 +165,7 @@ struct drm_i915_gem_object {
        struct reservation_object *resv;
 
        /** References from framebuffers, locks out tiling changes. */
-       unsigned long framebuffer_references;
+       atomic_t framebuffer_references;
 
        /** Record of address bit 17 of each page at last unbind. */
        unsigned long *bit_17;
index f249a1eb46ac212260196b0838d29fc283a46ab7..8bc515e8b2a2e724b26ba09f77fb81606f93448e 100644 (file)
@@ -207,7 +207,7 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
 
                        if (!(flags & I915_SHRINK_ACTIVE) &&
                            (i915_gem_object_is_active(obj) ||
-                            obj->framebuffer_references))
+                            atomic_read(&obj->framebuffer_references)))
                                continue;
 
                        if (!can_release_pages(obj))
index 8b2b507bdf7ef3c43f17b602a241509066c68429..46ade36dcee60728b82b6b9ff176236a6ea9919e 100644 (file)
@@ -238,7 +238,7 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
        if ((tiling | stride) == obj->tiling_and_stride)
                return 0;
 
-       if (obj->framebuffer_references)
+       if (atomic_read(&obj->framebuffer_references))
                return -EBUSY;
 
        /* We need to rebind the object if its current allocation
index 660581fb329abead15b5ab34a6e06e41cdb93a05..e483540d24393e60327b23113106b223703b1057 100644 (file)
@@ -14265,14 +14265,13 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 
 static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
 {
-       struct drm_device *dev = fb->dev;
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 
        drm_framebuffer_cleanup(fb);
-       mutex_lock(&dev->struct_mutex);
-       WARN_ON(!intel_fb->obj->framebuffer_references--);
+
+       WARN_ON(atomic_dec_return(&intel_fb->obj->framebuffer_references) < 0);
        i915_gem_object_put(intel_fb->obj);
-       mutex_unlock(&dev->struct_mutex);
+
        kfree(intel_fb);
 }
 
@@ -14509,7 +14508,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
                return ret;
        }
 
-       intel_fb->obj->framebuffer_references++;
+       atomic_inc(&intel_fb->obj->framebuffer_references);
 
        return 0;
 }