Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/ttm: add support for different pool sizes

Correctly handle different page sizes in the memory accounting.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
d188bfa5 f9ebec52

+14 -12
+5 -5
drivers/gpu/drm/ttm/ttm_memory.c
··· 546 546 EXPORT_SYMBOL(ttm_mem_global_alloc); 547 547 548 548 int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, 549 - struct page *page) 549 + struct page *page, uint64_t size) 550 550 { 551 551 552 552 struct ttm_mem_zone *zone = NULL; ··· 563 563 if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) 564 564 zone = glob->zone_kernel; 565 565 #endif 566 - return ttm_mem_global_alloc_zone(glob, zone, PAGE_SIZE, false, false); 566 + return ttm_mem_global_alloc_zone(glob, zone, size, false, false); 567 567 } 568 568 569 - void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page) 569 + void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page, 570 + uint64_t size) 570 571 { 571 572 struct ttm_mem_zone *zone = NULL; 572 573 ··· 578 577 if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) 579 578 zone = glob->zone_kernel; 580 579 #endif 581 - ttm_mem_global_free_zone(glob, zone, PAGE_SIZE); 580 + ttm_mem_global_free_zone(glob, zone, size); 582 581 } 583 - 584 582 585 583 size_t ttm_round_pot(size_t size) 586 584 {
+3 -2
drivers/gpu/drm/ttm/ttm_page_alloc.c
··· 882 882 return -ENOMEM; 883 883 } 884 884 885 - ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i]); 885 + ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], 886 + PAGE_SIZE); 886 887 if (unlikely(ret != 0)) { 887 888 ttm_pool_unpopulate(ttm); 888 889 return -ENOMEM; ··· 910 909 for (i = 0; i < ttm->num_pages; ++i) { 911 910 if (ttm->pages[i]) { 912 911 ttm_mem_global_free_page(ttm->glob->mem_glob, 913 - ttm->pages[i]); 912 + ttm->pages[i], PAGE_SIZE); 914 913 ttm_put_pages(&ttm->pages[i], 1, 915 914 ttm->page_flags, 916 915 ttm->caching_state);
+4 -3
drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
··· 902 902 return -ENOMEM; 903 903 } 904 904 905 - ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i]); 905 + ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], 906 + pool->size); 906 907 if (unlikely(ret != 0)) { 907 908 ttm_dma_unpopulate(ttm_dma, dev); 908 909 return -ENOMEM; ··· 968 967 if (is_cached) { 969 968 list_for_each_entry_safe(d_page, next, &ttm_dma->pages_list, page_list) { 970 969 ttm_mem_global_free_page(ttm->glob->mem_glob, 971 - d_page->p); 970 + d_page->p, pool->size); 972 971 ttm_dma_page_put(pool, d_page); 973 972 } 974 973 } else { 975 974 for (i = 0; i < count; i++) { 976 975 ttm_mem_global_free_page(ttm->glob->mem_glob, 977 - ttm->pages[i]); 976 + ttm->pages[i], pool->size); 978 977 } 979 978 } 980 979
+2 -2
include/drm/ttm/ttm_memory.h
··· 150 150 extern void ttm_mem_global_free(struct ttm_mem_global *glob, 151 151 uint64_t amount); 152 152 extern int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, 153 - struct page *page); 153 + struct page *page, uint64_t size); 154 154 extern void ttm_mem_global_free_page(struct ttm_mem_global *glob, 155 - struct page *page); 155 + struct page *page, uint64_t size); 156 156 extern size_t ttm_round_pot(size_t size); 157 157 extern uint64_t ttm_get_kernel_zone_memory_size(struct ttm_mem_global *glob); 158 158 #endif