lkml.org 
[lkml]   [2022]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH v9 06/14] mm: multi-gen LRU: minimal implementation
On Sat, Mar 19, 2022 at 5:15 AM Barry Song <21cnbao@gmail.com> wrote:
>
> > + 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;
> > + else if (young * MIN_NR_GENS > total)
> > + *need_aging = true;
>
> Could we have some doc here?

Will do.

> Given MIN_NR_GENS=2 and MAX_NR_GENS=4,
> it seems you mean if we have three generations and the youngest pages are more
> than 1/2 of the total pages, we need aging?

Yes.

> > + else if (old * (MIN_NR_GENS + 2) < total)
> > + *need_aging = true;
>
> it seems you mean if the oldest pages are less than 1/4 of the total pages,
> we need aging?

Yes.

> Can we have comments to explain why here?
>
> your commit message only says " The aging produces young generations.
> Given an lruvec, it increments max_seq when max_seq-min_seq+1
> approaches MIN_NR_GENS." it can't explain what the code is doing
> here.

Fair enough. Approaching MIN_NR_GENS=2 means getting close to it. From
the consumer's POV, if it *reaches* 2, the eviction will have to
stall, because the two youngest generations are not yet fully aged,
i.e., the second chance policy similar to the active/inactive lru.
From the producer's POV, the aging tries to be lazy to reduce the
overhead. So ideally, we want 3 generations, which gives a reasonable
range [2, 4], hence the first two if's.

In addition, we want pages to spread out evenly over these 3
generations, meaning an average 1/3 of total pages for each
generation, which gives another reasonable range [1/2, 1/4]. Since the
eviction reduces the number of old pages, we only need to check
against the lower bound, i.e., 1/4. On the other hand, page (re)faults
increase the number of young pages, so in this case, we need to check
against the upper bound.

I'll include these details in the next spin.

\
 
 \ /
  Last update: 2022-03-22 01:31    [W:0.192 / U:0.540 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site