|
@@ -584,19 +584,19 @@ static inline int pageblock_free(struct page *page)
|
|
|
/* Return the start of the next active pageblock after a given page */
|
|
|
static struct page *next_active_pageblock(struct page *page)
|
|
|
{
|
|
|
- int pageblocks_stride;
|
|
|
-
|
|
|
/* Ensure the starting page is pageblock-aligned */
|
|
|
BUG_ON(page_to_pfn(page) & (pageblock_nr_pages - 1));
|
|
|
|
|
|
- /* Move forward by at least 1 * pageblock_nr_pages */
|
|
|
- pageblocks_stride = 1;
|
|
|
-
|
|
|
/* If the entire pageblock is free, move to the end of free page */
|
|
|
- if (pageblock_free(page))
|
|
|
- pageblocks_stride += page_order(page) - pageblock_order;
|
|
|
+ if (pageblock_free(page)) {
|
|
|
+ int order;
|
|
|
+ /* be careful. we don't have locks, page_order can be changed.*/
|
|
|
+ order = page_order(page);
|
|
|
+ if ((order < MAX_ORDER) && (order >= pageblock_order))
|
|
|
+ return page + (1 << order);
|
|
|
+ }
|
|
|
|
|
|
- return page + (pageblocks_stride * pageblock_nr_pages);
|
|
|
+ return page + pageblock_nr_pages;
|
|
|
}
|
|
|
|
|
|
/* Checks if this range of memory is likely to be hot-removable. */
|