vmscan.c (f1e1a7be4718609042e3285bc2110d74825ad9d1) vmscan.c (ec1c86b25f4bdd9dce6436c0539d2a6ae676e1c4)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
4 *
5 * Swap reorganised 29.12.95, Stephen Tweedie.
6 * kswapd added: 7.1.96 sct
7 * Removed kswapd_ctl limits, and swap out as many pages as needed
8 * to bring the system back to freepages.high: 2.4.97, Rik van Riel.

--- 3036 unchanged lines hidden (view full) ---

3045 /* Aging the anon LRU is valuable if swap is present: */
3046 if (total_swap_pages > 0)
3047 return true;
3048
3049 /* Also valuable if anon pages can be demoted: */
3050 return can_demote(pgdat->node_id, sc);
3051}
3052
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
4 *
5 * Swap reorganised 29.12.95, Stephen Tweedie.
6 * kswapd added: 7.1.96 sct
7 * Removed kswapd_ctl limits, and swap out as many pages as needed
8 * to bring the system back to freepages.high: 2.4.97, Rik van Riel.

--- 3036 unchanged lines hidden (view full) ---

3045 /* Aging the anon LRU is valuable if swap is present: */
3046 if (total_swap_pages > 0)
3047 return true;
3048
3049 /* Also valuable if anon pages can be demoted: */
3050 return can_demote(pgdat->node_id, sc);
3051}
3052
3053#ifdef CONFIG_LRU_GEN
3054
3055/******************************************************************************
3056 * shorthand helpers
3057 ******************************************************************************/
3058
3059#define for_each_gen_type_zone(gen, type, zone) \
3060 for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++) \
3061 for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \
3062 for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++)
3063
3064static struct lruvec __maybe_unused *get_lruvec(struct mem_cgroup *memcg, int nid)
3065{
3066 struct pglist_data *pgdat = NODE_DATA(nid);
3067
3068#ifdef CONFIG_MEMCG
3069 if (memcg) {
3070 struct lruvec *lruvec = &memcg->nodeinfo[nid]->lruvec;
3071
3072 /* for hotadd_new_pgdat() */
3073 if (!lruvec->pgdat)
3074 lruvec->pgdat = pgdat;
3075
3076 return lruvec;
3077 }
3078#endif
3079 VM_WARN_ON_ONCE(!mem_cgroup_disabled());
3080
3081 return pgdat ? &pgdat->__lruvec : NULL;
3082}
3083
3084/******************************************************************************
3085 * initialization
3086 ******************************************************************************/
3087
3088void lru_gen_init_lruvec(struct lruvec *lruvec)
3089{
3090 int gen, type, zone;
3091 struct lru_gen_struct *lrugen = &lruvec->lrugen;
3092
3093 lrugen->max_seq = MIN_NR_GENS + 1;
3094
3095 for_each_gen_type_zone(gen, type, zone)
3096 INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);
3097}
3098
3099#ifdef CONFIG_MEMCG
3100void lru_gen_init_memcg(struct mem_cgroup *memcg)
3101{
3102}
3103
3104void lru_gen_exit_memcg(struct mem_cgroup *memcg)
3105{
3106 int nid;
3107
3108 for_each_node(nid) {
3109 struct lruvec *lruvec = get_lruvec(memcg, nid);
3110
3111 VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0,
3112 sizeof(lruvec->lrugen.nr_pages)));
3113 }
3114}
3115#endif
3116
3117static int __init init_lru_gen(void)
3118{
3119 BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS);
3120 BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS);
3121
3122 return 0;
3123};
3124late_initcall(init_lru_gen);
3125
3126#endif /* CONFIG_LRU_GEN */
3127
3053static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
3054{
3055 unsigned long nr[NR_LRU_LISTS];
3056 unsigned long targets[NR_LRU_LISTS];
3057 unsigned long nr_to_scan;
3058 enum lru_list lru;
3059 unsigned long nr_reclaimed = 0;
3060 unsigned long nr_to_reclaim = sc->nr_to_reclaim;

--- 1871 unchanged lines hidden ---
3128static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
3129{
3130 unsigned long nr[NR_LRU_LISTS];
3131 unsigned long targets[NR_LRU_LISTS];
3132 unsigned long nr_to_scan;
3133 enum lru_list lru;
3134 unsigned long nr_reclaimed = 0;
3135 unsigned long nr_to_reclaim = sc->nr_to_reclaim;

--- 1871 unchanged lines hidden ---