summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mm/rmap.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/mm/rmap.c b/mm/rmap.c
index 15efde4d1fc9..867db2b61573 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -2172,6 +2172,26 @@ static bool ttu_anon_swapbacked_folio(struct vm_area_struct *vma,
return true;
}
+static bool ttu_anon_folio(struct vm_area_struct *vma, struct folio *folio,
+ struct page *page, unsigned long address, pte_t *ptep,
+ pte_t pteval, unsigned long nr_pages)
+{
+ /*
+ * Store the swap location in the pte.
+ * See handle_pte_fault() ...
+ */
+ if (WARN_ON_ONCE(folio_test_swapbacked(folio) !=
+ folio_test_swapcache(folio)))
+ return false;
+
+ if (!folio_test_swapbacked(folio))
+ return ttu_anon_lazyfree_folio(vma, folio, nr_pages);
+
+ /* nr_pages > 1 not supported yet */
+ return ttu_anon_swapbacked_folio(vma, folio, page, address, ptep,
+ pteval);
+}
+
/*
* @arg: enum ttu_flags will be passed to this argument
*/
@@ -2349,31 +2369,12 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma,
*/
dec_mm_counter(mm, mm_counter(folio));
} else if (folio_test_anon(folio)) {
- /*
- * Store the swap location in the pte.
- * See handle_pte_fault() ...
- */
- if (unlikely(folio_test_swapbacked(folio) !=
- folio_test_swapcache(folio))) {
- WARN_ON_ONCE(1);
+ if (!ttu_anon_folio(vma, folio, page, address,
+ pvmw.pte, pteval, nr_pages)) {
+ set_ptes(mm, address, pvmw.pte, pteval, nr_pages);
goto walk_abort;
}
- /* MADV_FREE page check */
- if (!folio_test_swapbacked(folio)) {
- if (!ttu_anon_lazyfree_folio(vma, folio,
- nr_pages)) {
- set_ptes(mm, address, pvmw.pte, pteval, nr_pages);
- goto walk_abort;
- }
- goto finish_unmap;
- }
-
- if (!ttu_anon_swapbacked_folio(vma, folio, page, address,
- pvmw.pte, pteval)) {
- set_pte_at(mm, address, pvmw.pte, pteval);
- goto walk_abort;
- }
goto finish_unmap;
} else {
/*