[PATCH] drm: Taint mm->mmap_sem with dev->struct_mutex for lockdep
Chris Wilson
chris at chris-wilson.co.uk
Thu Mar 3 12:43:21 UTC 2016
The DRM core depends on mm->mmap_sem being the outer lock in order to
setup/teardown and utilize fault handlers. If we taint the mm->mmap_sem
as soon as we open the device for a process, we can define this proper
ordering for lockdep and so it will report any violations early.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/drm_fops.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index aeef58ed359b..a95d588c24c8 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -246,6 +246,19 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor->index);
+ if (IS_ENABLED(CONFIG_LOCKDEP)) {
+ /* We depend upon the strict order of mmap_sem outside of
+ * struct_mutex in order for the fault handlers and their
+ * setup/teardown. Taint mmap_sem as early as possible in
+ * order to define the proper order and flag ABBA errors
+ * should the order ever be inverted.
+ */
+ down_write(¤t->mm->mmap_sem);
+ mutex_lock(&dev->struct_mutex);
+ mutex_unlock(&dev->struct_mutex);
+ up_write(¤t->mm->mmap_sem);
+ }
+
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
--
2.7.0
More information about the dri-devel
mailing list