drm/ttm: simplify memory accounting for ttm user v2
Provide helper function to compute the kernel memory size needed for each buffer object. Move all the accounting inside ttm, simplifying driver and avoiding code duplication accross them. v2 fix accounting of ghost object, one would have thought that i would have run into the issue since a longtime but it seems ghost object are rare when you have plenty of vram ;) Signed-off-by: Jerome Glisse <jglisse@redhat.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
这个提交包含在:
@@ -1517,29 +1517,10 @@ out_bad_surface:
|
||||
/**
|
||||
* Buffer management.
|
||||
*/
|
||||
|
||||
static size_t vmw_dmabuf_acc_size(struct ttm_bo_global *glob,
|
||||
unsigned long num_pages)
|
||||
{
|
||||
static size_t bo_user_size = ~0;
|
||||
|
||||
size_t page_array_size =
|
||||
(num_pages * sizeof(void *) + PAGE_SIZE - 1) & PAGE_MASK;
|
||||
|
||||
if (unlikely(bo_user_size == ~0)) {
|
||||
bo_user_size = glob->ttm_bo_extra_size +
|
||||
ttm_round_pot(sizeof(struct vmw_dma_buffer));
|
||||
}
|
||||
|
||||
return bo_user_size + page_array_size;
|
||||
}
|
||||
|
||||
void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo)
|
||||
{
|
||||
struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo);
|
||||
struct ttm_bo_global *glob = bo->glob;
|
||||
|
||||
ttm_mem_global_free(glob->mem_glob, bo->acc_size);
|
||||
kfree(vmw_bo);
|
||||
}
|
||||
|
||||
@@ -1550,24 +1531,12 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
|
||||
void (*bo_free) (struct ttm_buffer_object *bo))
|
||||
{
|
||||
struct ttm_bo_device *bdev = &dev_priv->bdev;
|
||||
struct ttm_mem_global *mem_glob = bdev->glob->mem_glob;
|
||||
size_t acc_size;
|
||||
int ret;
|
||||
|
||||
BUG_ON(!bo_free);
|
||||
|
||||
acc_size =
|
||||
vmw_dmabuf_acc_size(bdev->glob,
|
||||
(size + PAGE_SIZE - 1) >> PAGE_SHIFT);
|
||||
|
||||
ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false);
|
||||
if (unlikely(ret != 0)) {
|
||||
/* we must free the bo here as
|
||||
* ttm_buffer_object_init does so as well */
|
||||
bo_free(&vmw_bo->base);
|
||||
return ret;
|
||||
}
|
||||
|
||||
acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct vmw_dma_buffer));
|
||||
memset(vmw_bo, 0, sizeof(*vmw_bo));
|
||||
|
||||
INIT_LIST_HEAD(&vmw_bo->validate_list);
|
||||
@@ -1582,9 +1551,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
|
||||
static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo)
|
||||
{
|
||||
struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo);
|
||||
struct ttm_bo_global *glob = bo->glob;
|
||||
|
||||
ttm_mem_global_free(glob->mem_glob, bo->acc_size);
|
||||
kfree(vmw_user_bo);
|
||||
}
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户