mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	drm/prime: add exported buffers to current fprivs imported buffer list (v2)
If userspace attempts to import a buffer it exported on the same device, we need to return the same GEM handle for it, not a new handle pointing at the same GEM object. v2: move removals into a single fn, no need to set to NULL. (Chris Wilson) Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
		
							parent
							
								
									51ab7ba267
								
							
						
					
					
						commit
						0ff926c7d4
					
				
					 2 changed files with 27 additions and 6 deletions
				
			
		|  | @ -201,6 +201,19 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(drm_gem_object_alloc); | EXPORT_SYMBOL(drm_gem_object_alloc); | ||||||
| 
 | 
 | ||||||
|  | static void | ||||||
|  | drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp) | ||||||
|  | { | ||||||
|  | 	if (obj->import_attach) { | ||||||
|  | 		drm_prime_remove_imported_buf_handle(&filp->prime, | ||||||
|  | 				obj->import_attach->dmabuf); | ||||||
|  | 	} | ||||||
|  | 	if (obj->export_dma_buf) { | ||||||
|  | 		drm_prime_remove_imported_buf_handle(&filp->prime, | ||||||
|  | 				obj->export_dma_buf); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Removes the mapping from handle to filp for this object. |  * Removes the mapping from handle to filp for this object. | ||||||
|  */ |  */ | ||||||
|  | @ -233,9 +246,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle) | ||||||
| 	idr_remove(&filp->object_idr, handle); | 	idr_remove(&filp->object_idr, handle); | ||||||
| 	spin_unlock(&filp->table_lock); | 	spin_unlock(&filp->table_lock); | ||||||
| 
 | 
 | ||||||
| 	if (obj->import_attach) | 	drm_gem_remove_prime_handles(obj, filp); | ||||||
| 		drm_prime_remove_imported_buf_handle(&filp->prime, |  | ||||||
| 				obj->import_attach->dmabuf); |  | ||||||
| 
 | 
 | ||||||
| 	if (dev->driver->gem_close_object) | 	if (dev->driver->gem_close_object) | ||||||
| 		dev->driver->gem_close_object(obj, filp); | 		dev->driver->gem_close_object(obj, filp); | ||||||
|  | @ -530,9 +541,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) | ||||||
| 	struct drm_gem_object *obj = ptr; | 	struct drm_gem_object *obj = ptr; | ||||||
| 	struct drm_device *dev = obj->dev; | 	struct drm_device *dev = obj->dev; | ||||||
| 
 | 
 | ||||||
| 	if (obj->import_attach) | 	drm_gem_remove_prime_handles(obj, file_priv); | ||||||
| 		drm_prime_remove_imported_buf_handle(&file_priv->prime, |  | ||||||
| 				obj->import_attach->dmabuf); |  | ||||||
| 
 | 
 | ||||||
| 	if (dev->driver->gem_close_object) | 	if (dev->driver->gem_close_object) | ||||||
| 		dev->driver->gem_close_object(obj, file_priv); | 		dev->driver->gem_close_object(obj, file_priv); | ||||||
|  |  | ||||||
|  | @ -68,6 +68,7 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev, | ||||||
| { | { | ||||||
| 	struct drm_gem_object *obj; | 	struct drm_gem_object *obj; | ||||||
| 	void *buf; | 	void *buf; | ||||||
|  | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	obj = drm_gem_object_lookup(dev, file_priv, handle); | 	obj = drm_gem_object_lookup(dev, file_priv, handle); | ||||||
| 	if (!obj) | 	if (!obj) | ||||||
|  | @ -100,6 +101,17 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev, | ||||||
| 		obj->export_dma_buf = buf; | 		obj->export_dma_buf = buf; | ||||||
| 		*prime_fd = dma_buf_fd(buf, flags); | 		*prime_fd = dma_buf_fd(buf, flags); | ||||||
| 	} | 	} | ||||||
|  | 	/* if we've exported this buffer the cheat and add it to the import list
 | ||||||
|  | 	 * so we get the correct handle back | ||||||
|  | 	 */ | ||||||
|  | 	ret = drm_prime_add_imported_buf_handle(&file_priv->prime, | ||||||
|  | 			obj->export_dma_buf, handle); | ||||||
|  | 	if (ret) { | ||||||
|  | 		drm_gem_object_unreference_unlocked(obj); | ||||||
|  | 		mutex_unlock(&file_priv->prime.lock); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	mutex_unlock(&file_priv->prime.lock); | 	mutex_unlock(&file_priv->prime.lock); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Dave Airlie
						Dave Airlie