sched: adjust the layout of the cfs_bandwidth structure to save memory

调度器 · CFS 带宽结构体布局优化 · 省内存

💡 一句话总结

在每 CPU 运行队列都带 CFS 带宽结构的调度场景下,通过调整结构体字段顺序减少内存填充(padding),为每个 cfs_bandwidth 实例省下少量内存。改动极小(3 字段位移),补丁未提供基准数据,收益为逻辑分析。

📋 补丁基本信息

项目内容
补丁类型优化(内存占用)
状态In Review(v2 RESEND)
当前版本v2 · lore 链接
作者机构Hongling Zeng (Kylin)
提交日期2026-08-03
改动范围1 文件(kernel/sched/sched.h),+3/-3 行
核心结构struct cfs_bandwidth

📊 速览卡片

核心机制
字段重排
优化目标
省结构体内存
适用场景
多 CPU 调度
实测提升
未提供

🎯 解决什么问题

背景 / 原始动机
CFS 带宽控制(CONFIG_CFS_BANDWIDTH)下,每个 struct cfs_bandwidth 实例占一定内存。作者通过重排字段减少填充,节省每个实例的空间。改动只移动 3 个 u8 字段(idle/period_active/slack_started)的位置。
系统层面:结构体填充浪费
原布局中,3 个 u8 字段放在结构体末尾、紧邻 hrtimer 之前。编译器为了对齐可能插入填充字节。把 3 个 u8 移到 raw_spinlock_t lock(8 字节对齐)之后,可让它们紧凑排列,减少填充。
场景层面
多 CPU 系统上每个运行队列都有 CFS 带宽结构,字段重排的省内存效果随 CPU 数放大(解读(AI 分析))。

🧩 核心机制

通过字段重排减少 struct cfs_bandwidth 的填充字节。

改动内容
把 idle/period_active/slack_started 三个 u8 从结构体末尾(hrtimer 前)移到 lock 之后——利用 lock 的 8 字节对齐,让三个 u8 紧凑排列,减少尾部填充。

🔬 关键代码

 struct cfs_bandwidth {
 #ifdef CONFIG_CFS_BANDWIDTH
 	raw_spinlock_t		lock;
+	u8                      idle;
+	u8                      period_active;
+	u8                      slack_started;
 	ktime_t			period;
 	u64			quota;
 	u64			runtime;
 	...
 	s64			hierarchical_quota;
-
-	u8			idle;
-	u8			period_active;
-	u8			slack_started;
 	struct hrtimer		period_timer;

▲ 3 个 u8 位移到 lock 后,紧凑排列省填充(逐字 diff,+3/-3)。

📈 性能影响

**补丁未提供基准数据。** 收益为逻辑分析(解读(AI 分析)):每个 cfs_bandwidth 省下填充字节,多 CPU 系统上总量可观,但单实例节省很小,无实测量化。

🔗 交叉引用

📌 关联工作
mm: Unconditional per-VMA locks and cleanups — 同日报另一篇结构体/锁优化(内存侧),均为减少内核结构占用/争用
PATCH RESEND v2 lore — 本补丁原始链接

⚠️ 风险与局限

潜在回归 / 边界
改动极小:仅字段位移,无逻辑变化,回归风险低。
收益有限:单结构体省几个字节,无 benchmark 支撑,属微优化(解读(AI 分析))。
严重度:MINOR · 补丁无 review 讨论记录(RESEND 提示曾被忽略)

✅ 关键洞察

  • 发现:cfs_bandwidth 字段重排省填充内存,是结构体布局微优化
  • 证据:无基准数据;收益为逻辑分析
  • 边界:多 CPU 系统上省内存总量可观,单实例节省小
  • 风险 / 建议:改动安全但收益未量化,RESEND 状态提示需更强论证
⚠️ 免责声明

本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。