一个即将在 Linux 6.20~7.0 内核周期中引入的新功能是可撤销资源管理。
谷歌工程师施宗比开始编写这段代码以修复 ChromeOS EC 平台驱动代码中可能存在的 use-after-free 情况。可撤销资源管理随后发展出自己的独立基础设施代码,这就是即将在 Linux 6.20~7.0 内核周期中呈现的内容。
上周已排队进入驱动核心代码的”driver-core-next” Git 分支的是可撤销资源管理的引入,施宗比将其解释为:
某些资源可以异步移除,例如由 USB 等热插拔设备提供的资源。当持有此类资源的引用时,资源可能会被移除并释放其内存,导致后续访问时出现使用后释放错误。
“可撤销”机制通过建立对可能随时被释放的资源弱引用来解决这个问题。它允许资源消费者安全地尝试访问资源,保证在资源使用期间访问有效,或者在资源已被撤销时安全地失败。
该实现基于 Sleepable RCU(SRCU)构建了提供者/消费者模型,以确保安全的内存访问:
– 资源提供者,例如可热插拔设备的驱动程序,分配一个 struct revocable_provider 并将其初始化为指向资源的指针。
– 想要访问资源的资源消费者分配一个 struct revocable,它作为一个句柄包含对提供者的引用。
– 为了访问资源,消费者使用 revocable_try_access()。该函数进入 SRCU 读取端临界区并返回指向资源的指针。如果提供者已经释放了资源,它将返回 NULL。使用后,消费者调用 revocable_withdraw_access()退出 SRCU 临界区。REVOCABLE_TRY_ACCESS_WITH()和 REVOCABLE_TRY_ACCESS_SCOPED()是方便的辅助函数,用于完成这些操作。
– 当提供者需要移除资源时,它会调用 revocable_provider_revoke()。这个函数将内部资源指针设置为 NULL,然后调用 synchronize_srcu()来等待所有当前读者完成,以便资源可以被完全销毁。
这项可撤销资源管理基于在 LPC 2023 演示中提出的想法。

由于基础设施现在位于 driver-core-next 中,如果没有最后时刻出现的问题,它应该会在下一个 Linux 内核合并窗口中找到。在那之后,更多的 Linux 内核驱动代码将能够开始在未来的补丁中使用这项可撤销代码。
转自 Revocable Resource Management Appears On Track For Linux 7.0 – Phoronix
Linuxeden开源社区