From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Airlie Subject: Re: [PATCH 05/19] drm: move dev_mapping to the minor node Date: Fri, 20 Apr 2012 11:04:09 +0100 Message-ID: References: <1334254784-3200-1-git-send-email-ihadzic@research.bell-labs.com> <1334254784-3200-6-git-send-email-ihadzic@research.bell-labs.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: Received: from mail-yx0-f177.google.com (mail-yx0-f177.google.com [209.85.213.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 258109E745 for ; Fri, 20 Apr 2012 03:04:10 -0700 (PDT) Received: by yenm10 with SMTP id m10so5612684yen.36 for ; Fri, 20 Apr 2012 03:04:09 -0700 (PDT) In-Reply-To: <1334254784-3200-6-git-send-email-ihadzic@research.bell-labs.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: Ilija Hadzic Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On Thu, Apr 12, 2012 at 7:19 PM, Ilija Hadzic 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 > --- > =A0drivers/gpu/drm/drm_drv.c =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A01 - > =A0drivers/gpu/drm/drm_fops.c =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A08 ++++---- > =A0drivers/gpu/drm/drm_vm.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A09 ++++++= +++ > =A0drivers/gpu/drm/i915/i915_gem.c =A0 =A0 =A0 =A0| =A0 =A07 +++---- > =A0drivers/gpu/drm/nouveau/nouveau_gem.c =A0| =A0 =A04 ++-- > =A0drivers/gpu/drm/radeon/radeon_object.c | =A0 =A04 ++-- > =A0drivers/gpu/drm/radeon/radeon_ttm.c =A0 =A0| =A0 =A06 +++--- > =A0drivers/gpu/drm/ttm/ttm_bo.c =A0 =A0 =A0 =A0 =A0 | =A0 =A07 ++++--- > =A0drivers/gpu/drm/vmwgfx/vmwgfx_drv.c =A0 =A0| =A0 =A05 ++--- > =A0drivers/staging/omapdrm/omap_gem.c =A0 =A0 | =A0 10 ++++------ > =A0include/drm/drmP.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A03 = ++- > =A0include/drm/drm_mem_util.h =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A03 +++ > =A0include/drm/ttm/ttm_bo_driver.h =A0 =A0 =A0 =A0| =A0 =A03 ++- > =A013 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) > =A0 =A0 =A0 =A0 =A0 =A0!drm_core_check_feature(dev, DRIVER_MODESET)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0drm_dma_takedown(dev); > > - =A0 =A0 =A0 dev->dev_mapping =3D NULL; > =A0 =A0 =A0 =A0mutex_unlock(&dev->struct_mutex); > > =A0 =A0 =A0 =A0DRM_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) > =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0if (!retcode) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mutex_lock(&dev->struct_mutex); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (minor->type =3D=3D DRM_MINOR_LEGACY) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (dev->dev_mapping =3D=3D= NULL) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev->dev_ma= pping =3D inode->i_mapping; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else if (dev->dev_mapping != =3D inode->i_mapping) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (minor->type =3D=3D DRM_MINOR_LEGACY || = minor->type =3D=3D DRM_MINOR_RENDER) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (minor->dev_mapping =3D= =3D NULL) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 minor->dev_= mapping =3D inode->i_mapping; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else if (minor->dev_mapping= !=3D inode->i_mapping) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0retcode = =3D -ENODEV; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mutex_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_struc= t *vma) > =A0 =A0 =A0 =A0return ret; > =A0} > =A0EXPORT_SYMBOL(drm_mmap); > + > +void drm_unmap_mapping(struct drm_device *dev, loff_t const holebegin, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0loff_t const holelen) > +{ > + =A0 =A0 =A0 if (dev->primary->dev_mapping) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 unmap_mapping_range(dev->primary->dev_mappi= ng, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hol= ebegin, 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) > =A0 =A0 =A0 =A0if (!obj->fault_mappable) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return; > > - =A0 =A0 =A0 if (obj->base.dev->dev_mapping) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 unmap_mapping_range(obj->base.dev->dev_mapp= ing, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (lo= ff_t)obj->base.map_list.hash.key< - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 obj= ->base.size, 1); > + =A0 =A0 =A0 drm_unmap_mapping(obj->base.dev, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (loff_t)obj->base.map_l= ist.hash.key< + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 obj->base.size); > > =A0 =A0 =A0 =A0obj->fault_mappable =3D false; > =A0} > diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouv= eau/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 *d= ata, > =A0 =A0 =A0 =A0struct nouveau_bo *nvbo =3D NULL; > =A0 =A0 =A0 =A0int ret =3D 0; > > - =A0 =A0 =A0 if (unlikely(dev_priv->ttm.bdev.dev_mapping =3D=3D NULL)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_priv->ttm.bdev.dev_mapping =3D dev_priv= ->dev->dev_mapping; > + =A0 =A0 =A0 if (unlikely(dev_priv->ttm.bdev.mapping_priv =3D=3D NULL)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_priv->ttm.bdev.mapping_priv =3D (void *= )dev; > > =A0 =A0 =A0 =A0if (!dev_priv->engine.vram.flags_valid(dev, req->info.tile= _flags)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0NV_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/rad= eon/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, > > =A0 =A0 =A0 =A0size =3D ALIGN(size, PAGE_SIZE); > > - =A0 =A0 =A0 if (unlikely(rdev->mman.bdev.dev_mapping =3D=3D NULL)) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rdev->mman.bdev.dev_mapping =3D rdev->ddev-= >dev_mapping; > + =A0 =A0 =A0 if (unlikely(rdev->mman.bdev.mapping_priv =3D=3D NULL)) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rdev->mman.bdev.mapping_priv =3D (void *)rd= ev->ddev; > =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0if (kernel) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0type =3D 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) > =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0DRM_INFO("radeon: %uM of GTT memory ready.\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (unsigned)(rdev->mc.gtt_size / (1024 * 10= 24))); > - =A0 =A0 =A0 if (unlikely(rdev->mman.bdev.dev_mapping =3D=3D NULL)) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rdev->mman.bdev.dev_mapping =3D rdev->ddev-= >dev_mapping; > - =A0 =A0 =A0 } > + > + =A0 =A0 =A0 if (unlikely(rdev->mman.bdev.mapping_priv =3D=3D NULL)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rdev->mman.bdev.mapping_priv =3D (void *)rd= ev->ddev; > > =A0 =A0 =A0 =A0r =3D radeon_ttm_debugfs_init(rdev); > =A0 =A0 =A0 =A0if (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 @@ > =A0#include > =A0#include > =A0#include > +#include "drm/drm_mem_util.h" > > =A0#define TTM_ASSERT_LOCKED(param) > =A0#define TTM_DEBUG(fmt, arg...) > @@ -1579,7 +1580,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev, > =A0 =A0 =A0 =A0INIT_DELAYED_WORK(&bdev->wq, ttm_bo_delayed_workqueue); > =A0 =A0 =A0 =A0bdev->nice_mode =3D true; > =A0 =A0 =A0 =A0INIT_LIST_HEAD(&bdev->ddestroy); > - =A0 =A0 =A0 bdev->dev_mapping =3D NULL; > + =A0 =A0 =A0 bdev->mapping_priv =3D NULL; > =A0 =A0 =A0 =A0bdev->glob =3D glob; > =A0 =A0 =A0 =A0bdev->need_dma32 =3D need_dma32; > =A0 =A0 =A0 =A0bdev->val_seq =3D 0; > @@ -1623,9 +1624,9 @@ void ttm_bo_unmap_virtual_locked(struct ttm_buffer_= object *bo) > =A0 =A0 =A0 =A0loff_t offset =3D (loff_t) bo->addr_space_offset; > =A0 =A0 =A0 =A0loff_t holelen =3D ((loff_t) bo->mem.num_pages) << PAGE_SH= IFT; > > - =A0 =A0 =A0 if (!bdev->dev_mapping) > + =A0 =A0 =A0 if (!bdev->mapping_priv) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return; > - =A0 =A0 =A0 unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1); > + =A0 =A0 =A0 drm_unmap_mapping(bdev->mapping_priv, offset, holelen); > =A0 =A0 =A0 =A0ttm_mem_io_free_vm(bo); > =A0} > > 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, st= ruct drm_file *file_priv) > > =A0 =A0 =A0 =A0file_priv->driver_priv =3D vmw_fp; > > - =A0 =A0 =A0 if (unlikely(dev_priv->bdev.dev_mapping =3D=3D NULL)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_priv->bdev.dev_mapping =3D > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 file_priv->filp->f_path.den= try->d_inode->i_mapping; > + =A0 =A0 =A0 if (unlikely(dev_priv->bdev.mapping_priv =3D=3D NULL)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_priv->bdev.mapping_priv =3D (void *)dev; > > =A0 =A0 =A0 =A0return 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 { > =A0static void evict_entry(struct drm_gem_object *obj, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0enum tiler_fmt fmt, struct usergart_entry = *entry) > =A0{ > - =A0 =A0 =A0 if (obj->dev->dev_mapping) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 size_t size =3D PAGE_SIZE * usergart[fmt].h= eight; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 loff_t off =3D mmap_offset(obj) + > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (entry->obj= _pgoff << PAGE_SHIFT); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 unmap_mapping_range(obj->dev->dev_mapping, = off, size, 1); > - =A0 =A0 =A0 } > + =A0 =A0 =A0 size_t size =3D PAGE_SIZE * usergart[fmt].height; > + =A0 =A0 =A0 loff_t off =3D mmap_offset(obj) + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 (entry->obj_pgoff << PAGE_SHIFT); > > + =A0 =A0 =A0 drm_unmap_mapping(obj->dev, off, size); > =A0 =A0 =A0 =A0entry->obj =3D NULL; > =A0} > > 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 { > =A0 =A0 =A0 =A0struct drm_master *master; /* currently active master for = this node */ > =A0 =A0 =A0 =A0struct list_head master_list; > =A0 =A0 =A0 =A0struct drm_mode_group mode_group; > + > + =A0 =A0 =A0 struct address_space *dev_mapping; > =A0}; > > =A0/* mode specified on the command line */ > @@ -1152,7 +1154,6 @@ struct drm_device { > =A0 =A0 =A0 =A0unsigned int num_crtcs; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0/**< Number of CRTCs on this device */ > =A0 =A0 =A0 =A0void *dev_private; =A0 =A0 =A0 =A0 =A0 =A0 =A0/**< device = private data */ > =A0 =A0 =A0 =A0void *mm_private; > - =A0 =A0 =A0 struct address_space *dev_mapping; > =A0 =A0 =A0 =A0struct drm_sigdata sigdata; =A0 =A0 =A0 =A0/**< For block_= all_signals */ > =A0 =A0 =A0 =A0sigset_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) > =A0 =A0 =A0 =A0vfree(ptr); > =A0} > > +struct drm_device; > +extern void drm_unmap_mapping(struct drm_device *dev, loff_t const holeb= egin, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 loff_t const ho= lelen); > =A0#endif > diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_dri= ver.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 @@ > =A0#include "linux/spinlock.h" > > =A0struct ttm_backend; > +struct drm_device; > > =A0struct ttm_backend_func { > =A0 =A0 =A0 =A0/** > @@ -558,7 +559,7 @@ struct ttm_bo_device { > =A0 =A0 =A0 =A0 */ > > =A0 =A0 =A0 =A0bool nice_mode; > - =A0 =A0 =A0 struct address_space *dev_mapping; > + =A0 =A0 =A0 struct drm_device *mapping_priv; > > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * Internal protection. > -- > 1.7.8.5 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel