aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-12-04 05:17:54 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-12-06 12:48:32 -0500
commitfdb1a2236b07948e83e0a777e1795d4f07e52c33 (patch)
tree135fdce765ebf1bb3c91fbb8590812e0d7700ddb /drivers/gpu/drm
parent5f97fc0e032594212459f63e9c6229cd79ccb697 (diff)
drm/ttm: swap consecutive allocated cached pages v3
When we detect consecutive allocation of pages swap them to avoid accidentally freeing them as huge page. v2: use swap v3: check if it's really the first allocated page Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Roger He <Hongbo.He@amd.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 116897a20514..b6f7ce286fb1 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -877,7 +877,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
877#endif 877#endif
878 struct list_head plist; 878 struct list_head plist;
879 struct page *p = NULL; 879 struct page *p = NULL;
880 unsigned count; 880 unsigned count, first;
881 int r; 881 int r;
882 882
883 /* No pool for cached pages */ 883 /* No pool for cached pages */
@@ -918,6 +918,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
918 } 918 }
919#endif 919#endif
920 920
921 first = i;
921 while (npages) { 922 while (npages) {
922 p = alloc_page(gfp_flags); 923 p = alloc_page(gfp_flags);
923 if (!p) { 924 if (!p) {
@@ -925,6 +926,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
925 return -ENOMEM; 926 return -ENOMEM;
926 } 927 }
927 928
929 /* Swap the pages if we detect consecutive order */
930 if (i > first && pages[i - 1] == p - 1)
931 swap(p, pages[i - 1]);
932
928 pages[i++] = p; 933 pages[i++] = p;
929 --npages; 934 --npages;
930 } 935 }