diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_resource.c')
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 6fdd82d42f65..9757b57f8388 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c @@ -88,6 +88,11 @@ struct vmw_resource *vmw_resource_reference(struct vmw_resource *res)  	return res;  } +struct vmw_resource * +vmw_resource_reference_unless_doomed(struct vmw_resource *res) +{ +	return kref_get_unless_zero(&res->kref) ? res : NULL; +}  /**   * vmw_resource_release_id - release a resource id to the id manager. @@ -136,8 +141,12 @@ static void vmw_resource_release(struct kref *kref)  		vmw_dmabuf_unreference(&res->backup);  	} -	if (likely(res->hw_destroy != NULL)) +	if (likely(res->hw_destroy != NULL)) {  		res->hw_destroy(res); +		mutex_lock(&dev_priv->binding_mutex); +		vmw_context_binding_res_list_kill(&res->binding_head); +		mutex_unlock(&dev_priv->binding_mutex); +	}  	id = res->id;  	if (res->res_free != NULL) @@ -418,8 +427,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,  	INIT_LIST_HEAD(&vmw_bo->res_list);  	ret = ttm_bo_init(bdev, &vmw_bo->base, size, -			  (user) ? ttm_bo_type_device : -			  ttm_bo_type_kernel, placement, +			  ttm_bo_type_device, placement,  			  0, interruptible,  			  NULL, acc_size, NULL, bo_free);  	return ret;  | 
