summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-10-12 19:28:42 +0200
committerAlex Deucher <alexander.deucher@amd.com>2017-10-19 15:27:10 -0400
commit5c42c64f7d54ba560b0b001e4e73e4a1aeed1355 (patch)
tree3625a959198e83bd0c8af90e5c92dcecf9069af3 /drivers/gpu
parentc057c11403e461185a24d7f5dc2fbd059bbd1502 (diff)
drm/ttm: fix the fix for huge compound pages
We don't use compound pages at the moment. Take this into account when freeing them. Signed-off-by: Christian König <christian.koenig@amd.comd> Reviewed-and-Tested-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 95022473704b..4d688c8d7853 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -733,22 +733,33 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
/* No pool for this memory type so free the pages */
i = 0;
while (i < npages) {
- unsigned order;
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ struct page *p = pages[i];
+#endif
+ unsigned order = 0, j;
if (!pages[i]) {
++i;
continue;
}
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ for (j = 0; j < HPAGE_PMD_NR; ++j)
+ if (p++ != pages[i + j])
+ break;
+
+ if (j == HPAGE_PMD_NR)
+ order = HPAGE_PMD_ORDER;
+#endif
+
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) {
+ j = 1 << order;
+ while (j) {
pages[i++] = NULL;
- --order;
+ --j;
}
}
return;