Skip to content

Commit d099fc8

Browse files
drm/ttm: new TT backend allocation pool v3
This replaces the spaghetti code in the two existing page pools. First of all depending on the allocation size it is between 3 (1GiB) and 5 (1MiB) times faster than the old implementation. It makes better use of buddy pages to allow for larger physical contiguous allocations which should result in better TLB utilization at least for amdgpu. Instead of a completely braindead approach of filling the pool with one CPU while another one is trying to shrink it we only give back freed pages. This also results in much less locking contention and a trylock free MM shrinker callback, so we can guarantee that pages are given back to the system when needed. Downside of this is that it takes longer for many small allocations until the pool is filled up. We could address this, but I couldn't find an use case where this actually matters. We also don't bother freeing large chunks of pages any more since the CPU overhead in that path isn't really that important. The sysfs files are replaced with a single module parameter, allowing users to override how many pages should be globally pooled in TTM. This unfortunately breaks the UAPI slightly, but as far as we know nobody ever depended on this. Zeroing memory coming from the pool was handled inconsistently. The alloc_pages() based pool was zeroing it, the dma_alloc_attr() based one wasn't. For now the new implementation isn't zeroing pages from the pool either and only sets the __GFP_ZERO flag when necessary. The implementation has only 768 lines of code compared to the over 2600 of the old one, and also allows for saving quite a bunch of code in the drivers since we don't need specialized handling there any more based on kernel config. Additional to all of that there was a neat bug with IOMMU, coherent DMA mappings and huge pages which is now fixed in the new code as well. v2: make ttm_pool_apply_caching static as reported by the kernel bot, add some more checks v3: fix some more checkpatch.pl warnings Signed-off-by: Christian König <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Madhav Chauhan <[email protected]> Tested-by: Huang Rui <[email protected]> Link: https://patchwork.freedesktop.org/patch/397080/?series=83051&rev=1
1 parent 5144eea commit d099fc8

File tree

5 files changed

+764
-1
lines changed

5 files changed

+764
-1
lines changed

drivers/gpu/drm/ttm/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
ttm-y := ttm_memory.o ttm_tt.o ttm_bo.o \
66
ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
77
ttm_execbuf_util.o ttm_page_alloc.o ttm_range_manager.o \
8-
ttm_resource.o
8+
ttm_resource.o ttm_pool.o
99
ttm-$(CONFIG_AGP) += ttm_agp_backend.o
1010
ttm-$(CONFIG_DRM_TTM_DMA_PAGE_POOL) += ttm_page_alloc_dma.o
1111

drivers/gpu/drm/ttm/ttm_memory.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <linux/module.h>
3939
#include <linux/slab.h>
4040
#include <linux/swap.h>
41+
#include <drm/ttm/ttm_pool.h>
4142

4243
#define TTM_MEMORY_ALLOC_RETRIES 4
4344

@@ -453,6 +454,7 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
453454
}
454455
ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
455456
ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
457+
ttm_pool_mgr_init(glob->zone_kernel->max_mem/(2*PAGE_SIZE));
456458
return 0;
457459
out_no_zone:
458460
ttm_mem_global_release(glob);
@@ -467,6 +469,7 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
467469
/* let the page allocator first stop the shrink work. */
468470
ttm_page_alloc_fini();
469471
ttm_dma_page_alloc_fini();
472+
ttm_pool_mgr_fini();
470473

471474
flush_workqueue(glob->swap_queue);
472475
destroy_workqueue(glob->swap_queue);

0 commit comments

Comments
 (0)