Skip to content

Commit

Permalink
drm/ttm: add transparent huge page support for cached allocations v2
Browse files Browse the repository at this point in the history
Try to allocate huge pages when it makes sense.

v2: avoid compound pages for now

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
ChristianKoenigAMD authored and alexdeucher committed Oct 19, 2017
1 parent f4c8099 commit 0284f1e
Showing 1 changed file with 42 additions and 8 deletions.
50 changes: 42 additions & 8 deletions drivers/gpu/drm/ttm/ttm_page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,12 +685,24 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,

if (pool == NULL) {
/* No pool for this memory type so free the pages */
for (i = 0; i < npages; i++) {
if (pages[i]) {
if (page_count(pages[i]) != 1)
pr_err("Erroneous page count. Leaking pages.\n");
__free_page(pages[i]);
pages[i] = NULL;
i = 0;
while (i < npages) {
unsigned order;

if (!pages[i]) {
++i;
continue;
}

if (page_count(pages[i]) != 1)
pr_err("Erroneous page count. Leaking pages.\n");
order = compound_order(pages[i]);
__free_pages(pages[i], order);

order = 1 << order;
while (order) {
pages[i++] = NULL;
--order;
}
}
return;
Expand Down Expand Up @@ -740,20 +752,42 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,

/* No pool for cached pages */
if (pool == NULL) {
unsigned i, j;

if (flags & TTM_PAGE_FLAG_DMA32)
gfp_flags |= GFP_DMA32;
else
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);
if (!p) {

pr_err("Unable to allocate page\n");
return -ENOMEM;
}

pages[r] = p;
pages[i++] = p;
--npages;
}
return 0;
}
Expand Down

0 comments on commit 0284f1e

Please sign in to comment.