|
@@ -877,7 +877,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|
#endif
|
|
#endif
|
|
struct list_head plist;
|
|
struct list_head plist;
|
|
struct page *p = NULL;
|
|
struct page *p = NULL;
|
|
- unsigned count;
|
|
|
|
|
|
+ unsigned count, first;
|
|
int r;
|
|
int r;
|
|
|
|
|
|
/* No pool for cached pages */
|
|
/* No pool for cached pages */
|
|
@@ -918,6 +918,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ first = i;
|
|
while (npages) {
|
|
while (npages) {
|
|
p = alloc_page(gfp_flags);
|
|
p = alloc_page(gfp_flags);
|
|
if (!p) {
|
|
if (!p) {
|
|
@@ -925,6 +926,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|
return -ENOMEM;
|
|
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;
|
|
pages[i++] = p;
|
|
--npages;
|
|
--npages;
|
|
}
|
|
}
|