drm/ttm: swap consecutive allocated pooled pages v4
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 v4: don't touch the loop variable 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> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
d4b7648d6d
Коммит
ae937fe196
|
@ -958,8 +958,15 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|||
r = ttm_page_pool_get_pages(pool, &plist, flags, cstate,
|
||||
npages - count, 0);
|
||||
|
||||
list_for_each_entry(p, &plist, lru)
|
||||
pages[count++] = p;
|
||||
first = count;
|
||||
list_for_each_entry(p, &plist, lru) {
|
||||
struct page *tmp = p;
|
||||
|
||||
/* Swap the pages if we detect consecutive order */
|
||||
if (count > first && pages[count - 1] == tmp - 1)
|
||||
swap(tmp, pages[count - 1]);
|
||||
pages[count++] = tmp;
|
||||
}
|
||||
|
||||
if (r) {
|
||||
/* If there is any pages in the list put them back to
|
||||
|
|
Загрузка…
Ссылка в новой задаче