mm: wrap __find_buddy_pfn() with a necessary buddy page validation
[sfrench/cifs-2.6.git] / mm / page_isolation.c
index f67c4c70f17f66c08626f57b1999462782395eff..ff0ea6308299b20fd4eff311357b6fab14799ff9 100644 (file)
@@ -70,7 +70,6 @@ static void unset_migratetype_isolate(struct page *page, unsigned migratetype)
        unsigned long flags, nr_pages;
        bool isolated_page = false;
        unsigned int order;
-       unsigned long pfn, buddy_pfn;
        struct page *buddy;
 
        zone = page_zone(page);
@@ -89,11 +88,9 @@ static void unset_migratetype_isolate(struct page *page, unsigned migratetype)
        if (PageBuddy(page)) {
                order = buddy_order(page);
                if (order >= pageblock_order && order < MAX_ORDER - 1) {
-                       pfn = page_to_pfn(page);
-                       buddy_pfn = __find_buddy_pfn(pfn, order);
-                       buddy = page + (buddy_pfn - pfn);
-
-                       if (!is_migrate_isolate_page(buddy)) {
+                       buddy = find_buddy_page_pfn(page, page_to_pfn(page),
+                                                   order, NULL);
+                       if (buddy && !is_migrate_isolate_page(buddy)) {
                                isolated_page = !!__isolate_free_page(page, order);
                                /*
                                 * Isolating a free page in an isolated pageblock