diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_surface.c')
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c index 00e8e27e4884..ace7ca150b03 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c @@ -683,6 +683,9 @@ static void vmw_user_surface_base_release(struct ttm_base_object **p_base)  	    container_of(base, struct vmw_user_surface, prime.base);  	struct vmw_resource *res = &user_srf->srf.res; +	if (base->shareable && res && res->backup) +		drm_gem_object_put(&res->backup->base.base); +  	*p_base = NULL;  	vmw_resource_unreference(&res);  } @@ -857,6 +860,7 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,  			goto out_unlock;  		}  		vmw_bo_reference(res->backup); +		drm_gem_object_get(&res->backup->base.base);  	}  	tmp = vmw_resource_reference(&srf->res); @@ -1513,7 +1517,6 @@ vmw_gb_surface_define_internal(struct drm_device *dev,  							&res->backup);  		if (ret == 0)  			vmw_bo_reference(res->backup); -  	}  	if (unlikely(ret != 0)) { @@ -1561,6 +1564,8 @@ vmw_gb_surface_define_internal(struct drm_device *dev,  			drm_vma_node_offset_addr(&res->backup->base.base.vma_node);  		rep->buffer_size = res->backup->base.base.size;  		rep->buffer_handle = backup_handle; +		if (user_srf->prime.base.shareable) +			drm_gem_object_get(&res->backup->base.base);  	} else {  		rep->buffer_map_handle = 0;  		rep->buffer_size = 0;  |