diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 8313b3e..f0685f9 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -173,7 +173,6 @@ static struct drm_ioctl_desc drm_ioctls[] = { int drm_lastclose(struct drm_device * dev) { struct drm_magic_entry *pt, *next; - struct drm_map_list *r_list, *list_t; struct drm_vma_entry *vma, *vma_temp; int i; @@ -249,11 +248,6 @@ int drm_lastclose(struct drm_device * dev) drm_ctl_free(vma, sizeof(*vma), DRM_MEM_VMAS); } - list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) { - drm_rmmap_locked(dev, r_list->map); - r_list = NULL; - } - if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) { for (i = 0; i < dev->queue_count; i++) { @@ -386,6 +380,7 @@ EXPORT_SYMBOL(drm_init); */ static void drm_cleanup(struct drm_device * dev) { + struct drm_map_list *r_list, *list_t; DRM_DEBUG("\n"); if (!dev) { @@ -417,6 +412,14 @@ static void drm_cleanup(struct drm_device * dev) dev->driver->unload(dev); drm_ht_remove(&dev->map_hash); + + mutex_lock(&dev->struct_mutex); + list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) { + drm_rmmap_locked(dev, r_list->map); + r_list = NULL; + } + mutex_unlock(&dev->struct_mutex); + if (drm_core_has_AGP(dev) && dev->agp) { drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS); dev->agp = NULL;