for (tier = 1; tier < MAX_NR_TIERS; tier++) { read_ctrl_pos(lruvec, type, tier, 2, &pv); if (!positive_ctrl_err(&sp, &pv)) break; } return tier - 1; } *调用read_ctrl_pos函数,获取tier 0下的 static void read_ctrl_pos(struct lruvec *lruvec, int type, int tier, int ...
在MGLRU中,Tier(层级)是Generation(代)内部的一个概念,用于表征文件I/O页面的访问频率。Tier是通过记录文件页被访问的次数来进行划分的,具体规则是如果文件页被访问了n次,则其Tier为log2(n)。需要注意的是,这个次数只在sys_read和sys_write系统调用时统计,因此通过系统调用只被read()了一次或只被map访问的页,...
先看看驱逐evict的逻辑 evict_foliosisolate_foliosscan_foliosisolate_foliofolio_inc_gen//这个地方又和tier扯上关系了,此时是通过tier得出folio的refs认为folio需要增加代的; 再看看kswapd扫描的时候的逻辑; evict_foliosstaticboolinc_min_seq(structlruvec*lruvec,inttype,boolcan_swap){intzone;intremaining=MAX_...
folio的flags和LRU_GEN_MASK相与后为0,说明该并未处于gen中,这种情况主要发生在刚创建的filio,或者已经从lru_vec剥离出来的folio; 将老的flags和gen掩码取反后,也就是清空,此外tier也需要清空,因为gen要更新,tier必须从0开始; 再将gen的值从原来老的gen上加1; 最后返回老的gen的值, 为啥减去1呢?因为flags的...
PID controller PID用于回收时选择回收的类型以及保护的tier mglru总体框图,描述了各个关键部分如何组织在一起,以及程序控制流。 内容有些多,有些概念比较少在内核中使用, 如PID/Bloom filters,感觉“高大上”, 在mglru中实现还是比较简单。 mglru关联数据结构:以memcg为中心,核心数据结构是lru_gen_folio ...