diff options
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/drm_gem.c | 21 | 
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 74e4ff57801..bad33596639 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -210,6 +210,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)  	idr_remove(&filp->object_idr, handle);  	spin_unlock(&filp->table_lock); +	if (dev->driver->gem_close_object) +		dev->driver->gem_close_object(obj, filp);  	drm_gem_object_handle_unreference_unlocked(obj);  	return 0; @@ -226,7 +228,8 @@ drm_gem_handle_create(struct drm_file *file_priv,  		       struct drm_gem_object *obj,  		       u32 *handlep)  { -	int	ret; +	struct drm_device *dev = obj->dev; +	int ret;  	/*  	 * Get the user-visible handle using idr. @@ -247,6 +250,15 @@ again:  		return ret;  	drm_gem_object_handle_reference(obj); + +	if (dev->driver->gem_open_object) { +		ret = dev->driver->gem_open_object(obj, file_priv); +		if (ret) { +			drm_gem_handle_delete(file_priv, *handlep); +			return ret; +		} +	} +  	return 0;  }  EXPORT_SYMBOL(drm_gem_handle_create); @@ -401,7 +413,12 @@ drm_gem_open(struct drm_device *dev, struct drm_file *file_private)  static int  drm_gem_object_release_handle(int id, void *ptr, void *data)  { +	struct drm_file *file_priv = data;  	struct drm_gem_object *obj = ptr; +	struct drm_device *dev = obj->dev; + +	if (dev->driver->gem_close_object) +		dev->driver->gem_close_object(obj, file_priv);  	drm_gem_object_handle_unreference_unlocked(obj); @@ -417,7 +434,7 @@ void  drm_gem_release(struct drm_device *dev, struct drm_file *file_private)  {  	idr_for_each(&file_private->object_idr, -		     &drm_gem_object_release_handle, NULL); +		     &drm_gem_object_release_handle, file_private);  	idr_remove_all(&file_private->object_idr);  	idr_destroy(&file_private->object_idr);  |