diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a2955e101715..da526905b4a5 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -509,16 +509,26 @@ static inline int page_is_buddy(struct page *page, struct page *buddy, | |||
509 | if (!pfn_valid_within(page_to_pfn(buddy))) | 509 | if (!pfn_valid_within(page_to_pfn(buddy))) |
510 | return 0; | 510 | return 0; |
511 | 511 | ||
512 | if (page_zone_id(page) != page_zone_id(buddy)) | ||
513 | return 0; | ||
514 | |||
515 | if (page_is_guard(buddy) && page_order(buddy) == order) { | 512 | if (page_is_guard(buddy) && page_order(buddy) == order) { |
516 | VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); | 513 | VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); |
514 | |||
515 | if (page_zone_id(page) != page_zone_id(buddy)) | ||
516 | return 0; | ||
517 | |||
517 | return 1; | 518 | return 1; |
518 | } | 519 | } |
519 | 520 | ||
520 | if (PageBuddy(buddy) && page_order(buddy) == order) { | 521 | if (PageBuddy(buddy) && page_order(buddy) == order) { |
521 | VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); | 522 | VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); |
523 | |||
524 | /* | ||
525 | * zone check is done late to avoid uselessly | ||
526 | * calculating zone/node ids for pages that could | ||
527 | * never merge. | ||
528 | */ | ||
529 | if (page_zone_id(page) != page_zone_id(buddy)) | ||
530 | return 0; | ||
531 | |||
522 | return 1; | 532 | return 1; |
523 | } | 533 | } |
524 | return 0; | 534 | return 0; |