History

mm/rmap: Convert rmap_walk() to take a folio

This ripples all the way through to every calling and called function from rmap.

Matthew Wilcox (Oracle) committed 4 years ago

Commit 2f031c61 parent e05b3459 files · +80 −99Browse files

Unified · Split

9 files
  1. include/linux/ksm.h +2 −2
  2. include/linux/rmap.h +5 −6
  3. mm/damon/paddr.c +7 −8
  4. mm/folio-compat.c +0 −7
  5. mm/huge_memory.c +1 −1
  6. mm/ksm.c +6 −6
  7. mm/migrate.c +4 −6
  8. mm/page_idle.c +3 −4
  9. mm/rmap.c +52 −59
include/linux/ksm.h+2−2
@@ -51,7 +51,7 @@ static inline void ksm_exit(struct mm_struct *mm) · 50 unmodified lines
5151 struct page *ksm_might_need_to_copy(struct page *page,
5252 struct vm_area_struct *vma, unsigned long address);
5353
54−void rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc);
54+void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc);
5555 void folio_migrate_ksm(struct folio *newfolio, struct folio *folio);
5656
5757 #else /* !CONFIG_KSM */
@@ -78,7 +78,7 @@ static inline struct page *ksm_might_need_to_copy(struct page *page, · 20 unmodified lines
7878 return page;
7979 }
8080
81−static inline void rmap_walk_ksm(struct page *page,
81+static inline void rmap_walk_ksm(struct folio *folio,
8282 struct rmap_walk_control *rwc)
8383 {
8484 }
include/linux/rmap.h+5−6
@@ -266,7 +266,6 @@ void remove_migration_ptes(struct folio *src, struct folio *dst, bool locked); · 265 unmodified lines
266266 /*
267267 * Called by memory-failure.c to kill processes.
268268 */
269−struct anon_vma *page_lock_anon_vma_read(struct page *page);
270269 struct anon_vma *folio_lock_anon_vma_read(struct folio *folio);
271270 void page_unlock_anon_vma_read(struct anon_vma *anon_vma);
272271 int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma);
@@ -286,15 +285,15 @@ struct rmap_walk_control { · 13 unmodified lines
286285 * Return false if page table scanning in rmap_walk should be stopped.
287286 * Otherwise, return true.
288287 */
289− bool (*rmap_one)(struct page *page, struct vm_area_struct *vma,
288+ bool (*rmap_one)(struct folio *folio, struct vm_area_struct *vma,
290289 unsigned long addr, void *arg);
291− int (*done)(struct page *page);
292− struct anon_vma *(*anon_lock)(struct page *page);
290+ int (*done)(struct folio *folio);
291+ struct anon_vma *(*anon_lock)(struct folio *folio);
293292 bool (*invalid_vma)(struct vm_area_struct *vma, void *arg);
294293 };
295294
296−void rmap_walk(struct page *page, struct rmap_walk_control *rwc);
297−void rmap_walk_locked(struct page *page, struct rmap_walk_control *rwc);
295+void rmap_walk(struct folio *folio, struct rmap_walk_control *rwc);
296+void rmap_walk_locked(struct folio *folio, struct rmap_walk_control *rwc);
298297
299298 #else /* !CONFIG_MMU */
300299
mm/damon/paddr.c+7−8
@@ -16,10 +16,10 @@ · 15 unmodified lines
1616 #include "../internal.h"
1717 #include "prmtv-common.h"
1818
19−static bool __damon_pa_mkold(struct page *page, struct vm_area_struct *vma,
19+static bool __damon_pa_mkold(struct folio *folio, struct vm_area_struct *vma,
2020 unsigned long addr, void *arg)
2121 {
22− DEFINE_PAGE_VMA_WALK(pvmw, page, vma, addr, 0);
22+ DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, addr, 0);
2323
2424 while (page_vma_mapped_walk(&pvmw)) {
2525 addr = pvmw.address;
@@ -37,7 +37,7 @@ static void damon_pa_mkold(unsigned long paddr) · 11 unmodified lines
3737 struct page *page = damon_get_page(PHYS_PFN(paddr));
3838 struct rmap_walk_control rwc = {
3939 .rmap_one = __damon_pa_mkold,
40− .anon_lock = page_lock_anon_vma_read,
40+ .anon_lock = folio_lock_anon_vma_read,
4141 };
4242 bool need_lock;
4343
@@ -54,7 +54,7 @@ static void damon_pa_mkold(unsigned long paddr) · 10 unmodified lines
5454 if (need_lock && !folio_trylock(folio))
5555 goto out;
5656
57− rmap_walk(&folio->page, &rwc);
57+ rmap_walk(folio, &rwc);
5858
5959 if (need_lock)
6060 folio_unlock(folio);
@@ -87,10 +87,9 @@ struct damon_pa_access_chk_result { · 26 unmodified lines
8787 bool accessed;
8888 };
8989
90−static bool __damon_pa_young(struct page *page, struct vm_area_struct *vma,
90+static bool __damon_pa_young(struct folio *folio, struct vm_area_struct *vma,
9191 unsigned long addr, void *arg)
9292 {
93− struct folio *folio = page_folio(page);
9493 struct damon_pa_access_chk_result *result = arg;
9594 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, addr, 0);
9695
@@ -133,7 +132,7 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *page_sz) · 36 unmodified lines
133132 struct rmap_walk_control rwc = {
134133 .arg = &result,
135134 .rmap_one = __damon_pa_young,
136− .anon_lock = page_lock_anon_vma_read,
135+ .anon_lock = folio_lock_anon_vma_read,
137136 };
138137 bool need_lock;
139138
@@ -156,7 +155,7 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *page_sz) · 16 unmodified lines
156155 return NULL;
157156 }
158157
159− rmap_walk(&folio->page, &rwc);
158+ rmap_walk(folio, &rwc);
160159
161160 if (need_lock)
162161 folio_unlock(folio);
mm/folio-compat.c+0−7
@@ -164,10 +164,3 @@ void putback_lru_page(struct page *page) · 163 unmodified lines
164164 {
165165 folio_putback_lru(page_folio(page));
166166 }
167−
168−#ifdef CONFIG_MMU
169−struct anon_vma *page_lock_anon_vma_read(struct page *page)
170−{
171− return folio_lock_anon_vma_read(page_folio(page));
172−}
173−#endif
mm/huge_memory.c+1−1
@@ -2572,7 +2572,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list) · 2571 unmodified lines
25722572 * The caller does not necessarily hold an mmap_lock that would
25732573 * prevent the anon_vma disappearing so we first we take a
25742574 * reference to it and then lock the anon_vma for write. This
2575− * is similar to page_lock_anon_vma_read except the write lock
2575+ * is similar to folio_lock_anon_vma_read except the write lock
25762576 * is taken to serialise against parallel split or collapse
25772577 * operations.
25782578 */
mm/ksm.c+6−6
@@ -2588,21 +2588,21 @@ struct page *ksm_might_need_to_copy(struct page *page, · 2587 unmodified lines
25882588 return new_page;
25892589 }
25902590
2591−void rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc)
2591+void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc)
25922592 {
25932593 struct stable_node *stable_node;
25942594 struct rmap_item *rmap_item;
25952595 int search_new_forks = 0;
25962596
2597− VM_BUG_ON_PAGE(!PageKsm(page), page);
2597+ VM_BUG_ON_FOLIO(!folio_test_ksm(folio), folio);
25982598
25992599 /*
26002600 * Rely on the page lock to protect against concurrent modifications
26012601 * to that page's node of the stable tree.
26022602 */
2603− VM_BUG_ON_PAGE(!PageLocked(page), page);
2603+ VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
26042604
2605− stable_node = page_stable_node(page);
2605+ stable_node = folio_stable_node(folio);
26062606 if (!stable_node)
26072607 return;
26082608 again:
@@ -2637,11 +2637,11 @@ again: · 28 unmodified lines
26372637 if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))
26382638 continue;
26392639
2640− if (!rwc->rmap_one(page, vma, addr, rwc->arg)) {
2640+ if (!rwc->rmap_one(folio, vma, addr, rwc->arg)) {
26412641 anon_vma_unlock_read(anon_vma);
26422642 return;
26432643 }
2644− if (rwc->done && rwc->done(page)) {
2644+ if (rwc->done && rwc->done(folio)) {
26452645 anon_vma_unlock_read(anon_vma);
26462646 return;
26472647 }
mm/migrate.c+4−6
@@ -171,13 +171,11 @@ void putback_movable_pages(struct list_head *l) · 170 unmodified lines
171171 /*
172172 * Restore a potential migration pte to a working pte entry
173173 */
174−static bool remove_migration_pte(struct page *page, struct vm_area_struct *vma,
175− unsigned long addr, void *old)
174+static bool remove_migration_pte(struct folio *folio,
175+ struct vm_area_struct *vma, unsigned long addr, void *old)
176176 {
177− struct folio *folio = page_folio(page);
178177 DEFINE_FOLIO_VMA_WALK(pvmw, old, vma, addr, PVMW_SYNC | PVMW_MIGRATION);
179178
180− VM_BUG_ON_PAGE(PageTail(page), page);
181179 while (page_vma_mapped_walk(&pvmw)) {
182180 pte_t pte;
183181 swp_entry_t entry;
@@ -269,9 +267,9 @@ void remove_migration_ptes(struct folio *src, struct folio *dst, bool locked) · 85 unmodified lines
269267 };
270268
271269 if (locked)
272− rmap_walk_locked(&dst->page, &rwc);
270+ rmap_walk_locked(dst, &rwc);
273271 else
274− rmap_walk(&dst->page, &rwc);
272+ rmap_walk(dst, &rwc);
275273 }
276274
277275 /*
mm/page_idle.c+3−4
@@ -46,11 +46,10 @@ static struct page *page_idle_get_page(unsigned long pfn) · 45 unmodified lines
4646 return page;
4747 }
4848
49−static bool page_idle_clear_pte_refs_one(struct page *page,
49+static bool page_idle_clear_pte_refs_one(struct folio *folio,
5050 struct vm_area_struct *vma,
5151 unsigned long addr, void *arg)
5252 {
53− struct folio *folio = page_folio(page);
5453 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, addr, 0);
5554 bool referenced = false;
5655
@@ -93,7 +92,7 @@ static void page_idle_clear_pte_refs(struct page *page) · 36 unmodified lines
9392 */
9493 static const struct rmap_walk_control rwc = {
9594 .rmap_one = page_idle_clear_pte_refs_one,
96− .anon_lock = page_lock_anon_vma_read,
95+ .anon_lock = folio_lock_anon_vma_read,
9796 };
9897 bool need_lock;
9998
@@ -104,7 +103,7 @@ static void page_idle_clear_pte_refs(struct page *page) · 4 unmodified lines
104103 if (need_lock && !folio_trylock(folio))
105104 return;
106105
107− rmap_walk(&folio->page, (struct rmap_walk_control *)&rwc);
106+ rmap_walk(folio, (struct rmap_walk_control *)&rwc);
108107
109108 if (need_lock)
110109 folio_unlock(folio);
mm/rmap.c+52−59
@@ -107,15 +107,15 @@ static inline void anon_vma_free(struct anon_vma *anon_vma) · 106 unmodified lines
107107 VM_BUG_ON(atomic_read(&anon_vma->refcount));
108108
109109 /*
110− * Synchronize against page_lock_anon_vma_read() such that
110+ * Synchronize against folio_lock_anon_vma_read() such that
111111 * we can safely hold the lock without the anon_vma getting
112112 * freed.
113113 *
114114 * Relies on the full mb implied by the atomic_dec_and_test() from
115115 * put_anon_vma() against the acquire barrier implied by
116− * down_read_trylock() from page_lock_anon_vma_read(). This orders:
116+ * down_read_trylock() from folio_lock_anon_vma_read(). This orders:
117117 *
118− * page_lock_anon_vma_read() VS put_anon_vma()
118+ * folio_lock_anon_vma_read() VS put_anon_vma()
119119 * down_read_trylock() atomic_dec_and_test()
120120 * LOCK MB
121121 * atomic_read() rwsem_is_locked()
@@ -168,7 +168,7 @@ static void anon_vma_chain_link(struct vm_area_struct *vma, · 46 unmodified lines
168168 * allocate a new one.
169169 *
170170 * Anon-vma allocations are very subtle, because we may have
171− * optimistically looked up an anon_vma in page_lock_anon_vma_read()
171+ * optimistically looked up an anon_vma in folio_lock_anon_vma_read()
172172 * and that may actually touch the rwsem even in the newly
173173 * allocated vma (it depends on RCU to make sure that the
174174 * anon_vma isn't actually destroyed).
@@ -799,10 +799,9 @@ struct folio_referenced_arg { · 624 unmodified lines
799799 /*
800800 * arg: folio_referenced_arg will be passed
801801 */
802−static bool folio_referenced_one(struct page *page, struct vm_area_struct *vma,
803− unsigned long address, void *arg)
802+static bool folio_referenced_one(struct folio *folio,
803+ struct vm_area_struct *vma, unsigned long address, void *arg)
804804 {
805− struct folio *folio = page_folio(page);
806805 struct folio_referenced_arg *pra = arg;
807806 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0);
808807 int referenced = 0;
@@ -894,7 +893,7 @@ int folio_referenced(struct folio *folio, int is_locked, · 85 unmodified lines
894893 struct rmap_walk_control rwc = {
895894 .rmap_one = folio_referenced_one,
896895 .arg = (void *)&pra,
897− .anon_lock = page_lock_anon_vma_read,
896+ .anon_lock = folio_lock_anon_vma_read,
898897 };
899898
900899 *vm_flags = 0;
@@ -919,7 +918,7 @@ int folio_referenced(struct folio *folio, int is_locked, · 18 unmodified lines
919918 rwc.invalid_vma = invalid_folio_referenced_vma;
920919 }
921920
922− rmap_walk(&folio->page, &rwc);
921+ rmap_walk(folio, &rwc);
923922 *vm_flags = pra.vm_flags;
924923
925924 if (we_locked)
@@ -928,10 +927,9 @@ int folio_referenced(struct folio *folio, int is_locked, · 2 unmodified lines
928927 return pra.referenced;
929928 }
930929
931−static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma,
930+static bool page_mkclean_one(struct folio *folio, struct vm_area_struct *vma,
932931 unsigned long address, void *arg)
933932 {
934− struct folio *folio = page_folio(page);
935933 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, PVMW_SYNC);
936934 struct mmu_notifier_range range;
937935 int *cleaned = arg;
@@ -1025,7 +1023,7 @@ int folio_mkclean(struct folio *folio) · 87 unmodified lines
10251023 if (!mapping)
10261024 return 0;
10271025
1028− rmap_walk(&folio->page, &rwc);
1026+ rmap_walk(folio, &rwc);
10291027
10301028 return cleaned;
10311029 }
@@ -1410,10 +1408,9 @@ out: · 378 unmodified lines
14101408 /*
14111409 * @arg: enum ttu_flags will be passed to this argument
14121410 */
1413−static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
1411+static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma,
14141412 unsigned long address, void *arg)
14151413 {
1416− struct folio *folio = page_folio(page);
14171414 struct mm_struct *mm = vma->vm_mm;
14181415 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0);
14191416 pte_t pteval;
@@ -1667,9 +1664,9 @@ static bool invalid_migration_vma(struct vm_area_struct *vma, void *arg) · 247 unmodified lines
16671664 return vma_is_temporary_stack(vma);
16681665 }
16691666
1670−static int page_not_mapped(struct page *page)
1667+static int page_not_mapped(struct folio *folio)
16711668 {
1672− return !page_mapped(page);
1669+ return !folio_mapped(folio);
16731670 }
16741671
16751672 /**
@@ -1689,13 +1686,13 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) · 13 unmodified lines
16891686 .rmap_one = try_to_unmap_one,
16901687 .arg = (void *)flags,
16911688 .done = page_not_mapped,
1692− .anon_lock = page_lock_anon_vma_read,
1689+ .anon_lock = folio_lock_anon_vma_read,
16931690 };
16941691
16951692 if (flags & TTU_RMAP_LOCKED)
1696− rmap_walk_locked(&folio->page, &rwc);
1693+ rmap_walk_locked(folio, &rwc);
16971694 else
1698− rmap_walk(&folio->page, &rwc);
1695+ rmap_walk(folio, &rwc);
16991696 }
17001697
17011698 /*
@@ -1704,10 +1701,9 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) · 2 unmodified lines
17041701 * If TTU_SPLIT_HUGE_PMD is specified any PMD mappings will be split into PTEs
17051702 * containing migration entries.
17061703 */
1707−static bool try_to_migrate_one(struct page *page, struct vm_area_struct *vma,
1704+static bool try_to_migrate_one(struct folio *folio, struct vm_area_struct *vma,
17081705 unsigned long address, void *arg)
17091706 {
1710− struct folio *folio = page_folio(page);
17111707 struct mm_struct *mm = vma->vm_mm;
17121708 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0);
17131709 pte_t pteval;
@@ -1951,7 +1947,7 @@ void try_to_migrate(struct folio *folio, enum ttu_flags flags) · 237 unmodified lines
19511947 .rmap_one = try_to_migrate_one,
19521948 .arg = (void *)flags,
19531949 .done = page_not_mapped,
1954− .anon_lock = page_lock_anon_vma_read,
1950+ .anon_lock = folio_lock_anon_vma_read,
19551951 };
19561952
19571953 /*
@@ -1977,9 +1973,9 @@ void try_to_migrate(struct folio *folio, enum ttu_flags flags) · 19 unmodified lines
19771973 rwc.invalid_vma = invalid_migration_vma;
19781974
19791975 if (flags & TTU_RMAP_LOCKED)
1980− rmap_walk_locked(&folio->page, &rwc);
1976+ rmap_walk_locked(folio, &rwc);
19811977 else
1982− rmap_walk(&folio->page, &rwc);
1978+ rmap_walk(folio, &rwc);
19831979 }
19841980
19851981 #ifdef CONFIG_DEVICE_PRIVATE
@@ -1990,10 +1986,9 @@ struct make_exclusive_args { · 4 unmodified lines
19901986 bool valid;
19911987 };
19921988
1993−static bool page_make_device_exclusive_one(struct page *page,
1989+static bool page_make_device_exclusive_one(struct folio *folio,
19941990 struct vm_area_struct *vma, unsigned long address, void *priv)
19951991 {
1996− struct folio *folio = page_folio(page);
19971992 struct mm_struct *mm = vma->vm_mm;
19981993 DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0);
19991994 struct make_exclusive_args *args = priv;
@@ -2098,7 +2093,7 @@ static bool folio_make_device_exclusive(struct folio *folio, · 98 unmodified lines
20982093 struct rmap_walk_control rwc = {
20992094 .rmap_one = page_make_device_exclusive_one,
21002095 .done = page_not_mapped,
2101− .anon_lock = page_lock_anon_vma_read,
2096+ .anon_lock = folio_lock_anon_vma_read,
21022097 .arg = &args,
21032098 };
21042099
@@ -2109,7 +2104,7 @@ static bool folio_make_device_exclusive(struct folio *folio, · 4 unmodified lines
21092104 if (!folio_test_anon(folio))
21102105 return false;
21112106
2112− rmap_walk(&folio->page, &rwc);
2107+ rmap_walk(folio, &rwc);
21132108
21142109 return args.valid && !folio_mapcount(folio);
21152110 }
@@ -2177,17 +2172,16 @@ void __put_anon_vma(struct anon_vma *anon_vma) · 61 unmodified lines
21772172 anon_vma_free(root);
21782173 }
21792174
2180−static struct anon_vma *rmap_walk_anon_lock(struct page *page,
2175+static struct anon_vma *rmap_walk_anon_lock(struct folio *folio,
21812176 struct rmap_walk_control *rwc)
21822177 {
2183− struct folio *folio = page_folio(page);
21842178 struct anon_vma *anon_vma;
21852179
21862180 if (rwc->anon_lock)
2187− return rwc->anon_lock(page);
2181+ return rwc->anon_lock(folio);
21882182
21892183 /*
2190− * Note: remove_migration_ptes() cannot use page_lock_anon_vma_read()
2184+ * Note: remove_migration_ptes() cannot use folio_lock_anon_vma_read()
21912185 * because that depends on page_mapped(); but not all its usages
21922186 * are holding mmap_lock. Users without mmap_lock are required to
21932187 * take a reference count to prevent the anon_vma disappearing
@@ -2209,10 +2203,9 @@ static struct anon_vma *rmap_walk_anon_lock(struct page *page, · 15 unmodified lines
22092203 * Find all the mappings of a page using the mapping pointer and the vma chains
22102204 * contained in the anon_vma struct it points to.
22112205 */
2212−static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc,
2206+static void rmap_walk_anon(struct folio *folio, struct rmap_walk_control *rwc,
22132207 bool locked)
22142208 {
2215− struct folio *folio = page_folio(page);
22162209 struct anon_vma *anon_vma;
22172210 pgoff_t pgoff_start, pgoff_end;
22182211 struct anon_vma_chain *avc;
@@ -2222,17 +2215,17 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc, · 3 unmodified lines
22222215 /* anon_vma disappear under us? */
22232216 VM_BUG_ON_FOLIO(!anon_vma, folio);
22242217 } else {
2225− anon_vma = rmap_walk_anon_lock(page, rwc);
2218+ anon_vma = rmap_walk_anon_lock(folio, rwc);
22262219 }
22272220 if (!anon_vma)
22282221 return;
22292222
2230− pgoff_start = page_to_pgoff(page);
2231− pgoff_end = pgoff_start + thp_nr_pages(page) - 1;
2223+ pgoff_start = folio_pgoff(folio);
2224+ pgoff_end = pgoff_start + folio_nr_pages(folio) - 1;
22322225 anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root,
22332226 pgoff_start, pgoff_end) {
22342227 struct vm_area_struct *vma = avc->vma;
2235− unsigned long address = vma_address(page, vma);
2228+ unsigned long address = vma_address(&folio->page, vma);
22362229
22372230 VM_BUG_ON_VMA(address == -EFAULT, vma);
22382231 cond_resched();
@@ -2240,9 +2233,9 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc, · 1 unmodified line
22402233 if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))
22412234 continue;
22422235
2243− if (!rwc->rmap_one(page, vma, address, rwc->arg))
2236+ if (!rwc->rmap_one(folio, vma, address, rwc->arg))
22442237 break;
2245− if (rwc->done && rwc->done(page))
2238+ if (rwc->done && rwc->done(folio))
22462239 break;
22472240 }
22482241
@@ -2258,10 +2251,10 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc, · 9 unmodified lines
22582251 * Find all the mappings of a page using the mapping pointer and the vma chains
22592252 * contained in the address_space struct it points to.
22602253 */
2261−static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc,
2254+static void rmap_walk_file(struct folio *folio, struct rmap_walk_control *rwc,
22622255 bool locked)
22632256 {
2264− struct address_space *mapping = page_mapping(page);
2257+ struct address_space *mapping = folio_mapping(folio);
22652258 pgoff_t pgoff_start, pgoff_end;
22662259 struct vm_area_struct *vma;
22672260
@@ -2271,18 +2264,18 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc, · 3 unmodified lines
22712264 * structure at mapping cannot be freed and reused yet,
22722265 * so we can safely take mapping->i_mmap_rwsem.
22732266 */
2274− VM_BUG_ON_PAGE(!PageLocked(page), page);
2267+ VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
22752268
22762269 if (!mapping)
22772270 return;
22782271
2279− pgoff_start = page_to_pgoff(page);
2280− pgoff_end = pgoff_start + thp_nr_pages(page) - 1;
2272+ pgoff_start = folio_pgoff(folio);
2273+ pgoff_end = pgoff_start + folio_nr_pages(folio) - 1;
22812274 if (!locked)
22822275 i_mmap_lock_read(mapping);
22832276 vma_interval_tree_foreach(vma, &mapping->i_mmap,
22842277 pgoff_start, pgoff_end) {
2285− unsigned long address = vma_address(page, vma);
2278+ unsigned long address = vma_address(&folio->page, vma);
22862279
22872280 VM_BUG_ON_VMA(address == -EFAULT, vma);
22882281 cond_resched();
@@ -2290,9 +2283,9 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc, · 1 unmodified line
22902283 if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))
22912284 continue;
22922285
2293− if (!rwc->rmap_one(page, vma, address, rwc->arg))
2286+ if (!rwc->rmap_one(folio, vma, address, rwc->arg))
22942287 goto done;
2295− if (rwc->done && rwc->done(page))
2288+ if (rwc->done && rwc->done(folio))
22962289 goto done;
22972290 }
22982291
@@ -2301,25 +2294,25 @@ done: · 2 unmodified lines
23012294 i_mmap_unlock_read(mapping);
23022295 }
23032296
2304−void rmap_walk(struct page *page, struct rmap_walk_control *rwc)
2297+void rmap_walk(struct folio *folio, struct rmap_walk_control *rwc)
23052298 {
2306− if (unlikely(PageKsm(page)))
2307− rmap_walk_ksm(page, rwc);
2308− else if (PageAnon(page))
2309− rmap_walk_anon(page, rwc, false);
2299+ if (unlikely(folio_test_ksm(folio)))
2300+ rmap_walk_ksm(folio, rwc);
2301+ else if (folio_test_anon(folio))
2302+ rmap_walk_anon(folio, rwc, false);
23102303 else
2311− rmap_walk_file(page, rwc, false);
2304+ rmap_walk_file(folio, rwc, false);
23122305 }
23132306
23142307 /* Like rmap_walk, but caller holds relevant rmap lock */
2315−void rmap_walk_locked(struct page *page, struct rmap_walk_control *rwc)
2308+void rmap_walk_locked(struct folio *folio, struct rmap_walk_control *rwc)
23162309 {
23172310 /* no ksm support for now */
2318− VM_BUG_ON_PAGE(PageKsm(page), page);
2319− if (PageAnon(page))
2320− rmap_walk_anon(page, rwc, true);
2311+ VM_BUG_ON_FOLIO(folio_test_ksm(folio), folio);
2312+ if (folio_test_anon(folio))
2313+ rmap_walk_anon(folio, rwc, true);
23212314 else
2322− rmap_walk_file(page, rwc, true);
2315+ rmap_walk_file(folio, rwc, true);
23232316 }
23242317
23252318 #ifdef CONFIG_HUGETLB_PAGE

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t