drm/ttm: Fix TTM BO accounting
authorFelix Kuehling <Felix.Kuehling@amd.com>
Fri, 8 Apr 2016 01:42:17 +0000 (21:42 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 May 2016 00:20:32 +0000 (20:20 -0400)
TTM BO accounting is out of sync with how memory is really allocated
in ttm[_dma]_tt_alloc_page_directory. This resulted in excessive
estimated overhead with many small allocations.

ttm_dma_tt_alloc_page_directory makes a single allocation for three
arrays: pages, DMA and CPU addresses. It uses drm_calloc_large, which
uses kmalloc internally for allocations smaller than PAGE_SIZE.
ttm_round_pot should be a good approximation of its memory usage both
above and below PAGE_SIZE.

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/ttm/ttm_bo.c

index 4cbf26555093f3d13ed8c917a34bf7e0302bdb8b..870a87a2224e4b227367aa63532dc3741dddb13a 100644 (file)
@@ -1215,7 +1215,7 @@ size_t ttm_bo_acc_size(struct ttm_bo_device *bdev,
        size_t size = 0;
 
        size += ttm_round_pot(struct_size);
-       size += PAGE_ALIGN(npages * sizeof(void *));
+       size += ttm_round_pot(npages * sizeof(void *));
        size += ttm_round_pot(sizeof(struct ttm_tt));
        return size;
 }
@@ -1229,8 +1229,7 @@ size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev,
        size_t size = 0;
 
        size += ttm_round_pot(struct_size);
-       size += PAGE_ALIGN(npages * sizeof(void *));
-       size += PAGE_ALIGN(npages * sizeof(dma_addr_t));
+       size += ttm_round_pot(npages * (2*sizeof(void *) + sizeof(dma_addr_t)));
        size += ttm_round_pot(sizeof(struct ttm_dma_tt));
        return size;
 }