bool *migratable_cleared)
 {
        struct page *page = pfn_to_page(pfn);
-       struct page *head = compound_head(page);
+       struct folio *folio = page_folio(page);
        int ret = 2;    /* fallback to normal page handling */
        bool count_increased = false;
 
-       if (!PageHeadHuge(head))
+       if (!folio_test_hugetlb(folio))
                goto out;
 
        if (flags & MF_COUNT_INCREASED) {
                ret = 1;
                count_increased = true;
-       } else if (HPageFreed(head)) {
+       } else if (folio_test_hugetlb_freed(folio)) {
                ret = 0;
-       } else if (HPageMigratable(head)) {
-               ret = get_page_unless_zero(head);
+       } else if (folio_test_hugetlb_migratable(folio)) {
+               ret = folio_try_get(folio);
                if (ret)
                        count_increased = true;
        } else {
                        goto out;
        }
 
-       if (hugetlb_set_page_hwpoison(head, page)) {
+       if (hugetlb_set_page_hwpoison(&folio->page, page)) {
                ret = -EHWPOISON;
                goto out;
        }
 
        /*
-        * Clearing HPageMigratable for hwpoisoned hugepages to prevent them
+        * Clearing hugetlb_migratable for hwpoisoned hugepages to prevent them
         * from being migrated by memory hotremove.
         */
-       if (count_increased && HPageMigratable(head)) {
-               ClearHPageMigratable(head);
+       if (count_increased && folio_test_hugetlb_migratable(folio)) {
+               folio_clear_hugetlb_migratable(folio);
                *migratable_cleared = true;
        }
 
        return ret;
 out:
        if (count_increased)
-               put_page(head);
+               folio_put(folio);
        return ret;
 }