高优先级非阻塞分配的专属预留
ALLOC_HIGHATOMIC
MIGRATE_HIGHATOMIC 空闲页
用已有预留
从 highatomic 空闲页分配
增长预留
把新 pageblock 划为 highatomic
增长为什么被挡在快路径外
把空间据为己有
原本属于其他迁移类型
挤占其他迁移类型
可用空间被占用
整套标志限于慢路径
快路径完全不碰
快路径不消费已有的 highatomic 空闲页
覆盖缺口:高优先级非阻塞分配拿不到本该用的预留
高优先级非阻塞分配到达快路径
高优先级非阻塞分配
高优先级 + 非阻塞
进入快路径
首次尝试之前
不碰 ALLOC_HIGHATOMIC
标志保持缺席
fallback
走其他迁移类型
zone 里已有 highatomic 空闲页
预留就在那里
本为紧急非阻塞准备
快路径不消费
ALLOC_HIGHATOMIC 没启用
高优先级分配落空
拿不到本该用的页
这不是没有预留,而是快路径看不见它
有预留却不会去用,反而 fallback 到其他迁移类型
ALLOC_HIGHATOMIC
标志位不变
增长
只许慢路径发生
消费
下放到快路径
运行时拆开,不新增标志位
拆开后的两条路径
增长加门槛
ALLOC_WMARK_MIN
最低水位线 = 慢路径信号
消费下放快路径
不会触发扩张
只读已有预留
快路径首次尝试前
进入分配
启用 ALLOC_HIGHATOMIC
标志只用于消费
用已有预留
不再 fallback
改动前
highatomic 分配成功
一次分配结束
仅看标志
ALLOC_HIGHATOMIC
增长预留
快慢路径都增长
改动后
highatomic 分配成功
一次分配结束
标志 + 慢路径
ALLOC_WMARK_MIN
增长预留
快路径只消费不增长
ALLOC_WMARK_MIN:最低水位线就是慢路径信号
只有分配已退到慢路径,才允许新增 highatomic 预留
不必引入新标志位
不是任何非阻塞分配都够资格
不要求直接回收
否则本就有回旋余地
愿意借用预留
声明不占用预留的排除
高阶 + 高优先级
order > 0 且带高优先级标记
三条都满足
快路径首次尝试前启用 ALLOC_HIGHATOMIC
快路径首次尝试前
进入首次分配
启用 ALLOC_HIGHATOMIC
标志只用于消费
直接消费已有空闲页
不必 fallback
消费不增长:增长仍由慢路径门槛拦住
快路径启动标志不会触发新的扩张
通用分配标志翻译函数
原本埋在慢路径逻辑里
抽出非阻塞判定函数
单独成一个函数
快路径首次尝试前调用
快路径现在取得到
此前已合入
do not increase highatomic reserve after pcp alloc
Frank van der Linden
把增长决策集中到 buddy 路径,止住 PCP 路径上的无谓膨胀
此前
止住 PCP 路径膨胀
本条
快路径消费已有预留 + 增长限慢路径
两者解决的问题不同、作者不同
目标 zone 已备好 highatomic 空闲页
改动前
UDP receive 负载
不消费 highatomic 空闲页
改动后
符合条件的 order-1 分配
(走 buddy 路径)消费已有预留
无 highatomic miss
预留未被消耗到空
预留没有增长
快路径只用不增
NAPI page-frag 健康
无失败、无 order-0 fallback
作者未给出吞吐或延迟的定量 benchmark · 以上为定性行为验证
快路径不碰标志
ALLOC_HIGHATOMIC 缺席
已有预留闲置
highatomic 空闲页
高优先级分配
本可消费预留
fallback
走其他迁移类型
增长:只许慢路径
ALLOC_WMARK_MIN 把关
消费:快路径
已有预留直接用
高优先级非阻塞分配
用上本该用的页
同一个标志,两种职责在运行时分开
不新增标志位,不改变分配语义
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x