The rmap walking functions do not modify the rmap_walk_control, and page_idle_clear_pte_refs() takes advantage of that to move construction of the rmap_walk_control to compile time. This lets us remove an unclean cast.
Unified · Split
| @@ -51,7 +51,7 @@ static inline void ksm_exit(struct mm_struct *mm) · 50 unmodified lines | ||
| 51 | 51 | struct page *ksm_might_need_to_copy(struct page *page, |
| 52 | 52 | struct vm_area_struct *vma, unsigned long address); |
| 53 | 53 | |
| 54 | −void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc); | |
| 54 | +void rmap_walk_ksm(struct folio *folio, const struct rmap_walk_control *rwc); | |
| 55 | 55 | void folio_migrate_ksm(struct folio *newfolio, struct folio *folio); |
| 56 | 56 | |
| 57 | 57 | #else /* !CONFIG_KSM */ |
| @@ -79,7 +79,7 @@ static inline struct page *ksm_might_need_to_copy(struct page *page, · 21 unmodified lines | ||
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | static inline void rmap_walk_ksm(struct folio *folio, |
| 82 | − struct rmap_walk_control *rwc) | |
| 82 | + const struct rmap_walk_control *rwc) | |
| 83 | 83 | { |
| 84 | 84 | } |
| 85 | 85 | |
| @@ -292,8 +292,8 @@ struct rmap_walk_control { · 291 unmodified lines | ||
| 292 | 292 | bool (*invalid_vma)(struct vm_area_struct *vma, void *arg); |
| 293 | 293 | }; |
| 294 | 294 | |
| 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); | |
| 295 | +void rmap_walk(struct folio *folio, const struct rmap_walk_control *rwc); | |
| 296 | +void rmap_walk_locked(struct folio *folio, const struct rmap_walk_control *rwc); | |
| 297 | 297 | |
| 298 | 298 | #else /* !CONFIG_MMU */ |
| 299 | 299 | |
| @@ -2588,7 +2588,7 @@ struct page *ksm_might_need_to_copy(struct page *page, · 2587 unmodified lines | ||
| 2588 | 2588 | return new_page; |
| 2589 | 2589 | } |
| 2590 | 2590 | |
| 2591 | −void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc) | |
| 2591 | +void rmap_walk_ksm(struct folio *folio, const struct rmap_walk_control *rwc) | |
| 2592 | 2592 | { |
| 2593 | 2593 | struct stable_node *stable_node; |
| 2594 | 2594 | struct rmap_item *rmap_item; |
| @@ -103,7 +103,7 @@ static void page_idle_clear_pte_refs(struct page *page) · 102 unmodified lines | ||
| 103 | 103 | if (need_lock && !folio_trylock(folio)) |
| 104 | 104 | return; |
| 105 | 105 | |
| 106 | − rmap_walk(folio, (struct rmap_walk_control *)&rwc); | |
| 106 | + rmap_walk(folio, &rwc); | |
| 107 | 107 | |
| 108 | 108 | if (need_lock) |
| 109 | 109 | folio_unlock(folio); |
| @@ -2173,7 +2173,7 @@ void __put_anon_vma(struct anon_vma *anon_vma) · 2172 unmodified lines | ||
| 2173 | 2173 | } |
| 2174 | 2174 | |
| 2175 | 2175 | static struct anon_vma *rmap_walk_anon_lock(struct folio *folio, |
| 2176 | − struct rmap_walk_control *rwc) | |
| 2176 | + const struct rmap_walk_control *rwc) | |
| 2177 | 2177 | { |
| 2178 | 2178 | struct anon_vma *anon_vma; |
| 2179 | 2179 | |
| @@ -2203,8 +2203,8 @@ static struct anon_vma *rmap_walk_anon_lock(struct folio *folio, · 23 unmodified lines | ||
| 2203 | 2203 | * Find all the mappings of a page using the mapping pointer and the vma chains |
| 2204 | 2204 | * contained in the anon_vma struct it points to. |
| 2205 | 2205 | */ |
| 2206 | −static void rmap_walk_anon(struct folio *folio, struct rmap_walk_control *rwc, | |
| 2207 | − bool locked) | |
| 2206 | +static void rmap_walk_anon(struct folio *folio, | |
| 2207 | + const struct rmap_walk_control *rwc, bool locked) | |
| 2208 | 2208 | { |
| 2209 | 2209 | struct anon_vma *anon_vma; |
| 2210 | 2210 | pgoff_t pgoff_start, pgoff_end; |
| @@ -2251,8 +2251,8 @@ static void rmap_walk_anon(struct folio *folio, struct rmap_walk_control *rwc, · 40 unmodified lines | ||
| 2251 | 2251 | * Find all the mappings of a page using the mapping pointer and the vma chains |
| 2252 | 2252 | * contained in the address_space struct it points to. |
| 2253 | 2253 | */ |
| 2254 | −static void rmap_walk_file(struct folio *folio, struct rmap_walk_control *rwc, | |
| 2255 | − bool locked) | |
| 2254 | +static void rmap_walk_file(struct folio *folio, | |
| 2255 | + const struct rmap_walk_control *rwc, bool locked) | |
| 2256 | 2256 | { |
| 2257 | 2257 | struct address_space *mapping = folio_mapping(folio); |
| 2258 | 2258 | pgoff_t pgoff_start, pgoff_end; |
| @@ -2294,7 +2294,7 @@ done: · 35 unmodified lines | ||
| 2294 | 2294 | i_mmap_unlock_read(mapping); |
| 2295 | 2295 | } |
| 2296 | 2296 | |
| 2297 | −void rmap_walk(struct folio *folio, struct rmap_walk_control *rwc) | |
| 2297 | +void rmap_walk(struct folio *folio, const struct rmap_walk_control *rwc) | |
| 2298 | 2298 | { |
| 2299 | 2299 | if (unlikely(folio_test_ksm(folio))) |
| 2300 | 2300 | rmap_walk_ksm(folio, rwc); |
| @@ -2305,7 +2305,7 @@ void rmap_walk(struct folio *folio, struct rmap_walk_control *rwc) · 4 unmodified lines | ||
| 2305 | 2305 | } |
| 2306 | 2306 | |
| 2307 | 2307 | /* Like rmap_walk, but caller holds relevant rmap lock */ |
| 2308 | −void rmap_walk_locked(struct folio *folio, struct rmap_walk_control *rwc) | |
| 2308 | +void rmap_walk_locked(struct folio *folio, const struct rmap_walk_control *rwc) | |
| 2309 | 2309 | { |
| 2310 | 2310 | /* no ksm support for now */ |
| 2311 | 2311 | VM_BUG_ON_FOLIO(folio_test_ksm(folio), folio); |