On Tue, Mar 22, 2022 at 1:47 AM Barry Song <21cnbao@xxxxxxxxx> wrote: > ... > > +static bool drain_evictable(struct lruvec *lruvec) > > +{ > > + int gen, type, zone; > > + int remaining = MAX_LRU_BATCH; > > + > > + for_each_gen_type_zone(gen, type, zone) { > > + struct list_head *head = &lruvec->lrugen.lists[gen][type][zone]; > > + > > + while (!list_empty(head)) { > > + bool success; > > + struct folio *folio = lru_to_folio(head); > > + > > + VM_BUG_ON_FOLIO(folio_test_unevictable(folio), folio); > > + VM_BUG_ON_FOLIO(folio_test_active(folio), folio); > > + VM_BUG_ON_FOLIO(folio_is_file_lru(folio) != type, folio); > > + VM_BUG_ON_FOLIO(folio_zonenum(folio) != zone, folio); > > + > > + success = lru_gen_del_folio(lruvec, folio, false); > > + VM_BUG_ON(!success); > > + lruvec_add_folio(lruvec, folio); > > for example, max_seq=4(GEN=0) and max_seq-1=3, then we are supposed to put > max_seq in the head of active list. but your code seems to be putting max_seq-1 > after putting max_seq, then max_seq is more likely to be evicted > afterwards as it > is in the tail of the active list. This is correct. > anyway, it might not be so important. I can't imagine we will > frequently switch mglru > with lru dynamically. will we? I certainly hope not :)