Make dev_mapping per-minor instead of per device. This is a preparatory patch for introducing render nodes. This will allow per-node instead of per-device mapping range, once we introduce render nodes. Patch derived from 7c5cc4f63556e351e9e5980ed22accad410e3fdc originally authored by Dave Airlie. Signed-off-by: Ilija Hadzic <ihadzic@xxxxxxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/drm_drv.c | 1 - drivers/gpu/drm/drm_fops.c | 8 ++++---- drivers/gpu/drm/drm_vm.c | 9 +++++++++ drivers/gpu/drm/i915/i915_gem.c | 7 +++---- drivers/gpu/drm/nouveau/nouveau_gem.c | 4 ++-- drivers/gpu/drm/radeon/radeon_object.c | 4 ++-- drivers/gpu/drm/radeon/radeon_ttm.c | 6 +++--- drivers/gpu/drm/ttm/ttm_bo.c | 7 ++++--- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 ++--- drivers/staging/omapdrm/omap_gem.c | 10 ++++------ include/drm/drmP.h | 3 ++- include/drm/drm_mem_util.h | 3 +++ include/drm/ttm/ttm_bo_driver.h | 3 ++- 13 files changed, 40 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index d166bd0..a4d7d44 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -236,7 +236,6 @@ int drm_lastclose(struct drm_device * dev) !drm_core_check_feature(dev, DRIVER_MODESET)) drm_dma_takedown(dev); - dev->dev_mapping = NULL; mutex_unlock(&dev->struct_mutex); DRM_DEBUG("lastclose completed\n"); diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 98cb064..4498d76 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c @@ -141,10 +141,10 @@ int drm_open(struct inode *inode, struct file *filp) } if (!retcode) { mutex_lock(&dev->struct_mutex); - if (minor->type == DRM_MINOR_LEGACY) { - if (dev->dev_mapping == NULL) - dev->dev_mapping = inode->i_mapping; - else if (dev->dev_mapping != inode->i_mapping) + if (minor->type == DRM_MINOR_LEGACY || minor->type == DRM_MINOR_RENDER) { + if (minor->dev_mapping == NULL) + minor->dev_mapping = inode->i_mapping; + else if (minor->dev_mapping != inode->i_mapping) retcode = -ENODEV; } mutex_unlock(&dev->struct_mutex); diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c index 55cd615..bcd15b0 100644 --- a/drivers/gpu/drm/drm_vm.c +++ b/drivers/gpu/drm/drm_vm.c @@ -687,3 +687,12 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) return ret; } EXPORT_SYMBOL(drm_mmap); + +void drm_unmap_mapping(struct drm_device *dev, loff_t const holebegin, + loff_t const holelen) +{ + if (dev->primary->dev_mapping) + unmap_mapping_range(dev->primary->dev_mapping, + holebegin, holelen, 1); +} +EXPORT_SYMBOL(drm_unmap_mapping); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 19a06c2..5eb0294 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1215,10 +1215,9 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj) if (!obj->fault_mappable) return; - if (obj->base.dev->dev_mapping) - unmap_mapping_range(obj->base.dev->dev_mapping, - (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT, - obj->base.size, 1); + drm_unmap_mapping(obj->base.dev, + (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT, + obj->base.size); obj->fault_mappable = false; } diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 7ce3fde..63521af 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c @@ -202,8 +202,8 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data, struct nouveau_bo *nvbo = NULL; int ret = 0; - if (unlikely(dev_priv->ttm.bdev.dev_mapping == NULL)) - dev_priv->ttm.bdev.dev_mapping = dev_priv->dev->dev_mapping; + if (unlikely(dev_priv->ttm.bdev.mapping_priv == NULL)) + dev_priv->ttm.bdev.mapping_priv = (void *)dev; if (!dev_priv->engine.vram.flags_valid(dev, req->info.tile_flags)) { NV_ERROR(dev, "bad page flags: 0x%08x\n", req->info.tile_flags); diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 342deac..837c7eb 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -115,8 +115,8 @@ int radeon_bo_create(struct radeon_device *rdev, size = ALIGN(size, PAGE_SIZE); - if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) { - rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping; + if (unlikely(rdev->mman.bdev.mapping_priv == NULL)) { + rdev->mman.bdev.mapping_priv = (void *)rdev->ddev; } if (kernel) { type = ttm_bo_type_kernel; diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index f493c64..7bedbf8 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -753,9 +753,9 @@ int radeon_ttm_init(struct radeon_device *rdev) } DRM_INFO("radeon: %uM of GTT memory ready.\n", (unsigned)(rdev->mc.gtt_size / (1024 * 1024))); - if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) { - rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping; - } + + if (unlikely(rdev->mman.bdev.mapping_priv == NULL)) + rdev->mman.bdev.mapping_priv = (void *)rdev->ddev; r = radeon_ttm_debugfs_init(rdev); if (r) { diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 7c3a57d..40bc5f6 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -38,6 +38,7 @@ #include <linux/file.h> #include <linux/module.h> #include <linux/atomic.h> +#include "drm/drm_mem_util.h" #define TTM_ASSERT_LOCKED(param) #define TTM_DEBUG(fmt, arg...) @@ -1579,7 +1580,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev, INIT_DELAYED_WORK(&bdev->wq, ttm_bo_delayed_workqueue); bdev->nice_mode = true; INIT_LIST_HEAD(&bdev->ddestroy); - bdev->dev_mapping = NULL; + bdev->mapping_priv = NULL; bdev->glob = glob; bdev->need_dma32 = need_dma32; bdev->val_seq = 0; @@ -1623,9 +1624,9 @@ void ttm_bo_unmap_virtual_locked(struct ttm_buffer_object *bo) loff_t offset = (loff_t) bo->addr_space_offset; loff_t holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT; - if (!bdev->dev_mapping) + if (!bdev->mapping_priv) return; - unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1); + drm_unmap_mapping(bdev->mapping_priv, offset, holelen); ttm_mem_io_free_vm(bo); } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 1760aba..6a4adc0 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c @@ -770,9 +770,8 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv) file_priv->driver_priv = vmw_fp; - if (unlikely(dev_priv->bdev.dev_mapping == NULL)) - dev_priv->bdev.dev_mapping = - file_priv->filp->f_path.dentry->d_inode->i_mapping; + if (unlikely(dev_priv->bdev.mapping_priv == NULL)) + dev_priv->bdev.mapping_priv = (void *)dev; return 0; diff --git a/drivers/staging/omapdrm/omap_gem.c b/drivers/staging/omapdrm/omap_gem.c index b7d6f88..22a5f39 100644 --- a/drivers/staging/omapdrm/omap_gem.c +++ b/drivers/staging/omapdrm/omap_gem.c @@ -150,13 +150,11 @@ static struct { static void evict_entry(struct drm_gem_object *obj, enum tiler_fmt fmt, struct usergart_entry *entry) { - if (obj->dev->dev_mapping) { - size_t size = PAGE_SIZE * usergart[fmt].height; - loff_t off = mmap_offset(obj) + - (entry->obj_pgoff << PAGE_SHIFT); - unmap_mapping_range(obj->dev->dev_mapping, off, size, 1); - } + size_t size = PAGE_SIZE * usergart[fmt].height; + loff_t off = mmap_offset(obj) + + (entry->obj_pgoff << PAGE_SHIFT); + drm_unmap_mapping(obj->dev, off, size); entry->obj = NULL; } diff --git a/include/drm/drmP.h b/include/drm/drmP.h index cfd921f..eeb377a 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -997,6 +997,8 @@ struct drm_minor { struct drm_master *master; /* currently active master for this node */ struct list_head master_list; struct drm_mode_group mode_group; + + struct address_space *dev_mapping; }; /* mode specified on the command line */ @@ -1152,7 +1154,6 @@ struct drm_device { unsigned int num_crtcs; /**< Number of CRTCs on this device */ void *dev_private; /**< device private data */ void *mm_private; - struct address_space *dev_mapping; struct drm_sigdata sigdata; /**< For block_all_signals */ sigset_t sigmask; diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h index 6bd325f..820afbb 100644 --- a/include/drm/drm_mem_util.h +++ b/include/drm/drm_mem_util.h @@ -62,4 +62,7 @@ static __inline void drm_free_large(void *ptr) vfree(ptr); } +struct drm_device; +extern void drm_unmap_mapping(struct drm_device *dev, loff_t const holebegin, + loff_t const holelen); #endif diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index d43e892..4a05aca 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -40,6 +40,7 @@ #include "linux/spinlock.h" struct ttm_backend; +struct drm_device; struct ttm_backend_func { /** @@ -558,7 +559,7 @@ struct ttm_bo_device { */ bool nice_mode; - struct address_space *dev_mapping; + struct drm_device *mapping_priv; /* * Internal protection. -- 1.7.8.5 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel