Skip to the content.

简单分析一下 folio 在 lru 中移动

结论 1 : 一个 folio 必须被显示的添加 lru

对于 folio_add_lru 的经典的调用:

@[
    folio_batch_move_lru+1
    folio_add_lru+91
    do_anonymous_page+766
    __handle_mm_fault+2093
    handle_mm_fault+341
    do_user_addr_fault+351
    exc_page_fault+109
    asm_exc_page_fault+38
]: 152

filemap_add_folio 然后调用 filemap_add_folio

@[
    folio_add_lru+5
    do_anonymous_page+1517
    __handle_mm_fault+3105
    handle_mm_fault+383
    do_user_addr_fault+380
    exc_page_fault+127
    asm_exc_page_fault+38
]: 1413753

结论 2 : 添加的时候有多种选项

添加到 lru 通过多种辅助函数来实现将 folio 移动到不同的位置,是否移动到全局的 lru list 中:

他们都使用 folio_batch_add_and_move 来用于遍历 folio_batch ,调用 move_fn_t

用于搬运一个 page 函数,都是 move_fn_t 类型的,他们负责具体的移动工作

结论 3 : 利用 folio_batch 可以批量操作

一共缓存在这里:

/*
 * The following folio batches are grouped together because they are protected
 * by disabling preemption (and interrupts remain enabled).
 */
struct cpu_fbatches {
	local_lock_t lock;
	struct folio_batch lru_add;
	struct folio_batch lru_deactivate_file;
	struct folio_batch lru_deactivate;
	struct folio_batch lru_lazyfree;
#ifdef CONFIG_SMP
	struct folio_batch activate;
#endif
};

例如 folio_add_lru 中:

lru_add_drain 和 folio_add_lru 的关系是什么?

正如名字显示的那样,lru_add_drain 和 folio_add_lru ,前者要求立刻将 folio_batch 中内容 flush , 后续是需要等待的

结论 4 : 加入到 lru 的 folio 必有 PG_lru 的 flag

大致是这样的调用路径,最后都是调用到 folio_set_lru(folio);

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。