VIRTIO_MEM_DEFAULT_OFFLINE_THRESHOLD);
 
        /*
-        * We want subblocks to span at least MAX_ORDER_NR_PAGES and
-        * pageblock_nr_pages pages. This:
-        * - Is required for now for alloc_contig_range() to work reliably -
-        *   it doesn't properly handle smaller granularity on ZONE_NORMAL.
+        * TODO: once alloc_contig_range() works reliably with pageblock
+        * granularity on ZONE_NORMAL, use pageblock_nr_pages instead.
         */
-       sb_size = max_t(uint64_t, MAX_ORDER_NR_PAGES,
-                       pageblock_nr_pages) * PAGE_SIZE;
+       sb_size = PAGE_SIZE * MAX_ORDER_NR_PAGES;
        sb_size = max_t(uint64_t, vm->device_block_size, sb_size);
 
        if (sb_size < memory_block_size_bytes() && !force_bbm) {
 
                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;
-       unsigned int max_order;
        struct page *buddy;
        bool to_tail;
 
-       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);
 
        } while (++p, --i);
 
        set_pageblock_migratetype(page, MIGRATE_CMA);
-
-       if (pageblock_order >= MAX_ORDER) {
-               i = pageblock_nr_pages;
-               p = page;
-               do {
-                       set_page_refcounted(p);
-                       __free_pages(p, MAX_ORDER - 1);
-                       p += MAX_ORDER_NR_PAGES;
-               } while (i -= MAX_ORDER_NR_PAGES);
-       } else {
-               set_page_refcounted(page);
-               __free_pages(page, pageblock_order);
-       }
+       set_page_refcounted(page);
+       __free_pages(page, pageblock_order);
 
        adjust_managed_page_count(page, pageblock_nr_pages);
        page_zone(page)->cma_pages += pageblock_nr_pages;
 /* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */
 void __init set_pageblock_order(void)
 {
-       unsigned int order;
+       unsigned int order = MAX_ORDER - 1;
 
        /* Check that pageblock_nr_pages has not already been setup */
        if (pageblock_order)
                return;
 
-       if (HPAGE_SHIFT > PAGE_SHIFT)
+       /* Don't let pageblocks exceed the maximum allocation granularity. */
+       if (HPAGE_SHIFT > PAGE_SHIFT && HUGETLB_PAGE_ORDER < order)
                order = HUGETLB_PAGE_ORDER;
-       else
-               order = MAX_ORDER - 1;
 
        /*
         * Assume the largest contiguous order of interest is a huge page.
 #ifdef CONFIG_CONTIG_ALLOC
 static unsigned long pfn_max_align_down(unsigned long pfn)
 {
-       return pfn & ~(max_t(unsigned long, MAX_ORDER_NR_PAGES,
-                            pageblock_nr_pages) - 1);
+       return ALIGN_DOWN(pfn, MAX_ORDER_NR_PAGES);
 }
 
 static unsigned long pfn_max_align_up(unsigned long pfn)
 {
-       return ALIGN(pfn, max_t(unsigned long, MAX_ORDER_NR_PAGES,
-                               pageblock_nr_pages));
+       return ALIGN(pfn, MAX_ORDER_NR_PAGES);
 }
 
 #if defined(CONFIG_DYNAMIC_DEBUG) || \