diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/drm_gem.c | 30 | 
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index b8db675e7fb5..a5d392f7e11f 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -170,6 +170,20 @@ void drm_gem_private_object_init(struct drm_device *dev,  EXPORT_SYMBOL(drm_gem_private_object_init);  /** + * drm_gem_private_object_fini - Finalize a failed drm_gem_object + * @obj: drm_gem_object + * + * Uninitialize an already allocated GEM object when it initialized failed + */ +void drm_gem_private_object_fini(struct drm_gem_object *obj) +{ +	WARN_ON(obj->dma_buf); + +	dma_resv_fini(&obj->_resv); +} +EXPORT_SYMBOL(drm_gem_private_object_fini); + +/**   * drm_gem_object_handle_free - release resources bound to userspace handles   * @obj: GEM object to clean up.   * @@ -930,12 +944,11 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)  void  drm_gem_object_release(struct drm_gem_object *obj)  { -	WARN_ON(obj->dma_buf); -  	if (obj->filp)  		fput(obj->filp); -	dma_resv_fini(&obj->_resv); +	drm_gem_private_object_fini(obj); +  	drm_gem_free_mmap_offset(obj);  	drm_gem_lru_remove(obj);  } @@ -1047,7 +1060,7 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,  			goto err_drm_gem_object_put;  		} -		vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP; +		vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);  		vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));  		vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);  	} @@ -1375,10 +1388,13 @@ EXPORT_SYMBOL(drm_gem_lru_move_tail);   *   * @lru: The LRU to scan   * @nr_to_scan: The number of pages to try to reclaim + * @remaining: The number of pages left to reclaim, should be initialized by caller   * @shrink: Callback to try to shrink/reclaim the object.   */  unsigned long -drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan, +drm_gem_lru_scan(struct drm_gem_lru *lru, +		 unsigned int nr_to_scan, +		 unsigned long *remaining,  		 bool (*shrink)(struct drm_gem_object *obj))  {  	struct drm_gem_lru still_in_lru; @@ -1417,8 +1433,10 @@ drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan,  		 * hit shrinker in response to trying to get backing pages  		 * for this obj (ie. while it's lock is already held)  		 */ -		if (!dma_resv_trylock(obj->resv)) +		if (!dma_resv_trylock(obj->resv)) { +			*remaining += obj->size >> PAGE_SHIFT;  			goto tail; +		}  		if (shrink(obj)) {  			freed += obj->size >> PAGE_SHIFT;  |