From: Barry Song <v-songbaohua@xxxxxxxx> Add a boolean argument named any_shared. If any of the swap entries are non-exclusive, set any_shared to true. The function do_swap_page() can then utilize this information to determine whether the entire large folio can be reused. Signed-off-by: Barry Song <v-songbaohua@xxxxxxxx> --- mm/internal.h | 5 ++++- mm/madvise.c | 2 +- mm/memory.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mm/internal.h b/mm/internal.h index 9512de7398d5..ffdd1b049c77 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -216,7 +216,7 @@ static inline int folio_pte_batch(struct folio *folio, unsigned long addr, * Return: the number of table entries in the batch. */ static inline int swap_pte_batch(pte_t *start_ptep, int max_nr, - swp_entry_t entry) + swp_entry_t entry, bool *any_shared) { const pte_t *end_ptep = start_ptep + max_nr; unsigned long expected_offset = swp_offset(entry) + 1; @@ -239,6 +239,9 @@ static inline int swap_pte_batch(pte_t *start_ptep, int max_nr, swp_offset(entry) != expected_offset) break; + if (any_shared) + *any_shared |= !pte_swp_exclusive(pte); + expected_offset++; ptep++; } diff --git a/mm/madvise.c b/mm/madvise.c index bd00b83e7c50..d4624fb92665 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -672,7 +672,7 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr, entry = pte_to_swp_entry(ptent); if (!non_swap_entry(entry)) { max_nr = (end - addr) / PAGE_SIZE; - nr = swap_pte_batch(pte, max_nr, entry); + nr = swap_pte_batch(pte, max_nr, entry, NULL); nr_swap -= nr; free_swap_and_cache_nr(entry, nr); clear_not_present_full_ptes(mm, addr, pte, nr, tlb->fullmm); diff --git a/mm/memory.c b/mm/memory.c index f6377cc4c1ca..0a80e75af22c 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1632,7 +1632,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, folio_put(folio); } else if (!non_swap_entry(entry)) { max_nr = (end - addr) / PAGE_SIZE; - nr = swap_pte_batch(pte, max_nr, entry); + nr = swap_pte_batch(pte, max_nr, entry, NULL); /* Genuine swap entries, hence a private anon pages */ if (!should_zap_cows(details)) continue; -- 2.34.1