LWN:移除 CONFIG_ANDROID!
关注了就能看到更多这么棒的文章哦~
The end of CONFIG_ANDROID
By Jonathan Corbet
July 4, 2022
DeepL assisted translation
https://lwn.net/Articles/899743/
内核有数千个 config 选项,其中许多选项在以微妙或令人惊讶的方式改变内核的行为。在这些选项中,CONFIG_ANDROID 是一个相对简单的选项,它的完整描述是 "启用对安卓平台所需的各种驱动的支持"。事实证明,这个选项的作用不止于此,这一点令一些用户感到惊讶。这引出了一个删除该选项的计划,但这个计划也引入了一两个意外,以及一些分歧。
讨论开始于 Alex Xu 报告了一个 RCU(read-copy-update)的 error,这个 error 在他的系统从 suspend 状态恢复后会出现。此后不久,Xu 意识到这个问题与他的内核在构建时启用了 CONFIG_ANDROID 这个改动有关;该选项的众多影响之中,它也会大大减少 RCU 开始发出 stall warning 的时间阈值。RCU 的维护者 Paul McKenney 在这件事被报出来之后看起来不太同情:
让我们面对现实吧,CONFIG_ANDROID=y 的意图和目的是非常直截了当和明确无误的。因此,也许不运行安卓设备但又想获得一点安卓功能的人应该采取其他做法,而不是在他们的 .config 文件中直接设置 CONFIG_ANDROID=y。对我来说,我意外的是它怎么花了这么长时间才让你受害。
这个回答来自讨论的一部分,没有直接出现在 archives 中,但可以在 Xu 的回答中看到他引用了这一点,他指出 Debian 和 Fedora 的内核都启用了 CONFIG_ANDROID,因为这是要让 binder module 能工作的唯一方法。Xu 认为,这个选项的意图并不像人们想象的那样 "直截了当和明确无误";这么简单的一行描述中也没有提到改变内部 RCU timeout 值。"如果主要的发行版供应商一直在犯这个'错误',那么也许问题不是出在他们身上"。
Christoph Hellwig 很快就提出了一个 patch,将 CONFIG_ANDROID 完全删除,称其为 "显然是个坏主意"。Greg Kroah-Hartman 同样迅速同意,并将该 patch 排到了下一个合并窗口。没有人反对,直到 Jason Donenfeld 指出,这个 config 还有其他令人意外的影响,删除它可能会在 Android 系统上产生问题。
具体来说,随机数生成器(random-number generator)以及 WireGuard VPN tunnel 的实现都会因系统 suspend 而采取一些措施。随机数发生器将在系统 resume 后重新获取随机数种子,而 WireGuard 将在 suspend 前清除其 key 相关的数据。这两个动作都是为了提高安全性,但由于电源管理的处理方式,它们在安卓系统上可能会出现问题。运行安卓系统的设备是尽量倾向于多睡眠的;它们会找任何机会来进入睡眠状态,以节省电力。经常重置随机数发生器可能会比较低效,而经常清除 WireGuard key 可能会完全破坏通信。为了避免这些问题,如果内核是用 CONFIG_ANDROID 构建的,就不会进行这些举动。
去掉 CONFIG_ANDROID 也就去掉了这种特殊的行为;Donenfeld 担心,这样的变动可能会在未来造成 regression。他要求 Hellwig 保证不会产生这些问题,或者提供一个 fix 这些问题的 patch 作为新版本。随后,双方就谁有责任修复潜在问题、CONFIG_ANDROID 的使用是否正确、删除是否构成用户空间 ABI 的 regression 等问题进行了不太愉快的讨论。
最终,Kroah-Hartman 表示同意 Hellwig 的观点。他说,安卓设备遇到的任何问题,在打了 patch 的内核真正被用到这类设备上时,早就被发现和修复了,但现在的改动可能会修复与 desktop 有关的问题。因此,这一变动似乎很快会合入 mainline 了。
争论的核心是使用 CONFIG_ANDROID 作为系统会要频繁 suspend 和 resume 的指标这一点。但是,正如已经看到的,有许多启用了 CONFIG_ANDROID 的系统并没有表现出这种行为,但无论如何都会采用了相应的行为。也可能有一些系统经常 suspend,本应该采用这种行为,但它们没有运行 Android,也没有启用 CONFIG_ANDROID。大家的共识似乎是,使用 CONFIG_ANDROID 来调节 RCU stall timeout 或加密软件对于电源管理事件的响应动作,这是一个需要 fix 的 bug。
所以,能让随机数和 WireGuard 满意,需要用一些其他的方式来表明系统会经常挂起。有人谈论过采用一个新的配置选项或者一个可以从用户空间写入的 sysfs knob,这就可以允许在运行时来改变行为了。编者建议内核可以观察实际的 suspend 行为并自己来选择正确的行为,这个建议很快就被驳回了。
现在看来,要做的其实是增加一个新的配置选项,叫做 CONFIG_PM_USERSPACE_AUTOSLEEP,这个选项会让内核针对一个频繁 suspend 的系统来进行准备,并启用了(以前)Android 的专用行为。这个选项有一个更详细的 help 信息,描述了它的实际作用,并警告说它 "不应该仅仅为了好玩而启用"。相关的安卓所必需的改动已经被创建,这似乎是一个每个人都满意的解决方案。
不过,这个解决方案的产生方式本可以更好。当开发者为了一个共同的目标而合作,而不是争论谁做得不对的时候,内核社区的工作效果最好。最终确实走向了这样的情况,但是花了不少时间才达到这个效果。多位开发者赋予 CONFIG_ANDROID 一些令人困惑的含义,因此需要好多人才能把它弄清楚就不那么奇怪了。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~