Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: add _DRM_DRIVER flag, and re-order unload.

Allow drivers to addmaps that won't be removed by lastclose or unload.
The unload needs to be re-ordered to avoid removing the hashs before
the driver has removed the final maps.

Signed-off-by: Dave Airlie <airlied@linux.ie>

+11 -8
+2 -1
drivers/char/drm/drm.h
··· 202 202 _DRM_KERNEL = 0x08, /**< kernel requires access */ 203 203 _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */ 204 204 _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */ 205 - _DRM_REMOVABLE = 0x40 /**< Removable mapping */ 205 + _DRM_REMOVABLE = 0x40, /**< Removable mapping */ 206 + _DRM_DRIVER = 0x80 /**< Managed by driver */ 206 207 }; 207 208 208 209 struct drm_ctx_priv_map {
+7 -6
drivers/char/drm/drm_drv.c
··· 200 200 } 201 201 202 202 list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) { 203 - drm_rmmap_locked(dev, r_list->map); 204 - r_list = NULL; 203 + if (!(r_list->map->flags & _DRM_DRIVER)) { 204 + drm_rmmap_locked(dev, r_list->map); 205 + r_list = NULL; 206 + } 205 207 } 206 208 207 209 if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) { ··· 293 291 294 292 drm_lastclose(dev); 295 293 296 - drm_ht_remove(&dev->map_hash); 297 - 298 - drm_ctxbitmap_cleanup(dev); 299 - 300 294 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && 301 295 dev->agp && dev->agp->agp_mtrr >= 0) { 302 296 int retval; ··· 309 311 310 312 if (dev->driver->unload) 311 313 dev->driver->unload(dev); 314 + 315 + drm_ht_remove(&dev->map_hash); 316 + drm_ctxbitmap_cleanup(dev); 312 317 313 318 drm_put_head(&dev->primary); 314 319 if (drm_put_dev(dev))
+2 -1
drivers/char/drm/i915_dma.c
··· 778 778 base = drm_get_resource_start(dev, mmio_bar); 779 779 size = drm_get_resource_len(dev, mmio_bar); 780 780 781 - ret = drm_addmap(dev, base, size, _DRM_REGISTERS, _DRM_KERNEL, 781 + ret = drm_addmap(dev, base, size, _DRM_REGISTERS, 782 + _DRM_KERNEL | _DRM_DRIVER, 782 783 &dev_priv->mmio_map); 783 784 return ret; 784 785 }