0/2 已展开

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 行修改(sprintfsysfs_emit
  • Message-ID20260716131546.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_showsprintf 换成更安全、更符合 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