drm/vmwgfx: Avoid pinning fbdev framebuffers
fbdev framebuffers were previously pinned to be able to keep them mapped across updates. This commit introduces a mechanism that instead revalidates the map on each update, keeping the map cached across updates. The cached map is torn down if the underlying pages change. Typically on buffer object moves and swapouts. This should be nicer to the system when we have resource contention. Testing done: Basic fbdev functionality under Fedora 27. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Sinclair Yeh <syeh@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Deepak Rawat <drawat@vmware.com>
This commit is contained in:
@@ -354,6 +354,7 @@ void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo)
|
||||
{
|
||||
struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo);
|
||||
|
||||
vmw_dma_buffer_unmap(vmw_bo);
|
||||
kfree(vmw_bo);
|
||||
}
|
||||
|
||||
@@ -361,6 +362,7 @@ static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo)
|
||||
{
|
||||
struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo);
|
||||
|
||||
vmw_dma_buffer_unmap(&vmw_user_bo->dma);
|
||||
ttm_prime_object_kfree(vmw_user_bo, prime);
|
||||
}
|
||||
|
||||
@@ -1239,6 +1241,12 @@ void vmw_resource_move_notify(struct ttm_buffer_object *bo,
|
||||
|
||||
dma_buf = container_of(bo, struct vmw_dma_buffer, base);
|
||||
|
||||
/*
|
||||
* Kill any cached kernel maps before move. An optimization could
|
||||
* be to do this iff source or destination memory type is VRAM.
|
||||
*/
|
||||
vmw_dma_buffer_unmap(dma_buf);
|
||||
|
||||
if (mem->mem_type != VMW_PL_MOB) {
|
||||
struct vmw_resource *res, *n;
|
||||
struct ttm_validate_buffer val_buf;
|
||||
@@ -1262,6 +1270,21 @@ void vmw_resource_move_notify(struct ttm_buffer_object *bo,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* vmw_resource_swap_notify - swapout notify callback.
|
||||
*
|
||||
* @bo: The buffer object to be swapped out.
|
||||
*/
|
||||
void vmw_resource_swap_notify(struct ttm_buffer_object *bo)
|
||||
{
|
||||
if (bo->destroy != vmw_dmabuf_bo_free &&
|
||||
bo->destroy != vmw_user_dmabuf_destroy)
|
||||
return;
|
||||
|
||||
/* Kill any cached kernel maps before swapout */
|
||||
vmw_dma_buffer_unmap(vmw_dma_buffer(bo));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* vmw_query_readback_all - Read back cached query states
|
||||
|
Reference in New Issue
Block a user