Skip to content

Commit 70001cd

Browse files
committed
drm/i915: Remove struct_mutex for destroying framebuffers
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>
1 parent 581ab1f commit 70001cd

File tree

4 files changed

+7
-8
lines changed

4 files changed

+7
-8
lines changed

drivers/gpu/drm/i915/i915_gem_object.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ struct drm_i915_gem_object {
165165
struct reservation_object *resv;
166166

167167
/** References from framebuffers, locks out tiling changes. */
168-
unsigned long framebuffer_references;
168+
atomic_t framebuffer_references;
169169

170170
/** Record of address bit 17 of each page at last unbind. */
171171
unsigned long *bit_17;

drivers/gpu/drm/i915/i915_gem_shrinker.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
207207

208208
if (!(flags & I915_SHRINK_ACTIVE) &&
209209
(i915_gem_object_is_active(obj) ||
210-
obj->framebuffer_references))
210+
atomic_read(&obj->framebuffer_references)))
211211
continue;
212212

213213
if (!can_release_pages(obj))

drivers/gpu/drm/i915/i915_gem_tiling.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
238238
if ((tiling | stride) == obj->tiling_and_stride)
239239
return 0;
240240

241-
if (obj->framebuffer_references)
241+
if (atomic_read(&obj->framebuffer_references))
242242
return -EBUSY;
243243

244244
/* We need to rebind the object if its current allocation

drivers/gpu/drm/i915/intel_display.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14265,14 +14265,13 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
1426514265

1426614266
static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
1426714267
{
14268-
struct drm_device *dev = fb->dev;
1426914268
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1427014269

1427114270
drm_framebuffer_cleanup(fb);
14272-
mutex_lock(&dev->struct_mutex);
14273-
WARN_ON(!intel_fb->obj->framebuffer_references--);
14271+
14272+
WARN_ON(atomic_dec_return(&intel_fb->obj->framebuffer_references) < 0);
1427414273
i915_gem_object_put(intel_fb->obj);
14275-
mutex_unlock(&dev->struct_mutex);
14274+
1427614275
kfree(intel_fb);
1427714276
}
1427814277

@@ -14509,7 +14508,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
1450914508
return ret;
1451014509
}
1451114510

14512-
intel_fb->obj->framebuffer_references++;
14511+
atomic_inc(&intel_fb->obj->framebuffer_references);
1451314512

1451414513
return 0;
1451514514
}

0 commit comments

Comments
 (0)