readahead 循环
slot k
slot k+1
slot k+3
slot k+4
batch A
batch B
slot 紧邻就追加;断档或批次满就提交
swap_iocb
批量合并
批次交给块层,不逐页发请求
blk_plug()
blk_finish_plug()
readahead 循环
batch 1
batch 2
batch 3
plug 队列
batch 1 · batch 2 · batch 3 先排队
块层
统一取出 plug 队列
相邻请求合并成更大的请求
旧顺序:先 unplug,再提交最后一批
plug 窗口
循环结束
blk_finish_plug()
最后一批
swap_read_submit(&ctx)
提交发生在窗口关闭之后
独立请求
无法与前面批次合并
每次 readahead 都多出一次 I/O
只对调两行
swap_read_submit(&ctx);
blk_finish_plug(&plug);
先提交
再 unplug
旧:先 blk_finish_plug() 再提交
plug 窗口
最后一批
blk_finish_plug()
与中间批次合并
swap_cluster_readahead()
swap_vma_readahead()
两条路径都按此处理,行为一致
旧顺序
b1
b2
b3
last
b1–b3 合并
last 单独提交
多一个独立请求
新顺序
b1
b2
b3
last
全部进同一个合并窗口
一个合并请求
每次 readahead 少一次 I/O
批量计账不变
错误处理路径不变
只对调提交顺序
swap_cluster_readahead()
swap_read_submit(&ctx);
blk_finish_plug(&plug);
swap_vma_readahead()
swap_read_submit(&ctx);
blk_finish_plug(&plug);
✓ 最后一批不再成为独立请求
✓ 相邻批次有机会拼成更大请求
✓ 单次 I/O 覆盖更多连续 swap 页
作者未提供性能数据,以上为代码逻辑推断的预期收益
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x