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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux