diff mbox series

[3/4] mm: swap_pte_batch: add an output argument to reture if all swap entries are exclusive

Message ID 20240402073237.240995-4-21cnbao@gmail.com (mailing list archive)
State New
Headers show
Series large folios swap-in: handle refault cases first | expand

Commit Message

Barry Song April 2, 2024, 7:32 a.m. UTC
From: Barry Song <v-songbaohua@oppo.com>

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@oppo.com>
---
 mm/internal.h | 5 ++++-
 mm/madvise.c  | 2 +-
 mm/memory.c   | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)
diff mbox series

Patch

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;