On Fri, Dec 09, 2016 at 04:52:32PM +0000, Chris Wilson wrote:
With prime, we are running into false circular dependencies based on the order in which two drivers may lock their own struct_mutex wrt to a common lock (like the reservation->lock). Work around this by adding the lock_class_key to the struct drm_driver such that each driver can have its own subclass of struct_mutex. Circular dependencies between drivers will now be ignored, but real circular dependencies on any one mutex will still be caught. A driver creating more than one device will still need to be careful!
Reported-by: Tobias Klausmann tobias.johannes.klausmann@mni.thm.de Reported-by: Hans de Goede hdegoede@redhat.com Signed-off-by: Chris Wilson chris@chris-wilson.co.uk
Where does this even happen? i915, msm and udl are the only drivers left over that do struct_mutex, and i915 can't really share buffers with msm, and udl doesn't do reservations. How exactly does this still go boom in latest upstream? -Daniel
drivers/gpu/drm/drm_drv.c | 4 +++- include/drm/drm_drv.h | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 2fa4e4fa7c33..82b521146e71 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -488,7 +488,9 @@ int drm_dev_init(struct drm_device *dev,
spin_lock_init(&dev->buf_lock); spin_lock_init(&dev->event_lock);
- mutex_init(&dev->struct_mutex);
- __mutex_init(&dev->struct_mutex,
"&dev->struct_mutex",
mutex_init(&dev->filelist_mutex); mutex_init(&dev->ctxlist_mutex); mutex_init(&dev->master_mutex);&driver->class.struct_mutex_key);
diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h index 554104ccb939..5d521923404a 100644 --- a/include/drm/drm_drv.h +++ b/include/drm/drm_drv.h @@ -39,6 +39,10 @@ struct dma_buf_attachment; struct drm_display_mode; struct drm_mode_create_dumb;
+struct drm_driver_class {
- struct lock_class_key struct_mutex_key;
+};
/* driver capabilities and requirements mask */ #define DRIVER_USE_AGP 0x1 #define DRIVER_LEGACY 0x2 @@ -64,6 +68,8 @@ struct drm_mode_create_dumb;
- structure for GEM drivers.
*/ struct drm_driver {
- struct drm_driver_class class;
- int (*load) (struct drm_device *, unsigned long flags); int (*firstopen) (struct drm_device *); int (*open) (struct drm_device *, struct drm_file *);
-- 2.11.0
Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx