OSDN Git Service

Merge tag 'iommu-updates-v6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[tomoyo/tomoyo-test1.git] / mm / page_alloc.c
index 986b56d..4524598 100644 (file)
@@ -284,17 +284,6 @@ const char * const migratetype_names[MIGRATE_TYPES] = {
 #endif
 };
 
-static compound_page_dtor * const compound_page_dtors[NR_COMPOUND_DTORS] = {
-       [NULL_COMPOUND_DTOR] = NULL,
-       [COMPOUND_PAGE_DTOR] = free_compound_page,
-#ifdef CONFIG_HUGETLB_PAGE
-       [HUGETLB_PAGE_DTOR] = free_huge_page,
-#endif
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-       [TRANSHUGE_PAGE_DTOR] = free_transhuge_page,
-#endif
-};
-
 int min_free_kbytes = 1024;
 int user_min_free_kbytes = -1;
 static int watermark_boost_factor __read_mostly = 15000;
@@ -583,19 +572,10 @@ static inline void free_the_page(struct page *page, unsigned int order)
  * The remaining PAGE_SIZE pages are called "tail pages". PageTail() is encoded
  * in bit 0 of page->compound_head. The rest of bits is pointer to head page.
  *
- * The first tail page's ->compound_dtor holds the offset in array of compound
- * page destructors. See compound_page_dtors.
- *
  * The first tail page's ->compound_order holds the order of allocation.
  * This usage means that zero-order pages may not be compound.
  */
 
-void free_compound_page(struct page *page)
-{
-       mem_cgroup_uncharge(page_folio(page));
-       free_the_page(page, compound_order(page));
-}
-
 void prep_compound_page(struct page *page, unsigned int order)
 {
        int i;
@@ -610,10 +590,16 @@ void prep_compound_page(struct page *page, unsigned int order)
 
 void destroy_large_folio(struct folio *folio)
 {
-       enum compound_dtor_id dtor = folio->_folio_dtor;
+       if (folio_test_hugetlb(folio)) {
+               free_huge_folio(folio);
+               return;
+       }
+
+       if (folio_test_large_rmappable(folio))
+               folio_undo_large_rmappable(folio);
 
-       VM_BUG_ON_FOLIO(dtor >= NR_COMPOUND_DTORS, folio);
-       compound_page_dtors[dtor](&folio->page);
+       mem_cgroup_uncharge(folio);
+       free_the_page(&folio->page, folio_order(folio));
 }
 
 static inline void set_buddy_order(struct page *page, unsigned int order)
@@ -1121,7 +1107,7 @@ static __always_inline bool free_pages_prepare(struct page *page,
                VM_BUG_ON_PAGE(compound && compound_order(page) != order, page);
 
                if (compound)
-                       ClearPageHasHWPoisoned(page);
+                       page[1].flags &= ~PAGE_FLAGS_SECOND;
                for (i = 1; i < (1 << order); i++) {
                        if (compound)
                                bad += free_tail_page_prepare(page, page + i);
@@ -4484,10 +4470,11 @@ struct folio *__folio_alloc(gfp_t gfp, unsigned int order, int preferred_nid,
 {
        struct page *page = __alloc_pages(gfp | __GFP_COMP, order,
                        preferred_nid, nodemask);
+       struct folio *folio = (struct folio *)page;
 
-       if (page && order > 1)
-               prep_transhuge_page(page);
-       return (struct folio *)page;
+       if (folio && order > 1)
+               folio_prep_large_rmappable(folio);
+       return folio;
 }
 EXPORT_SYMBOL(__folio_alloc);