|
@@ -787,9 +787,8 @@ static inline void __free_one_page(struct page *page,
|
|
|
struct zone *zone, unsigned int order,
|
|
|
int migratetype)
|
|
|
{
|
|
|
- unsigned long page_idx;
|
|
|
- unsigned long combined_idx;
|
|
|
- unsigned long uninitialized_var(buddy_idx);
|
|
|
+ unsigned long combined_pfn;
|
|
|
+ unsigned long uninitialized_var(buddy_pfn);
|
|
|
struct page *buddy;
|
|
|
unsigned int max_order;
|
|
|
|
|
@@ -802,15 +801,13 @@ static inline void __free_one_page(struct page *page,
|
|
|
if (likely(!is_migrate_isolate(migratetype)))
|
|
|
__mod_zone_freepage_state(zone, 1 << order, migratetype);
|
|
|
|
|
|
- page_idx = pfn & ((1 << MAX_ORDER) - 1);
|
|
|
-
|
|
|
- VM_BUG_ON_PAGE(page_idx & ((1 << order) - 1), page);
|
|
|
+ VM_BUG_ON_PAGE(pfn & ((1 << order) - 1), page);
|
|
|
VM_BUG_ON_PAGE(bad_range(zone, page), page);
|
|
|
|
|
|
continue_merging:
|
|
|
while (order < max_order - 1) {
|
|
|
- buddy_idx = __find_buddy_index(page_idx, order);
|
|
|
- buddy = page + (buddy_idx - page_idx);
|
|
|
+ buddy_pfn = __find_buddy_pfn(pfn, order);
|
|
|
+ buddy = page + (buddy_pfn - pfn);
|
|
|
if (!page_is_buddy(page, buddy, order))
|
|
|
goto done_merging;
|
|
|
/*
|
|
@@ -824,9 +821,9 @@ continue_merging:
|
|
|
zone->free_area[order].nr_free--;
|
|
|
rmv_page_order(buddy);
|
|
|
}
|
|
|
- combined_idx = buddy_idx & page_idx;
|
|
|
- page = page + (combined_idx - page_idx);
|
|
|
- page_idx = combined_idx;
|
|
|
+ combined_pfn = buddy_pfn & pfn;
|
|
|
+ page = page + (combined_pfn - pfn);
|
|
|
+ pfn = combined_pfn;
|
|
|
order++;
|
|
|
}
|
|
|
if (max_order < MAX_ORDER) {
|
|
@@ -841,8 +838,8 @@ continue_merging:
|
|
|
if (unlikely(has_isolate_pageblock(zone))) {
|
|
|
int buddy_mt;
|
|
|
|
|
|
- buddy_idx = __find_buddy_index(page_idx, order);
|
|
|
- buddy = page + (buddy_idx - page_idx);
|
|
|
+ buddy_pfn = __find_buddy_pfn(pfn, order);
|
|
|
+ buddy = page + (buddy_pfn - pfn);
|
|
|
buddy_mt = get_pageblock_migratetype(buddy);
|
|
|
|
|
|
if (migratetype != buddy_mt
|
|
@@ -867,10 +864,10 @@ done_merging:
|
|
|
*/
|
|
|
if ((order < MAX_ORDER-2) && pfn_valid_within(page_to_pfn(buddy))) {
|
|
|
struct page *higher_page, *higher_buddy;
|
|
|
- combined_idx = buddy_idx & page_idx;
|
|
|
- higher_page = page + (combined_idx - page_idx);
|
|
|
- buddy_idx = __find_buddy_index(combined_idx, order + 1);
|
|
|
- higher_buddy = higher_page + (buddy_idx - combined_idx);
|
|
|
+ combined_pfn = buddy_pfn & pfn;
|
|
|
+ higher_page = page + (combined_pfn - pfn);
|
|
|
+ buddy_pfn = __find_buddy_pfn(combined_pfn, order + 1);
|
|
|
+ higher_buddy = higher_page + (buddy_pfn - combined_pfn);
|
|
|
if (page_is_buddy(higher_page, higher_buddy, order + 1)) {
|
|
|
list_add_tail(&page->lru,
|
|
|
&zone->free_area[order].free_list[migratetype]);
|