Commit 8ba5152a authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Dave Airlie
Browse files

drm/vmwgfx: Optimize memory footprint for DMA buffers.



Use VRAM whenever there is free space for DMA buffers,
but use system GMR memory if using VRAM would cause an eviction.

This significantly reduces the guest system memory usage for
VMs with a large amount of VRAM allocated.
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 0eaddb28
...@@ -48,6 +48,15 @@ struct ttm_placement vmw_vram_placement = { ...@@ -48,6 +48,15 @@ struct ttm_placement vmw_vram_placement = {
.busy_placement = &vram_placement_flags .busy_placement = &vram_placement_flags
}; };
struct ttm_placement vmw_vram_sys_placement = {
.fpfn = 0,
.lpfn = 0,
.num_placement = 1,
.placement = &vram_placement_flags,
.num_busy_placement = 1,
.busy_placement = &sys_placement_flags
};
struct ttm_placement vmw_vram_ne_placement = { struct ttm_placement vmw_vram_ne_placement = {
.fpfn = 0, .fpfn = 0,
.lpfn = 0, .lpfn = 0,
......
...@@ -404,6 +404,7 @@ extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); ...@@ -404,6 +404,7 @@ extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
extern struct ttm_placement vmw_vram_placement; extern struct ttm_placement vmw_vram_placement;
extern struct ttm_placement vmw_vram_ne_placement; extern struct ttm_placement vmw_vram_ne_placement;
extern struct ttm_placement vmw_vram_sys_placement;
extern struct ttm_placement vmw_sys_placement; extern struct ttm_placement vmw_sys_placement;
extern struct ttm_bo_driver vmw_bo_driver; extern struct ttm_bo_driver vmw_bo_driver;
extern int vmw_dma_quiescent(struct drm_device *dev); extern int vmw_dma_quiescent(struct drm_device *dev);
......
...@@ -487,6 +487,21 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv, ...@@ -487,6 +487,21 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv,
{ {
int ret; int ret;
if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL)
return 0;
/**
* Put BO in VRAM, only if there is space.
*/
ret = ttm_bo_validate(bo, &vmw_vram_sys_placement, true, false);
if (unlikely(ret == -ERESTARTSYS))
return ret;
/**
* Otherwise, set it up as GMR.
*/
if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL) if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL)
return 0; return 0;
...@@ -494,6 +509,10 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv, ...@@ -494,6 +509,10 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv,
if (likely(ret == 0 || ret == -ERESTARTSYS)) if (likely(ret == 0 || ret == -ERESTARTSYS))
return ret; return ret;
/**
* If that failed, try VRAM again, this time evicting
* previous contents.
*/
ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false); ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false);
return ret; return ret;
......
...@@ -872,7 +872,7 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data, ...@@ -872,7 +872,7 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data,
} }
ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, req->size, ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, req->size,
&vmw_vram_placement, true, &vmw_vram_sys_placement, true,
&vmw_user_dmabuf_destroy); &vmw_user_dmabuf_destroy);
if (unlikely(ret != 0)) if (unlikely(ret != 0))
return ret; return ret;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment