aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2016-04-27 03:20:18 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-04-27 04:14:17 -0400
commit40647e45b92b1da599048332ec8fbd40d8d29457 (patch)
tree03a7910a5d4ce575ec2817e7161e4b3d02213f85 /drivers/gpu/drm
parente975eef07cbca53691f504318609bb95c7e5f1ac (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/drm')
-rw-r--r--drivers/gpu/drm/drm_bufs.c27
-rw-r--r--drivers/gpu/drm/drm_drv.c10
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}
543EXPORT_SYMBOL(drm_legacy_rmmap_locked); 543EXPORT_SYMBOL(drm_legacy_rmmap_locked);
544 544
545int drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map) 545void 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}
555EXPORT_SYMBOL(drm_legacy_rmmap); 555EXPORT_SYMBOL(drm_legacy_rmmap);
556 556
557void 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);