On Thu, Apr 12, 2012 at 7:19 PM, Ilija Hadzic <ihadzic at research.bell-labs.com> wrote: > 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.
One problem is this introduces a ttm/drm dependency that we don't really have so far. Dave > > Patch derived from 7c5cc4f63556e351e9e5980ed22accad410e3fdc > originally authored by Dave Airlie. > > Signed-off-by: Ilija Hadzic <ihadzic at research.bell-labs.com> > --- > ?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 at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel