Commit 0284f1ea authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/ttm: add transparent huge page support for cached allocations v2

Try to allocate huge pages when it makes sense.

v2: avoid compound pages for now
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f4c80991
...@@ -685,12 +685,24 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, ...@@ -685,12 +685,24 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
if (pool == NULL) { if (pool == NULL) {
/* No pool for this memory type so free the pages */ /* No pool for this memory type so free the pages */
for (i = 0; i < npages; i++) { i = 0;
if (pages[i]) { while (i < npages) {
unsigned order;
if (!pages[i]) {
++i;
continue;
}
if (page_count(pages[i]) != 1) if (page_count(pages[i]) != 1)
pr_err("Erroneous page count. Leaking pages.\n"); pr_err("Erroneous page count. Leaking pages.\n");
__free_page(pages[i]); order = compound_order(pages[i]);
pages[i] = NULL; __free_pages(pages[i], order);
order = 1 << order;
while (order) {
pages[i++] = NULL;
--order;
} }
} }
return; return;
...@@ -740,12 +752,33 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, ...@@ -740,12 +752,33 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
/* No pool for cached pages */ /* No pool for cached pages */
if (pool == NULL) { if (pool == NULL) {
unsigned i, j;
if (flags & TTM_PAGE_FLAG_DMA32) if (flags & TTM_PAGE_FLAG_DMA32)
gfp_flags |= GFP_DMA32; gfp_flags |= GFP_DMA32;
else else
gfp_flags |= GFP_HIGHUSER; gfp_flags |= GFP_HIGHUSER;
for (r = 0; r < npages; ++r) { i = 0;
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
while (npages >= HPAGE_PMD_NR) {
gfp_t huge_flags = gfp_flags;
huge_flags |= GFP_TRANSHUGE;
huge_flags &= ~__GFP_MOVABLE;
huge_flags &= ~__GFP_COMP;
p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
if (!p)
break;
for (j = 0; j < HPAGE_PMD_NR; ++j)
pages[i++] = p++;
npages -= HPAGE_PMD_NR;
}
#endif
while (npages) {
p = alloc_page(gfp_flags); p = alloc_page(gfp_flags);
if (!p) { if (!p) {
...@@ -753,7 +786,8 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, ...@@ -753,7 +786,8 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
return -ENOMEM; return -ENOMEM;
} }
pages[r] = p; pages[i++] = p;
--npages;
} }
return 0; return 0;
} }
......
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