drm/vmwgfx: Detach backing store from its resources when it is evicted
When the backing store buffer is evicted, Issue a readback from the resources and notify the resources that they are no longer bound to a valid backing store. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Zack Rusin <zackr@vmware.com>
This commit is contained in:
parent
ddcda24e3b
commit
f468911fee
|
@ -1293,11 +1293,54 @@ void vmw_fence_single_bo(struct ttm_buffer_object *bo,
|
||||||
* @mem: The truct ttm_mem_reg indicating to what memory
|
* @mem: The truct ttm_mem_reg indicating to what memory
|
||||||
* region the move is taking place.
|
* region the move is taking place.
|
||||||
*
|
*
|
||||||
* For now does nothing.
|
* Evicts the Guest Backed hardware resource if the backup
|
||||||
|
* buffer is being moved out of MOB memory.
|
||||||
|
* Note that this function should not race with the resource
|
||||||
|
* validation code as long as it accesses only members of struct
|
||||||
|
* resource that remain static while bo::res is !NULL and
|
||||||
|
* while we have @bo reserved. struct resource::backup is *not* a
|
||||||
|
* static member. The resource validation code will take care
|
||||||
|
* to set @bo::res to NULL, while having @bo reserved when the
|
||||||
|
* buffer is no longer bound to the resource, so @bo:res can be
|
||||||
|
* used to determine whether there is a need to unbind and whether
|
||||||
|
* it is safe to unbind.
|
||||||
*/
|
*/
|
||||||
void vmw_resource_move_notify(struct ttm_buffer_object *bo,
|
void vmw_resource_move_notify(struct ttm_buffer_object *bo,
|
||||||
struct ttm_mem_reg *mem)
|
struct ttm_mem_reg *mem)
|
||||||
{
|
{
|
||||||
|
struct vmw_dma_buffer *dma_buf;
|
||||||
|
|
||||||
|
if (mem == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (bo->destroy != vmw_dmabuf_bo_free &&
|
||||||
|
bo->destroy != vmw_user_dmabuf_destroy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dma_buf = container_of(bo, struct vmw_dma_buffer, base);
|
||||||
|
|
||||||
|
if (mem->mem_type != VMW_PL_MOB) {
|
||||||
|
struct vmw_resource *res, *n;
|
||||||
|
struct ttm_bo_device *bdev = bo->bdev;
|
||||||
|
struct ttm_validate_buffer val_buf;
|
||||||
|
|
||||||
|
val_buf.bo = bo;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(res, n, &dma_buf->res_list, mob_head) {
|
||||||
|
|
||||||
|
if (unlikely(res->func->unbind == NULL))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
(void) res->func->unbind(res, true, &val_buf);
|
||||||
|
res->backup_dirty = true;
|
||||||
|
res->res_dirty = false;
|
||||||
|
list_del_init(&res->mob_head);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_lock(&bdev->fence_lock);
|
||||||
|
(void) ttm_bo_wait(bo, false, false, false);
|
||||||
|
spin_unlock(&bdev->fence_lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue