sched discussion
[PATCH] cpufreq: schedutil: Replace sprintf() with sysfs_emit() in sysfs show
LLM 分析
cpufreq/schedutil:sysfs show 中将 sprintf() 替换为 sysfs_emit()
系列概况
- 标题:[PATCH] cpufreq: schedutil: Replace sprintf() with sysfs_emit() in sysfs show
- 作者:Zhongqiu Han zhongqiu.han@oss.qualcomm.com
- 版本:单封补丁,无版本号
- 规模:1 文件,1 处新增,1 处删除
- 修改文件:
kernel/sched/cpufreq_schedutil.c - 代码统计:1 行修改(
sprintf→sysfs_emit) - Message-ID:
20260716131546.1159644-1-zhongqiu.han@oss.qualcomm.com - 完整性:包含 commit message、diff 与 Signed-off-by,结构完整
补丁目的
schedutil governor 暴露了一个 sysfs 节点 rate_limit_us_show,用于回写调度频率限流的可调参数(rate_limit_us)。原先实现使用 sprintf(buf, "%u\n", ...) 来把无符号整数写入用户态缓冲区。本补丁将其改为 sysfs_emit(),目标不是修复 bug,而是统一 sysfs 输出 API 的使用习惯:sysfs_emit() 内部已经对 PAGE_SIZE 上限做了检查,并且会强制保证 sysfs 输出格式正确(避免缓冲区溢出或缺失换行等问题)。补丁明确声明 "No functional change intended"。
旧流程的问题
sprintf()不会对目标缓冲区做边界检查,理论上若buf大小不足或调用方传入错误长度,可能越界写。- 内核社区约定 sysfs show 路径必须使用
sysfs_emit()系列 API,而不是sprintf()/scnprintf(),便于统一检查。 rate_limit_us_show是一个遗留使用点,没有跟上内核其它 sysfs 节点的迁移趋势。
新流程
static ssize_t rate_limit_us_show(struct gov_attr_set *attr_set, char *buf)
{
struct sugov_tunables *tunables = to_sugov_tunables(attr_set);
return sysfs_emit(buf, "%u\n", tunables->rate_limit_us);
}
行为不变:返回值仍然是要写入的字节数,输出仍然是 "<unsigned int>\n" 形式。区别仅在于写入路径由通用 sprintf 换成了 sysfs 专用的 sysfs_emit,由后者统一保证不会越过 PAGE_SIZE、不会漏掉格式细节。
关键实现
- 仅替换函数返回语句:
sprintf(buf, "%u\n", tunables->rate_limit_us)→sysfs_emit(buf, "%u\n", tunables->rate_limit_us)。 - 不修改
gov_attr_set/sugov_tunables的取用方式,不修改调用方签名,因此cpufreq框架侧无需任何跟随改动。 - 函数仍然返回
ssize_t,与 sysfs show 的契约保持一致。
类比
把 sysfs 节点想象成自动售货机上的小标签窗口:顾客只能透过 PAGE_SIZE 那么大的玻璃看到内容。sprintf 就像随手拿一支马克笔往玻璃上写字,写得快但玻璃破了就漏风;sysfs_emit() 则是专门配发、带尺子和模板的标记笔——保证写得下、末尾有换行、不会划到玻璃外。本补丁只是把 rate_limit_us_show 这台售货机从马克笔换成了专用笔,对顾客看到的字面值没有任何影响。
Highlight:风险与注意点
- 风险极低:API 形式上等价,返回值语义(写入字节数)与
sprintf一致,外部 ABI 不变。 - 验证点:在合入后,可用
cat /sys/.../scaling_rate_limit_us(具体路径取决于平台 governor 节点)确认输出仍为单一无符号整数加换行。 - 后续观察:schedutil 下仍有
show/store节点可以走相同的sysfs_emit迁移(如up_threshold_show、频率 hint 相关节点),可视为同一类清理工作的子集。 - 维护层面:Rafael J. Wysocki(cpufreq maintainer)直接回复 "Applied as 7.3 material",意味着该补丁被接收,将随 7.3 周期合入,无需进一步修改。
版本变化
单封补丁,无 v1/v2 演进。
一句话总结
schedutil 的 rate_limit_us_show 把 sprintf 换成更安全、更符合 sysfs 约定的 sysfs_emit,纯清理无功能变更,已被 Rafael 接收为 7.3 周期材料。
patch (v1) reply
Zhongqiu Han Rafael J. Wysocki
| |
| sprintf() -> sysfs_emit() | "Applied as 7.3 material, thanks!"
|----------------------------------->|
| review / acceptance |
| v
| cpufreq.git (7.3)
v
kernel/sched/cpufreq_schedutil.c
rate_limit_us_show(): sprintf -> sysfs_emit