]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
drm: fix leak of device mappings since multi-master changes.
authorDave Airlie <airlied@redhat.com>
Mon, 19 Jan 2009 07:17:58 +0000 (17:17 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 19 Jan 2009 07:17:58 +0000 (17:17 +1000)
Device maps now contain a link to the master that created them, so
when cleaning up the master, remove any maps that are connected to it.
Also delete any remaining maps at driver unload time.

Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_stub.c

index 5ff88d952226c70317472281c7e412022abdb431..14c7a23dc157e83cfe70f6b83ca3cb09f9550843 100644 (file)
@@ -294,6 +294,7 @@ EXPORT_SYMBOL(drm_init);
  */
 static void drm_cleanup(struct drm_device * dev)
 {
+       struct drm_map_list *r_list, *list_temp;
        DRM_DEBUG("\n");
 
        if (!dev) {
@@ -325,6 +326,9 @@ static void drm_cleanup(struct drm_device * dev)
        drm_ht_remove(&dev->map_hash);
        drm_ctxbitmap_cleanup(dev);
 
+       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
+               drm_rmmap(dev, r_list->map);
+
        if (drm_core_check_feature(dev, DRIVER_MODESET))
                drm_put_minor(&dev->control);
 
index 5ca132afa4f2e128999e319e44e31ad156e6ab74..46bb923b097c39ad6fef2c37f29e59ae0c648f42 100644 (file)
@@ -118,12 +118,20 @@ static void drm_master_destroy(struct kref *kref)
        struct drm_master *master = container_of(kref, struct drm_master, refcount);
        struct drm_magic_entry *pt, *next;
        struct drm_device *dev = master->minor->dev;
+       struct drm_map_list *r_list, *list_temp;
 
        list_del(&master->head);
 
        if (dev->driver->master_destroy)
                dev->driver->master_destroy(dev, master);
 
+       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
+               if (r_list->master == master) {
+                       drm_rmmap_locked(dev, r_list->map);
+                       r_list = NULL;
+               }
+       }
+
        if (master->unique) {
                drm_free(master->unique, master->unique_size, DRM_MEM_DRIVER);
                master->unique = NULL;