diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-04-27 03:20:18 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-04-27 04:14:17 -0400 |
commit | 40647e45b92b1da599048332ec8fbd40d8d29457 (patch) | |
tree | 03a7910a5d4ce575ec2817e7161e4b3d02213f85 /drivers/gpu | |
parent | e975eef07cbca53691f504318609bb95c7e5f1ac (diff) |
drm: Hide master MAP cleanup in drm_bufs.c
And again make sure it's a no-op for modern drivers. Another case of
dev->struct_mutex gone for modern drivers!
Note that the entirety of the legacy addmap interface is now protected
by DRIVER_MODESET. Note that just auditing kernel code is not enough,
since userspace loves to set up legacy maps on it's own for various
things - with ums userspace and kernel space share control over
resources.
v2: Also add a DRIVER_* check like for all other maps functions to
really short-circuit the code. And give drm_legacy_rmmap used by the
dev unregister code the same treatment.
v3:
- remove redundant return; (Alex, Chris)
- don't special case nouveau with DRIVER_KMS_LEGACY_CONTEXT.
v4: Again special case nouveau. The problem is not directly in the
ddx, but that it calls dri1 functions from the X server. And those do
call drmAddMap. Fixed only in
commit b1a630b48210d6a3c44994fce1b73273000ace5c
Author: Dave Airlie <airlied@redhat.com>
Date: Wed Nov 7 14:45:14 2012 +1000
nouveau: drop DRI1 device open interface.
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1461741618-12679-1-git-send-email-daniel.vetter@ffwll.ch
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_bufs.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_drv.c | 10 |
2 files changed, 23 insertions, 14 deletions
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index e8a12a4fd400..9b34158c0f77 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c | |||
@@ -542,18 +542,35 @@ int drm_legacy_rmmap_locked(struct drm_device *dev, struct drm_local_map *map) | |||
542 | } | 542 | } |
543 | EXPORT_SYMBOL(drm_legacy_rmmap_locked); | 543 | EXPORT_SYMBOL(drm_legacy_rmmap_locked); |
544 | 544 | ||
545 | int drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map) | 545 | void drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map) |
546 | { | 546 | { |
547 | int ret; | 547 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
548 | drm_core_check_feature(dev, DRIVER_MODESET)) | ||
549 | return; | ||
548 | 550 | ||
549 | mutex_lock(&dev->struct_mutex); | 551 | mutex_lock(&dev->struct_mutex); |
550 | ret = drm_legacy_rmmap_locked(dev, map); | 552 | drm_legacy_rmmap_locked(dev, map); |
551 | mutex_unlock(&dev->struct_mutex); | 553 | mutex_unlock(&dev->struct_mutex); |
552 | |||
553 | return ret; | ||
554 | } | 554 | } |
555 | EXPORT_SYMBOL(drm_legacy_rmmap); | 555 | EXPORT_SYMBOL(drm_legacy_rmmap); |
556 | 556 | ||
557 | void drm_legacy_master_rmmaps(struct drm_device *dev, struct drm_master *master) | ||
558 | { | ||
559 | struct drm_map_list *r_list, *list_temp; | ||
560 | |||
561 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
562 | return; | ||
563 | |||
564 | mutex_lock(&dev->struct_mutex); | ||
565 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) { | ||
566 | if (r_list->master == master) { | ||
567 | drm_legacy_rmmap_locked(dev, r_list->map); | ||
568 | r_list = NULL; | ||
569 | } | ||
570 | } | ||
571 | mutex_unlock(&dev->struct_mutex); | ||
572 | } | ||
573 | |||
557 | /* The rmmap ioctl appears to be unnecessary. All mappings are torn down on | 574 | /* The rmmap ioctl appears to be unnecessary. All mappings are torn down on |
558 | * the last close of the device, and this is necessary for cleanup when things | 575 | * the last close of the device, and this is necessary for cleanup when things |
559 | * exit uncleanly. Therefore, having userland manually remove mappings seems | 576 | * exit uncleanly. Therefore, having userland manually remove mappings seems |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 55273f8f3acb..e1fb52d4f72c 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -121,19 +121,11 @@ static void drm_master_destroy(struct kref *kref) | |||
121 | { | 121 | { |
122 | struct drm_master *master = container_of(kref, struct drm_master, refcount); | 122 | struct drm_master *master = container_of(kref, struct drm_master, refcount); |
123 | struct drm_device *dev = master->minor->dev; | 123 | struct drm_device *dev = master->minor->dev; |
124 | struct drm_map_list *r_list, *list_temp; | ||
125 | 124 | ||
126 | if (dev->driver->master_destroy) | 125 | if (dev->driver->master_destroy) |
127 | dev->driver->master_destroy(dev, master); | 126 | dev->driver->master_destroy(dev, master); |
128 | 127 | ||
129 | mutex_lock(&dev->struct_mutex); | 128 | drm_legacy_master_rmmaps(dev, master); |
130 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) { | ||
131 | if (r_list->master == master) { | ||
132 | drm_legacy_rmmap_locked(dev, r_list->map); | ||
133 | r_list = NULL; | ||
134 | } | ||
135 | } | ||
136 | mutex_unlock(&dev->struct_mutex); | ||
137 | 129 | ||
138 | idr_destroy(&master->magic_map); | 130 | idr_destroy(&master->magic_map); |
139 | kfree(master->unique); | 131 | kfree(master->unique); |