struct page *buddy;
        bool to_tail;
 
-       max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1);
+       max_order = min_t(unsigned int, MAX_ORDER - 1, pageblock_order);
 
        VM_BUG_ON(!zone_is_initialized(zone));
        VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page);
        VM_BUG_ON_PAGE(bad_range(zone, page), page);
 
 continue_merging:
-       while (order < max_order - 1) {
+       while (order < max_order) {
                if (compaction_capture(capc, page, order, migratetype)) {
                        __mod_zone_freepage_state(zone, -(1 << order),
                                                                migratetype);
                pfn = combined_pfn;
                order++;
        }
-       if (max_order < MAX_ORDER) {
+       if (order < MAX_ORDER - 1) {
                /* If we are here, it means order is >= pageblock_order.
                 * We want to prevent merge between freepages on isolate
                 * pageblock and normal pageblock. Without this, pageblock
                                                is_migrate_isolate(buddy_mt)))
                                goto done_merging;
                }
-               max_order++;
+               max_order = order + 1;
                goto continue_merging;
        }