☰
AI审计定时器退出路径:锁循环之外,还要检查重新挂载
2026/10/25 17:54:47 网站建设 项目流程

把del_timer_sync从自旋锁里挪出去,能解决一类互等问题;但设备退出以后,工作队列又把定时器挂回去怎么办?这两件事最好分开审。

本文讨论供AI辅助阅读的检查方法,没有真实驱动漏洞战绩,也没有调用GLM给出效果分数。旧厂商内核常见del_timer_sync等名称,访问时的主线文档使用timer_delete_sync、timer_shutdown_sync。写补丁前应先固定目标树,再看该树提供的API。

第一张图:谁持有谁要等的锁

设退出路径S持有锁L并等待回调C结束;回调C又要取得L。等待关系成为S → C → L → S,这就值得停止“自动修复”并人工检查。实际内核里还需核对IRQ/softirq上下文、timer是否irqsafe以及目标配置。

Linux官方API文档给出了同步删除相关的锁约束,并明确指出:同步删除不保证其他并发路径不会马上重新挂载定时器。Driver Basics

第二张图:谁还能重新提交工作

如果timer可以提交work,work又可以重挂timer,只让当前回调结束仍不够。退出过程需要切断新的业务提交,并用目标内核支持的机制终止重挂关系。

文档中的timer_shutdown_sync保证返回时timer未排队、回调未运行且不能再被重挂;它仍有同步规则,不能在任何持锁或原子上下文里随意调用。针对文档描述的timer/workqueue互相调度模式,顺序是先shutdown timer,再销毁workqueue,之后才能释放承载对象。官方接口语义

图是检查关系示意,不是可直接套给每个驱动的卸载实现。设备中断、其他work和引用计数可能仍然持有对象;把一个函数名替换成另一个函数名,不会自动处理这些拥有者。

用一个小模型说明两项检查的区别

保存为timer_model.py:

def wait_cycle(edges): def visit(node, stack, done): if node in stack: return True if node in done: return False stack.add(node) if any(visit(n, stack, done) for n in edges.get(node, [])): return True stack.remove(node) done.add(node) return False done = set() return any(visit(n, set(), done) for n in edges) def can_rearm(shutdown): return not shutdown if __name__ == "__main__": assert wait_cycle({"stop": ["callback"], "callback": ["lock"], "lock": ["stop"]}) assert not wait_cycle({"stop": ["callback"], "callback": []}) assert can_rearm(False) assert not can_rearm(True) print("lock cycle and rearm are independent checks: 4 cases passed")

运行python3 timer_model.py。Python 3.9.6下四个构造用例通过:有锁循环、移除循环、允许重挂和禁止重挂是不同判断。这个脚本只有图与布尔状态,没有Linux计时器,也不证明真实回调能安全退出。

把代码交给GLM时,我会要求它分别输出“等待关系”和“仍可能提交任务的路径”,并附依据行。至少要提供timer初始化、回调、work入口、退出入口以及停止标志的读写位置。上下文缺失时应返回证据不足,不应补造一个看起来合理的锁。

后续若做模型比较,应冻结模型ID、推理参数与输入,保存原始输出;现在没有这些记录,就不能说GLM发现了某个生产死锁。GLM-5.3参数文档

真实补丁的验收还包括:目标树构建、重复装卸、并发提交、回调重挂以及适当调试配置的检查。测试须在专用虚拟机或设备上做,不能用生产系统故意撞死锁。本文未运行内核实验;本地四个用例只是审阅思路的辅助。原封面保留为AI阅读并发路径的概念图,不代表已发现漏洞。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询