[PATCH] drm: Don't complain too much about struct_mutex.
Peter Zijlstra
peterz at infradead.org
Mon Jul 17 09:35:00 UTC 2017
On Sat, Jul 15, 2017 at 11:53:28AM +0200, Daniel Vetter wrote:
> A more complete solution would be to do the mutex_init in the drm core
> only for legacy drivers, plus add it to each modern driver that still
> needs it, which would also give each its own lockdep key. Trying to do
> that dynamically doesn't work, because lockdep requires it's keys to
> be statically allocated.
Would something like the below work? Its not pretty, but would give each
user of drm_dev_init() its own key.
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 37b8ad3e30d8..06cc32012728 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -478,9 +478,10 @@ static void drm_fs_inode_free(struct inode *inode)
* RETURNS:
* 0 on success, or error code on failure.
*/
-int drm_dev_init(struct drm_device *dev,
- struct drm_driver *driver,
- struct device *parent)
+int __drm_dev_init(struct drm_device *dev,
+ struct drm_driver *driver,
+ struct device *parent,
+ struct lock_class_key *key)
{
int ret;
@@ -496,7 +497,7 @@ 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", 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 53b98321df9b..cda11e97024e 100644
--- a/include/drm/drm_drv.h
+++ b/include/drm/drm_drv.h
@@ -531,9 +531,17 @@ void drm_printk(const char *level, unsigned int category,
const char *format, ...);
extern unsigned int drm_debug;
-int drm_dev_init(struct drm_device *dev,
- struct drm_driver *driver,
- struct device *parent);
+int __drm_dev_init(struct drm_device *dev,
+ struct drm_driver *driver,
+ struct device *parent,
+ struct lock_class_key *key);
+
+#define drm_dev_init(_dev, _driver, _parent) \
+({ \
+ static struct lock_class_key __key; \
+ __drm_dev_init((_dev), (_driver), (_parent), &__key); \
+})
+
void drm_dev_fini(struct drm_device *dev);
struct drm_device *drm_dev_alloc(struct drm_driver *driver,
More information about the dri-devel
mailing list