The patch titled Subject: mm: add pfn_swap_entry_folio() has been added to the -mm mm-unstable branch. Its filename is mm-add-pfn_swap_entry_folio.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-add-pfn_swap_entry_folio.patch This patch will later appear in the mm-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> Subject: mm: add pfn_swap_entry_folio() Date: Thu, 11 Jan 2024 15:24:20 +0000 Patch series "mm: convert mm counter to take a folio", v3. Make sure all mm_counter() and mm_counter_file() callers have a folio, then convert mm counter functions to take a folio, which saves some compound_head() calls. This patch (of 10): Thanks to the compound_head() hidden inside PageLocked(), this saves a call to compound_head() over calling page_folio(pfn_swap_entry_to_page()) Link: https://lkml.kernel.org/r/20240111152429.3374566-1-willy@xxxxxxxxxxxxx Link: https://lkml.kernel.org/r/20240111152429.3374566-2-willy@xxxxxxxxxxxxx Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Cc: David Hildenbrand <david@xxxxxxxxxx> Cc: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/swapops.h | 13 +++++++++++++ mm/filemap.c | 2 +- mm/huge_memory.c | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) --- a/include/linux/swapops.h~mm-add-pfn_swap_entry_folio +++ a/include/linux/swapops.h @@ -468,6 +468,19 @@ static inline struct page *pfn_swap_entr return p; } +static inline struct folio *pfn_swap_entry_folio(swp_entry_t entry) +{ + struct folio *folio = pfn_folio(swp_offset_pfn(entry)); + + /* + * Any use of migration entries may only occur while the + * corresponding folio is locked + */ + BUG_ON(is_migration_entry(entry) && !folio_test_locked(folio)); + + return folio; +} + /* * A pfn swap entry is a special type of swap entry that always has a pfn stored * in the swap offset. They are used to represent unaddressable device memory --- a/mm/filemap.c~mm-add-pfn_swap_entry_folio +++ a/mm/filemap.c @@ -1354,7 +1354,7 @@ void migration_entry_wait_on_locked(swp_ unsigned long pflags; bool in_thrashing; wait_queue_head_t *q; - struct folio *folio = page_folio(pfn_swap_entry_to_page(entry)); + struct folio *folio = pfn_swap_entry_folio(entry); q = folio_waitqueue(folio); if (!folio_test_uptodate(folio) && folio_test_workingset(folio)) { --- a/mm/huge_memory.c~mm-add-pfn_swap_entry_folio +++ a/mm/huge_memory.c @@ -2035,7 +2035,7 @@ int change_huge_pmd(struct mmu_gather *t #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION if (is_swap_pmd(*pmd)) { swp_entry_t entry = pmd_to_swp_entry(*pmd); - struct folio *folio = page_folio(pfn_swap_entry_to_page(entry)); + struct folio *folio = pfn_swap_entry_folio(entry); pmd_t newpmd; VM_BUG_ON(!is_pmd_migration_entry(*pmd)); _ Patches currently in -mm which might be from willy@xxxxxxxxxxxxx are memcg-convert-mem_cgroup_move_charge_pte_range-to-use-a-folio.patch memcg-return-the-folio-in-union-mc_target.patch memcg-use-a-folio-in-get_mctgt_type.patch memcg-use-a-folio-in-get_mctgt_type_thp.patch mm-add-pfn_swap_entry_folio.patch proc-use-pfn_swap_entry_folio-where-obvious.patch mprotect-use-pfn_swap_entry_folio.patch bounds-support-non-power-of-two-config_nr_cpus.patch