Re: [PATCH] drm: Make each driver's struct_mutex its own subclass

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
> Reported-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>

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",
> +		     &driver->class.struct_mutex_key);
>  	mutex_init(&dev->filelist_mutex);
>  	mutex_init(&dev->ctxlist_mutex);
>  	mutex_init(&dev->master_mutex);
> 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@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux