gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;
 
-/*
- * A cached value of the page's pageblock's migratetype, used when the page is
- * put on a pcplist. Used to avoid the pageblock migratetype lookup when
- * freeing from pcplists in most cases, at the cost of possibly becoming stale.
- * Also the migratetype set in the page does not necessarily match the pcplist
- * index, e.g. page might have MIGRATE_CMA set but be on a pcplist with any
- * other index - this ensures that it will be put on the correct CMA freelist.
- */
-static inline int get_pcppage_migratetype(struct page *page)
-{
-       return page->index;
-}
-
-static inline void set_pcppage_migratetype(struct page *page, int migratetype)
-{
-       page->index = migratetype;
-}
-
 #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
 unsigned int pageblock_order __read_mostly;
 #endif
 {
        unsigned long flags;
        unsigned int order;
-       bool isolated_pageblocks;
        struct page *page;
 
        /*
        pindex = pindex - 1;
 
        spin_lock_irqsave(&zone->lock, flags);
-       isolated_pageblocks = has_isolate_pageblock(zone);
 
        while (count > 0) {
                struct list_head *list;
                order = pindex_to_order(pindex);
                nr_pages = 1 << order;
                do {
+                       unsigned long pfn;
                        int mt;
 
                        page = list_last_entry(list, struct page, pcp_list);
-                       mt = get_pcppage_migratetype(page);
+                       pfn = page_to_pfn(page);
+                       mt = get_pfnblock_migratetype(page, pfn);
 
                        /* must delete to avoid corrupting pcp list */
                        list_del(&page->pcp_list);
                        count -= nr_pages;
                        pcp->count -= nr_pages;
 
-                       /* MIGRATE_ISOLATE page should not go to pcplists */
-                       VM_BUG_ON_PAGE(is_migrate_isolate(mt), page);
-                       /* Pageblock could have been isolated meanwhile */
-                       if (unlikely(isolated_pageblocks))
-                               mt = get_pageblock_migratetype(page);
-
-                       __free_one_page(page, page_to_pfn(page), zone, order, mt, FPI_NONE);
+                       __free_one_page(page, pfn, zone, order, mt, FPI_NONE);
                        trace_mm_page_pcpu_drain(page, order, mt);
                } while (count > 0 && !list_empty(list));
        }
                        continue;
                del_page_from_free_list(page, zone, current_order);
                expand(zone, page, order, current_order, migratetype);
-               set_pcppage_migratetype(page, migratetype);
                trace_mm_page_alloc_zone_locked(page, order, migratetype,
                                pcp_allowed_order(order) &&
                                migratetype < MIGRATE_PCPTYPES);
                 * pages are ordered properly.
                 */
                list_add_tail(&page->pcp_list, list);
-               if (is_migrate_cma(get_pcppage_migratetype(page)))
+               if (is_migrate_cma(get_pageblock_migratetype(page)))
                        __mod_zone_page_state(zone, NR_FREE_CMA_PAGES,
                                              -(1 << order));
        }
        __drain_all_pages(zone, false);
 }
 
-static bool free_unref_page_prepare(struct page *page, unsigned long pfn,
-                                                       unsigned int order)
-{
-       int migratetype;
-
-       if (!free_pages_prepare(page, order))
-               return false;
-
-       migratetype = get_pfnblock_migratetype(page, pfn);
-       set_pcppage_migratetype(page, migratetype);
-       return true;
-}
-
 static int nr_pcp_free(struct per_cpu_pages *pcp, int batch, int high, bool free_high)
 {
        int min_nr_free, max_nr_free;
        unsigned long pfn = page_to_pfn(page);
        int migratetype, pcpmigratetype;
 
-       if (!free_unref_page_prepare(page, pfn, order))
+       if (!free_pages_prepare(page, order))
                return;
 
        /*
         * get those areas back if necessary. Otherwise, we may have to free
         * excessively into the page allocator
         */
-       migratetype = pcpmigratetype = get_pcppage_migratetype(page);
+       migratetype = pcpmigratetype = get_pfnblock_migratetype(page, pfn);
        if (unlikely(migratetype >= MIGRATE_PCPTYPES)) {
                if (unlikely(is_migrate_isolate(migratetype))) {
                        free_one_page(page_zone(page), page, pfn, order, migratetype, FPI_NONE);
 
                if (order > 0 && folio_test_large_rmappable(folio))
                        folio_undo_large_rmappable(folio);
-               if (!free_unref_page_prepare(&folio->page, pfn, order))
+               if (!free_pages_prepare(&folio->page, order))
                        continue;
 
                /*
                 * Free isolated folios and orders not handled on the PCP
                 * directly to the allocator, see comment in free_unref_page.
                 */
-               migratetype = get_pcppage_migratetype(&folio->page);
+               migratetype = get_pfnblock_migratetype(&folio->page, pfn);
                if (!pcp_allowed_order(order) ||
                    is_migrate_isolate(migratetype)) {
                        free_one_page(folio_zone(folio), &folio->page, pfn,
        for (i = 0; i < folios->nr; i++) {
                struct folio *folio = folios->folios[i];
                struct zone *zone = folio_zone(folio);
+               unsigned long pfn = folio_pfn(folio);
                unsigned int order = (unsigned long)folio->private;
 
                folio->private = NULL;
-               migratetype = get_pcppage_migratetype(&folio->page);
+               migratetype = get_pfnblock_migratetype(&folio->page, pfn);
 
                /* Different zone requires a different pcp lock */
                if (zone != locked_zone) {
                        pcp = pcp_spin_trylock(zone->per_cpu_pageset);
                        if (unlikely(!pcp)) {
                                pcp_trylock_finish(UP_flags);
-                               free_one_page(zone, &folio->page,
-                                               folio_pfn(folio), order,
-                                               migratetype, FPI_NONE);
+                               free_one_page(zone, &folio->page, pfn,
+                                             order, migratetype, FPI_NONE);
                                locked_zone = NULL;
                                continue;
                        }
                        }
                }
                __mod_zone_freepage_state(zone, -(1 << order),
-                                         get_pcppage_migratetype(page));
+                                         get_pageblock_migratetype(page));
                spin_unlock_irqrestore(&zone->lock, flags);
        } while (check_new_pages(page, order));