瀏覽代碼

drm/i915: more struct_mutex locking

When auditing the locking in i915_gem.c (for a prospective change which I
then abandoned), I noticed two places where struct_mutex is not held
across GEM object manipulations that would usually require it.  Since one
is in initial setup and the other in driver unload, I'm guessing the mutex
is not required for either; but post a patch in case it is.

Signed-off-by: Hugh Dickins <hughd@google.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Keith Packard <keithp@keithp.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
Hugh Dickins 14 年之前
父節點
當前提交
1e5216e438
共有 2 個文件被更改,包括 6 次插入2 次删除
  1. 1 2
      drivers/gpu/drm/i915/i915_dma.c
  2. 5 0
      drivers/gpu/drm/i915/intel_overlay.c

+ 1 - 2
drivers/gpu/drm/i915/i915_dma.c

@@ -2182,9 +2182,8 @@ int i915_driver_unload(struct drm_device *dev)
 		/* Flush any outstanding unpin_work. */
 		/* Flush any outstanding unpin_work. */
 		flush_workqueue(dev_priv->wq);
 		flush_workqueue(dev_priv->wq);
 
 
-		i915_gem_free_all_phys_object(dev);
-
 		mutex_lock(&dev->struct_mutex);
 		mutex_lock(&dev->struct_mutex);
+		i915_gem_free_all_phys_object(dev);
 		i915_gem_cleanup_ringbuffer(dev);
 		i915_gem_cleanup_ringbuffer(dev);
 		mutex_unlock(&dev->struct_mutex);
 		mutex_unlock(&dev->struct_mutex);
 		if (I915_HAS_FBC(dev) && i915_powersave)
 		if (I915_HAS_FBC(dev) && i915_powersave)

+ 5 - 0
drivers/gpu/drm/i915/intel_overlay.c

@@ -1412,6 +1412,8 @@ void intel_setup_overlay(struct drm_device *dev)
 		goto out_free;
 		goto out_free;
 	overlay->reg_bo = reg_bo;
 	overlay->reg_bo = reg_bo;
 
 
+	mutex_lock(&dev->struct_mutex);
+
 	if (OVERLAY_NEEDS_PHYSICAL(dev)) {
 	if (OVERLAY_NEEDS_PHYSICAL(dev)) {
 		ret = i915_gem_attach_phys_object(dev, reg_bo,
 		ret = i915_gem_attach_phys_object(dev, reg_bo,
 						  I915_GEM_PHYS_OVERLAY_REGS,
 						  I915_GEM_PHYS_OVERLAY_REGS,
@@ -1436,6 +1438,8 @@ void intel_setup_overlay(struct drm_device *dev)
                 }
                 }
 	}
 	}
 
 
+	mutex_unlock(&dev->struct_mutex);
+
 	/* init all values */
 	/* init all values */
 	overlay->color_key = 0x0101fe;
 	overlay->color_key = 0x0101fe;
 	overlay->brightness = -19;
 	overlay->brightness = -19;
@@ -1460,6 +1464,7 @@ out_unpin_bo:
 	i915_gem_object_unpin(reg_bo);
 	i915_gem_object_unpin(reg_bo);
 out_free_bo:
 out_free_bo:
 	drm_gem_object_unreference(&reg_bo->base);
 	drm_gem_object_unreference(&reg_bo->base);
+	mutex_unlock(&dev->struct_mutex);
 out_free:
 out_free:
 	kfree(overlay);
 	kfree(overlay);
 	return;
 	return;