Message ID | 20171204124612.17591-1-christian.koenig@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2017-12-04 01:46 PM, Christian König wrote: > 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> > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index c82d94cbbabc..7c4d4edce0ba 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -875,7 +875,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, > #endif > struct list_head plist; > struct page *p = NULL; > - unsigned count; > + unsigned count, first; > int r; > > /* No pool for cached pages */ > @@ -914,6 +914,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, > } > #endif > > + first = i; > while (npages) { > p = alloc_page(gfp_flags); > if (!p) { > @@ -921,6 +922,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, > return -ENOMEM; > } > > + /* Swap the pages if we detect consecutive order */ > + if (i > first && pages[i - 1] == p - 1) > + swap(p, pages[i - 1]); > + > pages[i++] = p; > --npages; > } > Both patches are Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index c82d94cbbabc..7c4d4edce0ba 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -875,7 +875,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, #endif struct list_head plist; struct page *p = NULL; - unsigned count; + unsigned count, first; int r; /* No pool for cached pages */ @@ -914,6 +914,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, } #endif + first = i; while (npages) { p = alloc_page(gfp_flags); if (!p) { @@ -921,6 +922,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, return -ENOMEM; } + /* Swap the pages if we detect consecutive order */ + if (i > first && pages[i - 1] == p - 1) + swap(p, pages[i - 1]); + pages[i++] = p; --npages; }
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> --- drivers/gpu/drm/ttm/ttm_page_alloc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)