int migratetype, fpi_t fpi_flags)
 {
        struct capture_control *capc = task_capc(zone);
-       unsigned int max_order = pageblock_order;
        unsigned long buddy_pfn;
        unsigned long combined_pfn;
        struct page *buddy;
        VM_BUG_ON_PAGE(pfn & ((1 << order) - 1), page);
        VM_BUG_ON_PAGE(bad_range(zone, page), page);
 
-continue_merging:
-       while (order < max_order) {
+       while (order < MAX_ORDER - 1) {
                if (compaction_capture(capc, page, order, migratetype)) {
                        __mod_zone_freepage_state(zone, -(1 << order),
                                                                migratetype);
 
                if (!page_is_buddy(page, buddy, order))
                        goto done_merging;
+
+               if (unlikely(order >= pageblock_order)) {
+                       /*
+                        * We want to prevent merge between freepages on pageblock
+                        * without fallbacks and normal pageblock. Without this,
+                        * pageblock isolation could cause incorrect freepage or CMA
+                        * accounting or HIGHATOMIC accounting.
+                        */
+                       int buddy_mt = get_pageblock_migratetype(buddy);
+
+                       if (migratetype != buddy_mt
+                                       && (!migratetype_is_mergeable(migratetype) ||
+                                               !migratetype_is_mergeable(buddy_mt)))
+                               goto done_merging;
+               }
+
                /*
                 * Our buddy is free or it is CONFIG_DEBUG_PAGEALLOC guard page,
                 * merge with it and move up one order.
                pfn = combined_pfn;
                order++;
        }
-       if (order < MAX_ORDER - 1) {
-               /* If we are here, it means order is >= pageblock_order.
-                * We want to prevent merge between freepages on pageblock
-                * without fallbacks and normal pageblock. Without this,
-                * pageblock isolation could cause incorrect freepage or CMA
-                * accounting or HIGHATOMIC accounting.
-                *
-                * We don't want to hit this code for the more frequent
-                * low-order merging.
-                */
-               int buddy_mt;
-
-               buddy_pfn = __find_buddy_pfn(pfn, order);
-               buddy = page + (buddy_pfn - pfn);
-
-               if (!page_is_buddy(page, buddy, order))
-                       goto done_merging;
-               buddy_mt = get_pageblock_migratetype(buddy);
-
-               if (migratetype != buddy_mt
-                               && (!migratetype_is_mergeable(migratetype) ||
-                                       !migratetype_is_mergeable(buddy_mt)))
-                       goto done_merging;
-               max_order = order + 1;
-               goto continue_merging;
-       }
 
 done_merging:
        set_buddy_order(page, order);