Now that we have some space left in page[1] of a large folio on 32bit, we can re-consolidate folio->_pincount. Signed-off-by: David Hildenbrand (Arm) --- include/linux/mm.h | 4 +--- include/linux/mm_types.h | 7 ++----- mm/debug.c | 5 +---- mm/internal.h | 3 +-- mm/page_alloc.c | 14 +++----------- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 1715c6ed14d4..6dd906585420 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2593,9 +2593,7 @@ static inline pud_t folio_mk_pud(const struct folio *folio, pgprot_t pgprot) static inline bool folio_has_pincount(const struct folio *folio) { - if (IS_ENABLED(CONFIG_64BIT)) - return folio_test_large(folio); - return folio_order(folio) > 1; + return folio_test_large(folio); } /** diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index e59571d2f81d..450f61cad678 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -451,11 +451,11 @@ struct folio { union { struct { /* public: */ - unsigned int _unused_2; + atomic_t _pincount; atomic_t _entire_mapcount; #ifdef CONFIG_64BIT unsigned int _unused_1; - atomic_t _pincount; + unsigned int _unused_2; #endif /* CONFIG_64BIT */ mm_id_mapcount_t _mm_id_mapcount[2]; union { @@ -482,9 +482,6 @@ struct folio { unsigned long _head_2; /* public: */ struct list_head _deferred_list; -#ifndef CONFIG_64BIT - atomic_t _pincount; -#endif /* !CONFIG_64BIT */ /* private: the union with struct page is transitional */ }; struct page __page_2; diff --git a/mm/debug.c b/mm/debug.c index bfb41ef17a5e..80e050bf29ba 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -81,10 +81,7 @@ static void __dump_folio(const struct folio *folio, const struct page *page, folio_ref_count(folio), mapcount, mapping, folio->index + idx, pfn); if (folio_test_large(folio)) { - int pincount = 0; - - if (folio_has_pincount(folio)) - pincount = atomic_read(&folio->_pincount); + int pincount = atomic_read(&folio->_pincount); pr_warn("head: order:%u mapcount:%d entire_mapcount:%d pincount:%d\n", folio_order(folio), diff --git a/mm/internal.h b/mm/internal.h index 53b20de141b9..aa1206495bc6 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -869,8 +869,7 @@ static inline void prep_compound_head(struct page *page, unsigned int order) folio->_mm_id_mapcount[1] = -1; } atomic_set(&folio->_entire_mapcount, -1); - if (IS_ENABLED(CONFIG_64BIT) || order > 1) - atomic_set(&folio->_pincount, 0); + atomic_set(&folio->_pincount, 0); if (order > 1) INIT_LIST_HEAD(&folio->_deferred_list); } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 1c09d79cade3..8ed4c73fdba4 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1125,11 +1125,9 @@ static int free_tail_page_prepare(struct page *head_page, struct page *page) bad_page(page, "nonzero entire_mapcount"); goto out; } - if (IS_ENABLED(CONFIG_64BIT)) { - if (unlikely(atomic_read(&folio->_pincount))) { - bad_page(page, "nonzero pincount"); - goto out; - } + if (unlikely(atomic_read(&folio->_pincount))) { + bad_page(page, "nonzero pincount"); + goto out; } break; case 2: @@ -1138,12 +1136,6 @@ static int free_tail_page_prepare(struct page *head_page, struct page *page) bad_page(page, "on deferred list"); goto out; } - if (!IS_ENABLED(CONFIG_64BIT)) { - if (unlikely(atomic_read(&folio->_pincount))) { - bad_page(page, "nonzero pincount"); - goto out; - } - } break; case 3: /* the third tail page: hugetlb specifics overlap ->mappings */ -- 2.43.0