| @@ -107,15 +107,15 @@ static inline void anon_vma_free(struct anon_vma *anon_vma) · 106 unmodified lines |
| 107 | 107 | VM_BUG_ON(atomic_read(&anon_vma->refcount)); |
| 108 | 108 | |
| 109 | 109 | /* |
| 110 | | − * Synchronize against page_lock_anon_vma_read() such that |
| 110 | + * Synchronize against folio_lock_anon_vma_read() such that |
| 111 | 111 | * we can safely hold the lock without the anon_vma getting |
| 112 | 112 | * freed. |
| 113 | 113 | * |
| 114 | 114 | * Relies on the full mb implied by the atomic_dec_and_test() from |
| 115 | 115 | * 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: |
| 117 | 117 | * |
| 118 | | − * page_lock_anon_vma_read() VS put_anon_vma() |
| 118 | + * folio_lock_anon_vma_read() VS put_anon_vma() |
| 119 | 119 | * down_read_trylock() atomic_dec_and_test() |
| 120 | 120 | * LOCK MB |
| 121 | 121 | * atomic_read() rwsem_is_locked() |
| @@ -168,7 +168,7 @@ static void anon_vma_chain_link(struct vm_area_struct *vma, · 46 unmodified lines |
| 168 | 168 | * allocate a new one. |
| 169 | 169 | * |
| 170 | 170 | * 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() |
| 172 | 172 | * and that may actually touch the rwsem even in the newly |
| 173 | 173 | * allocated vma (it depends on RCU to make sure that the |
| 174 | 174 | * anon_vma isn't actually destroyed). |
| @@ -799,10 +799,9 @@ struct folio_referenced_arg { · 624 unmodified lines |
| 799 | 799 | /* |
| 800 | 800 | * arg: folio_referenced_arg will be passed |
| 801 | 801 | */ |
| 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) |
| 804 | 804 | { |
| 805 | | − struct folio *folio = page_folio(page); |
| 806 | 805 | struct folio_referenced_arg *pra = arg; |
| 807 | 806 | DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0); |
| 808 | 807 | int referenced = 0; |
| @@ -894,7 +893,7 @@ int folio_referenced(struct folio *folio, int is_locked, · 85 unmodified lines |
| 894 | 893 | struct rmap_walk_control rwc = { |
| 895 | 894 | .rmap_one = folio_referenced_one, |
| 896 | 895 | .arg = (void *)&pra, |
| 897 | | − .anon_lock = page_lock_anon_vma_read, |
| 896 | + .anon_lock = folio_lock_anon_vma_read, |
| 898 | 897 | }; |
| 899 | 898 | |
| 900 | 899 | *vm_flags = 0; |
| @@ -919,7 +918,7 @@ int folio_referenced(struct folio *folio, int is_locked, · 18 unmodified lines |
| 919 | 918 | rwc.invalid_vma = invalid_folio_referenced_vma; |
| 920 | 919 | } |
| 921 | 920 | |
| 922 | | − rmap_walk(&folio->page, &rwc); |
| 921 | + rmap_walk(folio, &rwc); |
| 923 | 922 | *vm_flags = pra.vm_flags; |
| 924 | 923 | |
| 925 | 924 | if (we_locked) |
| @@ -928,10 +927,9 @@ int folio_referenced(struct folio *folio, int is_locked, · 2 unmodified lines |
| 928 | 927 | return pra.referenced; |
| 929 | 928 | } |
| 930 | 929 | |
| 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, |
| 932 | 931 | unsigned long address, void *arg) |
| 933 | 932 | { |
| 934 | | − struct folio *folio = page_folio(page); |
| 935 | 933 | DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, PVMW_SYNC); |
| 936 | 934 | struct mmu_notifier_range range; |
| 937 | 935 | int *cleaned = arg; |
| @@ -1025,7 +1023,7 @@ int folio_mkclean(struct folio *folio) · 87 unmodified lines |
| 1025 | 1023 | if (!mapping) |
| 1026 | 1024 | return 0; |
| 1027 | 1025 | |
| 1028 | | − rmap_walk(&folio->page, &rwc); |
| 1026 | + rmap_walk(folio, &rwc); |
| 1029 | 1027 | |
| 1030 | 1028 | return cleaned; |
| 1031 | 1029 | } |
| @@ -1410,10 +1408,9 @@ out: · 378 unmodified lines |
| 1410 | 1408 | /* |
| 1411 | 1409 | * @arg: enum ttu_flags will be passed to this argument |
| 1412 | 1410 | */ |
| 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, |
| 1414 | 1412 | unsigned long address, void *arg) |
| 1415 | 1413 | { |
| 1416 | | − struct folio *folio = page_folio(page); |
| 1417 | 1414 | struct mm_struct *mm = vma->vm_mm; |
| 1418 | 1415 | DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0); |
| 1419 | 1416 | pte_t pteval; |
| @@ -1667,9 +1664,9 @@ static bool invalid_migration_vma(struct vm_area_struct *vma, void *arg) · 247 unmodified lines |
| 1667 | 1664 | return vma_is_temporary_stack(vma); |
| 1668 | 1665 | } |
| 1669 | 1666 | |
| 1670 | | −static int page_not_mapped(struct page *page) |
| 1667 | +static int page_not_mapped(struct folio *folio) |
| 1671 | 1668 | { |
| 1672 | | − return !page_mapped(page); |
| 1669 | + return !folio_mapped(folio); |
| 1673 | 1670 | } |
| 1674 | 1671 | |
| 1675 | 1672 | /** |
| @@ -1689,13 +1686,13 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) · 13 unmodified lines |
| 1689 | 1686 | .rmap_one = try_to_unmap_one, |
| 1690 | 1687 | .arg = (void *)flags, |
| 1691 | 1688 | .done = page_not_mapped, |
| 1692 | | − .anon_lock = page_lock_anon_vma_read, |
| 1689 | + .anon_lock = folio_lock_anon_vma_read, |
| 1693 | 1690 | }; |
| 1694 | 1691 | |
| 1695 | 1692 | if (flags & TTU_RMAP_LOCKED) |
| 1696 | | − rmap_walk_locked(&folio->page, &rwc); |
| 1693 | + rmap_walk_locked(folio, &rwc); |
| 1697 | 1694 | else |
| 1698 | | − rmap_walk(&folio->page, &rwc); |
| 1695 | + rmap_walk(folio, &rwc); |
| 1699 | 1696 | } |
| 1700 | 1697 | |
| 1701 | 1698 | /* |
| @@ -1704,10 +1701,9 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) · 2 unmodified lines |
| 1704 | 1701 | * If TTU_SPLIT_HUGE_PMD is specified any PMD mappings will be split into PTEs |
| 1705 | 1702 | * containing migration entries. |
| 1706 | 1703 | */ |
| 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, |
| 1708 | 1705 | unsigned long address, void *arg) |
| 1709 | 1706 | { |
| 1710 | | − struct folio *folio = page_folio(page); |
| 1711 | 1707 | struct mm_struct *mm = vma->vm_mm; |
| 1712 | 1708 | DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0); |
| 1713 | 1709 | pte_t pteval; |
| @@ -1951,7 +1947,7 @@ void try_to_migrate(struct folio *folio, enum ttu_flags flags) · 237 unmodified lines |
| 1951 | 1947 | .rmap_one = try_to_migrate_one, |
| 1952 | 1948 | .arg = (void *)flags, |
| 1953 | 1949 | .done = page_not_mapped, |
| 1954 | | − .anon_lock = page_lock_anon_vma_read, |
| 1950 | + .anon_lock = folio_lock_anon_vma_read, |
| 1955 | 1951 | }; |
| 1956 | 1952 | |
| 1957 | 1953 | /* |
| @@ -1977,9 +1973,9 @@ void try_to_migrate(struct folio *folio, enum ttu_flags flags) · 19 unmodified lines |
| 1977 | 1973 | rwc.invalid_vma = invalid_migration_vma; |
| 1978 | 1974 | |
| 1979 | 1975 | if (flags & TTU_RMAP_LOCKED) |
| 1980 | | − rmap_walk_locked(&folio->page, &rwc); |
| 1976 | + rmap_walk_locked(folio, &rwc); |
| 1981 | 1977 | else |
| 1982 | | − rmap_walk(&folio->page, &rwc); |
| 1978 | + rmap_walk(folio, &rwc); |
| 1983 | 1979 | } |
| 1984 | 1980 | |
| 1985 | 1981 | #ifdef CONFIG_DEVICE_PRIVATE |
| @@ -1990,10 +1986,9 @@ struct make_exclusive_args { · 4 unmodified lines |
| 1990 | 1986 | bool valid; |
| 1991 | 1987 | }; |
| 1992 | 1988 | |
| 1993 | | −static bool page_make_device_exclusive_one(struct page *page, |
| 1989 | +static bool page_make_device_exclusive_one(struct folio *folio, |
| 1994 | 1990 | struct vm_area_struct *vma, unsigned long address, void *priv) |
| 1995 | 1991 | { |
| 1996 | | − struct folio *folio = page_folio(page); |
| 1997 | 1992 | struct mm_struct *mm = vma->vm_mm; |
| 1998 | 1993 | DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0); |
| 1999 | 1994 | struct make_exclusive_args *args = priv; |
| @@ -2098,7 +2093,7 @@ static bool folio_make_device_exclusive(struct folio *folio, · 98 unmodified lines |
| 2098 | 2093 | struct rmap_walk_control rwc = { |
| 2099 | 2094 | .rmap_one = page_make_device_exclusive_one, |
| 2100 | 2095 | .done = page_not_mapped, |
| 2101 | | − .anon_lock = page_lock_anon_vma_read, |
| 2096 | + .anon_lock = folio_lock_anon_vma_read, |
| 2102 | 2097 | .arg = &args, |
| 2103 | 2098 | }; |
| 2104 | 2099 | |
| @@ -2109,7 +2104,7 @@ static bool folio_make_device_exclusive(struct folio *folio, · 4 unmodified lines |
| 2109 | 2104 | if (!folio_test_anon(folio)) |
| 2110 | 2105 | return false; |
| 2111 | 2106 | |
| 2112 | | − rmap_walk(&folio->page, &rwc); |
| 2107 | + rmap_walk(folio, &rwc); |
| 2113 | 2108 | |
| 2114 | 2109 | return args.valid && !folio_mapcount(folio); |
| 2115 | 2110 | } |
| @@ -2177,17 +2172,16 @@ void __put_anon_vma(struct anon_vma *anon_vma) · 61 unmodified lines |
| 2177 | 2172 | anon_vma_free(root); |
| 2178 | 2173 | } |
| 2179 | 2174 | |
| 2180 | | −static struct anon_vma *rmap_walk_anon_lock(struct page *page, |
| 2175 | +static struct anon_vma *rmap_walk_anon_lock(struct folio *folio, |
| 2181 | 2176 | struct rmap_walk_control *rwc) |
| 2182 | 2177 | { |
| 2183 | | − struct folio *folio = page_folio(page); |
| 2184 | 2178 | struct anon_vma *anon_vma; |
| 2185 | 2179 | |
| 2186 | 2180 | if (rwc->anon_lock) |
| 2187 | | − return rwc->anon_lock(page); |
| 2181 | + return rwc->anon_lock(folio); |
| 2188 | 2182 | |
| 2189 | 2183 | /* |
| 2190 | | − * Note: remove_migration_ptes() cannot use page_lock_anon_vma_read() |
| 2184 | + * Note: remove_migration_ptes() cannot use folio_lock_anon_vma_read() |
| 2191 | 2185 | * because that depends on page_mapped(); but not all its usages |
| 2192 | 2186 | * are holding mmap_lock. Users without mmap_lock are required to |
| 2193 | 2187 | * 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 |
| 2209 | 2203 | * Find all the mappings of a page using the mapping pointer and the vma chains |
| 2210 | 2204 | * contained in the anon_vma struct it points to. |
| 2211 | 2205 | */ |
| 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, |
| 2213 | 2207 | bool locked) |
| 2214 | 2208 | { |
| 2215 | | − struct folio *folio = page_folio(page); |
| 2216 | 2209 | struct anon_vma *anon_vma; |
| 2217 | 2210 | pgoff_t pgoff_start, pgoff_end; |
| 2218 | 2211 | 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 |
| 2222 | 2215 | /* anon_vma disappear under us? */ |
| 2223 | 2216 | VM_BUG_ON_FOLIO(!anon_vma, folio); |
| 2224 | 2217 | } else { |
| 2225 | | − anon_vma = rmap_walk_anon_lock(page, rwc); |
| 2218 | + anon_vma = rmap_walk_anon_lock(folio, rwc); |
| 2226 | 2219 | } |
| 2227 | 2220 | if (!anon_vma) |
| 2228 | 2221 | return; |
| 2229 | 2222 | |
| 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; |
| 2232 | 2225 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, |
| 2233 | 2226 | pgoff_start, pgoff_end) { |
| 2234 | 2227 | struct vm_area_struct *vma = avc->vma; |
| 2235 | | − unsigned long address = vma_address(page, vma); |
| 2228 | + unsigned long address = vma_address(&folio->page, vma); |
| 2236 | 2229 | |
| 2237 | 2230 | VM_BUG_ON_VMA(address == -EFAULT, vma); |
| 2238 | 2231 | cond_resched(); |
| @@ -2240,9 +2233,9 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc, · 1 unmodified line |
| 2240 | 2233 | if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg)) |
| 2241 | 2234 | continue; |
| 2242 | 2235 | |
| 2243 | | − if (!rwc->rmap_one(page, vma, address, rwc->arg)) |
| 2236 | + if (!rwc->rmap_one(folio, vma, address, rwc->arg)) |
| 2244 | 2237 | break; |
| 2245 | | − if (rwc->done && rwc->done(page)) |
| 2238 | + if (rwc->done && rwc->done(folio)) |
| 2246 | 2239 | break; |
| 2247 | 2240 | } |
| 2248 | 2241 | |
| @@ -2258,10 +2251,10 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc, · 9 unmodified lines |
| 2258 | 2251 | * Find all the mappings of a page using the mapping pointer and the vma chains |
| 2259 | 2252 | * contained in the address_space struct it points to. |
| 2260 | 2253 | */ |
| 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, |
| 2262 | 2255 | bool locked) |
| 2263 | 2256 | { |
| 2264 | | − struct address_space *mapping = page_mapping(page); |
| 2257 | + struct address_space *mapping = folio_mapping(folio); |
| 2265 | 2258 | pgoff_t pgoff_start, pgoff_end; |
| 2266 | 2259 | struct vm_area_struct *vma; |
| 2267 | 2260 | |
| @@ -2271,18 +2264,18 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc, · 3 unmodified lines |
| 2271 | 2264 | * structure at mapping cannot be freed and reused yet, |
| 2272 | 2265 | * so we can safely take mapping->i_mmap_rwsem. |
| 2273 | 2266 | */ |
| 2274 | | − VM_BUG_ON_PAGE(!PageLocked(page), page); |
| 2267 | + VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); |
| 2275 | 2268 | |
| 2276 | 2269 | if (!mapping) |
| 2277 | 2270 | return; |
| 2278 | 2271 | |
| 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; |
| 2281 | 2274 | if (!locked) |
| 2282 | 2275 | i_mmap_lock_read(mapping); |
| 2283 | 2276 | vma_interval_tree_foreach(vma, &mapping->i_mmap, |
| 2284 | 2277 | pgoff_start, pgoff_end) { |
| 2285 | | − unsigned long address = vma_address(page, vma); |
| 2278 | + unsigned long address = vma_address(&folio->page, vma); |
| 2286 | 2279 | |
| 2287 | 2280 | VM_BUG_ON_VMA(address == -EFAULT, vma); |
| 2288 | 2281 | cond_resched(); |
| @@ -2290,9 +2283,9 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc, · 1 unmodified line |
| 2290 | 2283 | if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg)) |
| 2291 | 2284 | continue; |
| 2292 | 2285 | |
| 2293 | | − if (!rwc->rmap_one(page, vma, address, rwc->arg)) |
| 2286 | + if (!rwc->rmap_one(folio, vma, address, rwc->arg)) |
| 2294 | 2287 | goto done; |
| 2295 | | − if (rwc->done && rwc->done(page)) |
| 2288 | + if (rwc->done && rwc->done(folio)) |
| 2296 | 2289 | goto done; |
| 2297 | 2290 | } |
| 2298 | 2291 | |
| @@ -2301,25 +2294,25 @@ done: · 2 unmodified lines |
| 2301 | 2294 | i_mmap_unlock_read(mapping); |
| 2302 | 2295 | } |
| 2303 | 2296 | |
| 2304 | | −void rmap_walk(struct page *page, struct rmap_walk_control *rwc) |
| 2297 | +void rmap_walk(struct folio *folio, struct rmap_walk_control *rwc) |
| 2305 | 2298 | { |
| 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); |
| 2310 | 2303 | else |
| 2311 | | − rmap_walk_file(page, rwc, false); |
| 2304 | + rmap_walk_file(folio, rwc, false); |
| 2312 | 2305 | } |
| 2313 | 2306 | |
| 2314 | 2307 | /* 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) |
| 2316 | 2309 | { |
| 2317 | 2310 | /* 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); |
| 2321 | 2314 | else |
| 2322 | | − rmap_walk_file(page, rwc, true); |
| 2315 | + rmap_walk_file(folio, rwc, true); |
| 2323 | 2316 | } |
| 2324 | 2317 | |
| 2325 | 2318 | #ifdef CONFIG_HUGETLB_PAGE |