Lines Matching refs:folio
67 static void __page_cache_release(struct folio *folio, struct lruvec **lruvecp, in __page_cache_release() argument
70 if (folio_test_lru(folio)) { in __page_cache_release()
71 folio_lruvec_relock_irqsave(folio, lruvecp, flagsp); in __page_cache_release()
72 lruvec_del_folio(*lruvecp, folio); in __page_cache_release()
73 __folio_clear_lru_flags(folio); in __page_cache_release()
81 static void page_cache_release(struct folio *folio) in page_cache_release() argument
86 __page_cache_release(folio, &lruvec, &flags); in page_cache_release()
91 void __folio_put(struct folio *folio) in __folio_put() argument
93 if (unlikely(folio_is_zone_device(folio))) { in __folio_put()
94 free_zone_device_folio(folio); in __folio_put()
98 if (folio_test_hugetlb(folio)) { in __folio_put()
99 free_huge_folio(folio); in __folio_put()
103 page_cache_release(folio); in __folio_put()
104 folio_unqueue_deferred_split(folio); in __folio_put()
105 mem_cgroup_uncharge(folio); in __folio_put()
106 free_frozen_pages(&folio->page, folio_order(folio)); in __folio_put()
110 typedef void (*move_fn_t)(struct lruvec *lruvec, struct folio *folio);
112 static void lru_add(struct lruvec *lruvec, struct folio *folio) in lru_add() argument
114 int was_unevictable = folio_test_clear_unevictable(folio); in lru_add()
115 long nr_pages = folio_nr_pages(folio); in lru_add()
117 VM_BUG_ON_FOLIO(folio_test_lru(folio), folio); in lru_add()
130 if (folio_evictable(folio)) { in lru_add()
134 folio_clear_active(folio); in lru_add()
135 folio_set_unevictable(folio); in lru_add()
143 folio->mlock_count = 0; in lru_add()
148 lruvec_add_folio(lruvec, folio); in lru_add()
149 trace_mm_lru_insertion(folio); in lru_add()
168 struct folio *folio = fbatch->folios[i]; in folio_batch_move_lru() local
171 if (!is_lru_add && !folio_test_clear_lru(folio)) in folio_batch_move_lru()
184 if (is_lru_add && folio_ref_freeze(folio, 1)) { in folio_batch_move_lru()
185 __folio_clear_active(folio); in folio_batch_move_lru()
186 __folio_clear_unevictable(folio); in folio_batch_move_lru()
187 folio_unqueue_deferred_split(folio); in folio_batch_move_lru()
189 folio_batch_add(&free_fbatch, folio); in folio_batch_move_lru()
193 folio_lruvec_relock_irqsave(folio, &lruvec, &flags); in folio_batch_move_lru()
194 move_fn(lruvec, folio); in folio_batch_move_lru()
196 folio_set_lru(folio); in folio_batch_move_lru()
212 struct folio *folio, move_fn_t move_fn, bool disable_irq) in __folio_batch_add_and_move() argument
216 folio_get(folio); in __folio_batch_add_and_move()
223 if (!folio_batch_add(this_cpu_ptr(fbatch), folio) || in __folio_batch_add_and_move()
224 !folio_may_be_lru_cached(folio) || lru_cache_disabled()) in __folio_batch_add_and_move()
233 #define folio_batch_add_and_move(folio, op) \ argument
236 folio, \
242 static void lru_move_tail(struct lruvec *lruvec, struct folio *folio) in lru_move_tail() argument
244 if (folio_test_unevictable(folio)) in lru_move_tail()
247 lruvec_del_folio(lruvec, folio); in lru_move_tail()
248 folio_clear_active(folio); in lru_move_tail()
249 lruvec_add_folio_tail(lruvec, folio); in lru_move_tail()
250 __count_vm_events(PGROTATED, folio_nr_pages(folio)); in lru_move_tail()
260 void folio_rotate_reclaimable(struct folio *folio) in folio_rotate_reclaimable() argument
262 if (folio_test_locked(folio) || folio_test_dirty(folio) || in folio_rotate_reclaimable()
263 folio_test_unevictable(folio) || !folio_test_lru(folio)) in folio_rotate_reclaimable()
266 folio_batch_add_and_move(folio, lru_move_tail); in folio_rotate_reclaimable()
269 static void lru_activate(struct lruvec *lruvec, struct folio *folio) in lru_activate() argument
271 long nr_pages = folio_nr_pages(folio); in lru_activate()
273 if (folio_test_active(folio) || folio_test_unevictable(folio)) in lru_activate()
277 lruvec_del_folio(lruvec, folio); in lru_activate()
278 folio_set_active(folio); in lru_activate()
279 lruvec_add_folio(lruvec, folio); in lru_activate()
280 trace_mm_lru_activate(folio); in lru_activate()
295 void folio_activate(struct folio *folio) in folio_activate() argument
297 if (folio_test_active(folio) || folio_test_unevictable(folio) || in folio_activate()
298 !folio_test_lru(folio)) in folio_activate()
301 folio_batch_add_and_move(folio, lru_activate); in folio_activate()
309 void folio_activate(struct folio *folio) in folio_activate() argument
313 if (!folio_test_clear_lru(folio)) in folio_activate()
316 lruvec = folio_lruvec_lock_irq(folio); in folio_activate()
317 lru_activate(lruvec, folio); in folio_activate()
319 folio_set_lru(folio); in folio_activate()
323 static void __lru_cache_activate_folio(struct folio *folio) in __lru_cache_activate_folio() argument
342 struct folio *batch_folio = fbatch->folios[i]; in __lru_cache_activate_folio()
344 if (batch_folio == folio) { in __lru_cache_activate_folio()
345 folio_set_active(folio); in __lru_cache_activate_folio()
355 static void lru_gen_inc_refs(struct folio *folio) in lru_gen_inc_refs() argument
357 unsigned long new_flags, old_flags = READ_ONCE(folio->flags.f); in lru_gen_inc_refs()
359 if (folio_test_unevictable(folio)) in lru_gen_inc_refs()
363 if (!folio_test_referenced(folio)) { in lru_gen_inc_refs()
364 set_mask_bits(&folio->flags.f, LRU_REFS_MASK, BIT(PG_referenced)); in lru_gen_inc_refs()
370 if (!folio_test_workingset(folio)) in lru_gen_inc_refs()
371 folio_set_workingset(folio); in lru_gen_inc_refs()
376 } while (!try_cmpxchg(&folio->flags.f, &old_flags, new_flags)); in lru_gen_inc_refs()
379 static bool lru_gen_clear_refs(struct folio *folio) in lru_gen_clear_refs() argument
381 int gen = folio_lru_gen(folio); in lru_gen_clear_refs()
382 int type = folio_is_file_lru(folio); in lru_gen_clear_refs()
388 set_mask_bits(&folio->flags.f, LRU_REFS_FLAGS | BIT(PG_workingset), 0); in lru_gen_clear_refs()
391 seq = READ_ONCE(folio_lruvec(folio)->lrugen.min_seq[type]); in lru_gen_clear_refs()
399 static void lru_gen_inc_refs(struct folio *folio) in lru_gen_inc_refs() argument
403 static bool lru_gen_clear_refs(struct folio *folio) in lru_gen_clear_refs() argument
423 void folio_mark_accessed(struct folio *folio) in folio_mark_accessed() argument
425 if (folio_test_dropbehind(folio)) in folio_mark_accessed()
428 lru_gen_inc_refs(folio); in folio_mark_accessed()
432 if (!folio_test_referenced(folio)) { in folio_mark_accessed()
433 folio_set_referenced(folio); in folio_mark_accessed()
434 } else if (folio_test_unevictable(folio)) { in folio_mark_accessed()
440 } else if (!folio_test_active(folio)) { in folio_mark_accessed()
447 if (folio_test_lru(folio)) in folio_mark_accessed()
448 folio_activate(folio); in folio_mark_accessed()
450 __lru_cache_activate_folio(folio); in folio_mark_accessed()
451 folio_clear_referenced(folio); in folio_mark_accessed()
452 workingset_activation(folio); in folio_mark_accessed()
454 if (folio_test_idle(folio)) in folio_mark_accessed()
455 folio_clear_idle(folio); in folio_mark_accessed()
468 void folio_add_lru(struct folio *folio) in folio_add_lru() argument
470 VM_BUG_ON_FOLIO(folio_test_active(folio) && in folio_add_lru()
471 folio_test_unevictable(folio), folio); in folio_add_lru()
472 VM_BUG_ON_FOLIO(folio_test_lru(folio), folio); in folio_add_lru()
481 if (lru_gen_enabled() && !folio_test_unevictable(folio) && in folio_add_lru()
483 if (folio_test_workingset(folio)) in folio_add_lru()
484 folio_set_active(folio); in folio_add_lru()
485 else if (!folio_test_referenced(folio)) in folio_add_lru()
486 folio_mark_accessed(folio); in folio_add_lru()
489 folio_batch_add_and_move(folio, lru_add); in folio_add_lru()
501 void folio_add_lru_vma(struct folio *folio, struct vm_area_struct *vma) in folio_add_lru_vma() argument
503 VM_BUG_ON_FOLIO(folio_test_lru(folio), folio); in folio_add_lru_vma()
506 mlock_new_folio(folio); in folio_add_lru_vma()
508 folio_add_lru(folio); in folio_add_lru_vma()
532 static void lru_deactivate_file(struct lruvec *lruvec, struct folio *folio) in lru_deactivate_file() argument
534 bool active = folio_test_active(folio) || lru_gen_enabled(); in lru_deactivate_file()
535 long nr_pages = folio_nr_pages(folio); in lru_deactivate_file()
537 if (folio_test_unevictable(folio)) in lru_deactivate_file()
541 if (folio_mapped(folio)) in lru_deactivate_file()
544 lruvec_del_folio(lruvec, folio); in lru_deactivate_file()
545 folio_clear_active(folio); in lru_deactivate_file()
546 folio_clear_referenced(folio); in lru_deactivate_file()
548 if (folio_test_writeback(folio) || folio_test_dirty(folio)) { in lru_deactivate_file()
555 lruvec_add_folio(lruvec, folio); in lru_deactivate_file()
556 folio_set_reclaim(folio); in lru_deactivate_file()
562 lruvec_add_folio_tail(lruvec, folio); in lru_deactivate_file()
573 static void lru_deactivate(struct lruvec *lruvec, struct folio *folio) in lru_deactivate() argument
575 long nr_pages = folio_nr_pages(folio); in lru_deactivate()
577 if (folio_test_unevictable(folio) || !(folio_test_active(folio) || lru_gen_enabled())) in lru_deactivate()
580 lruvec_del_folio(lruvec, folio); in lru_deactivate()
581 folio_clear_active(folio); in lru_deactivate()
582 folio_clear_referenced(folio); in lru_deactivate()
583 lruvec_add_folio(lruvec, folio); in lru_deactivate()
589 static void lru_lazyfree(struct lruvec *lruvec, struct folio *folio) in lru_lazyfree() argument
591 long nr_pages = folio_nr_pages(folio); in lru_lazyfree()
593 if (!folio_test_anon(folio) || !folio_test_swapbacked(folio) || in lru_lazyfree()
594 folio_test_swapcache(folio) || folio_test_unevictable(folio)) in lru_lazyfree()
597 lruvec_del_folio(lruvec, folio); in lru_lazyfree()
598 folio_clear_active(folio); in lru_lazyfree()
600 lru_gen_clear_refs(folio); in lru_lazyfree()
602 folio_clear_referenced(folio); in lru_lazyfree()
608 folio_clear_swapbacked(folio); in lru_lazyfree()
609 lruvec_add_folio(lruvec, folio); in lru_lazyfree()
667 void deactivate_file_folio(struct folio *folio) in deactivate_file_folio() argument
670 if (folio_test_unevictable(folio) || !folio_test_lru(folio)) in deactivate_file_folio()
673 if (lru_gen_enabled() && lru_gen_clear_refs(folio)) in deactivate_file_folio()
676 folio_batch_add_and_move(folio, lru_deactivate_file); in deactivate_file_folio()
687 void folio_deactivate(struct folio *folio) in folio_deactivate() argument
689 if (folio_test_unevictable(folio) || !folio_test_lru(folio)) in folio_deactivate()
692 if (lru_gen_enabled() ? lru_gen_clear_refs(folio) : !folio_test_active(folio)) in folio_deactivate()
695 folio_batch_add_and_move(folio, lru_deactivate); in folio_deactivate()
705 void folio_mark_lazyfree(struct folio *folio) in folio_mark_lazyfree() argument
707 if (!folio_test_anon(folio) || !folio_test_swapbacked(folio) || in folio_mark_lazyfree()
708 !folio_test_lru(folio) || in folio_mark_lazyfree()
709 folio_test_swapcache(folio) || folio_test_unevictable(folio)) in folio_mark_lazyfree()
712 folio_batch_add_and_move(folio, lru_lazyfree); in folio_mark_lazyfree()
907 void lru_cache_drain_for_folio(const struct folio *folio, in lru_cache_drain_for_folio() argument
910 if (!folio_may_be_lru_cached(folio)) in lru_cache_drain_for_folio()
914 if (folio_ref_count(folio) == in lru_cache_drain_for_folio()
915 folio_expected_ref_count(folio) + extra_refs) in lru_cache_drain_for_folio()
922 if (folio_ref_count(folio) == in lru_cache_drain_for_folio()
923 folio_expected_ref_count(folio) + extra_refs) in lru_cache_drain_for_folio()
988 struct folio *folio = folios->folios[i]; in folios_put_refs() local
992 if (!folio) in folios_put_refs()
995 if (is_huge_zero_folio(folio)) in folios_put_refs()
998 if (folio_is_zone_device(folio)) { in folios_put_refs()
1003 if (folio_ref_sub_and_test(folio, nr_refs)) in folios_put_refs()
1004 free_zone_device_folio(folio); in folios_put_refs()
1008 if (!folio_ref_sub_and_test(folio, nr_refs)) in folios_put_refs()
1012 if (folio_test_hugetlb(folio)) { in folios_put_refs()
1017 free_huge_folio(folio); in folios_put_refs()
1020 folio_unqueue_deferred_split(folio); in folios_put_refs()
1021 __page_cache_release(folio, &lruvec, &flags); in folios_put_refs()
1024 folios->folios[j] = folio; in folios_put_refs()
1062 struct folio *folio = page_folio(encoded_page_ptr(encoded[i])); in release_pages() local
1070 if (folio_batch_add(&fbatch, folio) > 0) in release_pages()
1114 struct folio *folio = fbatch->folios[i]; in folio_batch_remove_exceptionals() local
1115 if (!xa_is_value(folio)) in folio_batch_remove_exceptionals()
1116 fbatch->folios[j++] = folio; in folio_batch_remove_exceptionals()