On Mon, Mar 21, 2022 at 6:52 AM Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx> wrote: > > + > > +static long get_nr_evictable(struct lruvec *lruvec, unsigned long max_seq, > > + unsigned long *min_seq, bool can_swap, bool *need_aging) > > +{ > > + int gen, type, zone; > > + long old = 0; > > + long young = 0; > > + long total = 0; > > + struct lru_gen_struct *lrugen = &lruvec->lrugen; > > + > > + for (type = !can_swap; type < ANON_AND_FILE; type++) { > > + unsigned long seq; > > + > > + for (seq = min_seq[type]; seq <= max_seq; seq++) { > > + long size = 0; > > + > > + gen = lru_gen_from_seq(seq); > > + > > + for (zone = 0; zone < MAX_NR_ZONES; zone++) > > + size += READ_ONCE(lrugen->nr_pages[gen][type][zone]); > > + > > + total += size; > > + if (seq == max_seq) > > + young += size; > > + if (seq + MIN_NR_GENS == max_seq) > > + old += size; > > + } > > + } > > + > > + /* try to spread pages out across MIN_NR_GENS+1 generations */ > > + if (min_seq[LRU_GEN_FILE] + MIN_NR_GENS > max_seq) > > + *need_aging = true; > > + else if (min_seq[LRU_GEN_FILE] + MIN_NR_GENS < max_seq) > > + *need_aging = false; > > Can you explain/document the reason for the considering the below > conditions for ageing? > > > + else if (young * MIN_NR_GENS > total) > > + *need_aging = true; > > Are we trying to consdier the case of more than half the total pages > young as needing ageing? If so should MIN_NR_GENS be 2 instead of using > that #define? Or > > > + else if (old * (MIN_NR_GENS + 2) < total) > > + *need_aging = true; > > What is the significance of '+ 2' ? Will improve the comment according to my previous reply here [1]. [1] https://lore.kernel.org/linux-mm/CAOUHufYmUPZY0gCC+wYk6Vr1L8KEx+tJeEAhjpBfUnLJsAHq5A@xxxxxxxxxxxxxx/