Message ID | 20170717093500.2zckgdzsfqctgild@hirez.programming.kicks-ass.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jul 17, 2017 at 11:35 AM, Peter Zijlstra <peterz@infradead.org> wrote: > 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. We're very close to getting rid of struct_mutex, neither nouveau.ko nor i915.ko use it, and only about 4 drivers really still need it (out of about 30+). I think the minimal patch is enough, and then not initializing the mutex to prevent more users croping up again in the future. -Daniel
On Mon, Jul 17, 2017 at 05:06:42PM +0200, Daniel Vetter wrote: > On Mon, Jul 17, 2017 at 11:35 AM, Peter Zijlstra <peterz@infradead.org> wrote: > > 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. > > We're very close to getting rid of struct_mutex, neither nouveau.ko > nor i915.ko use it, and only about 4 drivers really still need it (out > of about 30+). I think the minimal patch is enough, and then not > initializing the mutex to prevent more users croping up again in the > future. Whatever you want of course. I was just going by that one paragraphy I quoted :-)
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,