On Mon, 2010-09-27 at 21:08 +0100, Chris Wilson wrote: > Hook the GEM vm open/close ops into the generic drm vm open/close so > that the vma entries are created and destroy appropriately. > > Reported-by: Matt Mackall <mpm@xxxxxxxxxxx> > Cc: Dave Airlie <airlied@xxxxxxxxxx> > Cc: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx> > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> All signs point to this being the correct fix, but I won't have time to test it while I'm in Japan. Paul, does this work for you? > --- > drivers/gpu/drm/drm_gem.c | 9 ++++++++- > drivers/gpu/drm/drm_vm.c | 28 ++++++++++++++++++---------- > include/drm/drmP.h | 1 + > 3 files changed, 27 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c > index bf92d07..6fe2cd2 100644 > --- a/drivers/gpu/drm/drm_gem.c > +++ b/drivers/gpu/drm/drm_gem.c > @@ -528,6 +528,10 @@ void drm_gem_vm_open(struct vm_area_struct *vma) > struct drm_gem_object *obj = vma->vm_private_data; > > drm_gem_object_reference(obj); > + > + mutex_lock(&obj->dev->struct_mutex); > + drm_vm_open_locked(vma); > + mutex_unlock(&obj->dev->struct_mutex); > } > EXPORT_SYMBOL(drm_gem_vm_open); > > @@ -535,7 +539,10 @@ void drm_gem_vm_close(struct vm_area_struct *vma) > { > struct drm_gem_object *obj = vma->vm_private_data; > > - drm_gem_object_unreference_unlocked(obj); > + mutex_lock(&obj->dev->struct_mutex); > + drm_vm_close_locked(vma); > + drm_gem_object_unreference(obj); > + mutex_unlock(&obj->dev->struct_mutex); > } > EXPORT_SYMBOL(drm_gem_vm_close); > > diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c > index fda6746..5df4506 100644 > --- a/drivers/gpu/drm/drm_vm.c > +++ b/drivers/gpu/drm/drm_vm.c > @@ -433,15 +433,7 @@ static void drm_vm_open(struct vm_area_struct *vma) > mutex_unlock(&dev->struct_mutex); > } > > -/** > - * \c close method for all virtual memory types. > - * > - * \param vma virtual memory area. > - * > - * Search the \p vma private data entry in drm_device::vmalist, unlink it, and > - * free it. > - */ > -static void drm_vm_close(struct vm_area_struct *vma) > +void drm_vm_close_locked(struct vm_area_struct *vma) > { > struct drm_file *priv = vma->vm_file->private_data; > struct drm_device *dev = priv->minor->dev; > @@ -451,7 +443,6 @@ static void drm_vm_close(struct vm_area_struct *vma) > vma->vm_start, vma->vm_end - vma->vm_start); > atomic_dec(&dev->vma_count); > > - mutex_lock(&dev->struct_mutex); > list_for_each_entry_safe(pt, temp, &dev->vmalist, head) { > if (pt->vma == vma) { > list_del(&pt->head); > @@ -459,6 +450,23 @@ static void drm_vm_close(struct vm_area_struct *vma) > break; > } > } > +} > + > +/** > + * \c close method for all virtual memory types. > + * > + * \param vma virtual memory area. > + * > + * Search the \p vma private data entry in drm_device::vmalist, unlink it, and > + * free it. > + */ > +static void drm_vm_close(struct vm_area_struct *vma) > +{ > + struct drm_file *priv = vma->vm_file->private_data; > + struct drm_device *dev = priv->minor->dev; > + > + mutex_lock(&dev->struct_mutex); > + drm_vm_close_locked(vma); > mutex_unlock(&dev->struct_mutex); > } > > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index 7809d23..774e1d4 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -1175,6 +1175,7 @@ extern int drm_release(struct inode *inode, struct file *filp); > extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); > extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); > extern void drm_vm_open_locked(struct vm_area_struct *vma); > +extern void drm_vm_close_locked(struct vm_area_struct *vma); > extern resource_size_t drm_core_get_map_ofs(struct drm_local_map * map); > extern resource_size_t drm_core_get_reg_ofs(struct drm_device *dev); > extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); -- Mathematics is the supreme nostalgia of our time. _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel