调试超级块 percpu_rw_semaphore 死锁

2024-12-09

本文分析了一个内核死锁问题,其中进程 mariadbd 和 peer local sock 被阻塞。作者通过分析内核转储文件发现,veeamblksnap 模块在尝试冻结超级块时陷入了死锁。v6.8 内核的 percpu_down_write() 函数试图获取 percpu sb->s_writers.rw_sem 信号量的写锁,但它正在等待其他读者完成。进一步分析发现,一个写进程和两个读进程正在等待所有之前的读者完成,而 io_uring 的参与使得查找这些读者变得复杂。最终,作者通过搜索 LKML 发现,该死锁问题已在 v6.12 内核中得到修复,修复补丁最终将被反向移植到旧内核。