MSCC Linux驱动(MICROSEMI_PHY)RX时间戳内核恐慌问题咨询
Linux MSCC驱动RX时间戳原子上下文睡眠引发内核恐慌问题分析与解决
问题背景
在启用MICROSEMI_PHY配置的Linux MSCC驱动中,接收时间戳(RX timestamping)操作运行在原子上下文,但该操作需要锁定MDIO总线。由于等待互斥锁解锁时会触发睡眠,调度器切换至其他工作线程后直接引发内核恐慌。
当PTP4l运行时,会创建带有SN_TIMESTAMPING属性的套接字,内核MSCC驱动会尝试对传入的delay_req或sync报文打时间戳。报文到达时,vsc85xx_rxtstamp函数被调用处理RX时间戳操作,此时因原子上下文睡眠触发调度器切换,最终导致内核恐慌。
dmesg日志信息如下:
BUG: scheduling while atomic: swapper/0/0/0x00000100 bad: scheduling from the idle thread!
预期行为:内核不应因RX时间戳操作崩溃;若RX时间戳处于原子上下文,则不应存在会导致睡眠的互斥锁操作。
问题定性
这属于MSCC驱动的Bug。Linux内核规范明确要求:原子上下文(如中断上下文、持有自旋锁的上下文)中禁止调用任何可能导致睡眠的函数,而获取互斥锁(mutex_lock)就是典型的会触发睡眠的操作。驱动在原子上下文中执行MDIO总线互斥锁锁定,违反了内核编程规范,进而引发调度器异常。
规避与修复方法
- 临时规避方案:
- 关闭PTP时间戳功能,停止使用带
SN_TIMESTAMPING属性的套接字; - 不启用内核配置中的
MICROSEMI_PHY选项,避免加载存在问题的驱动路径。
- 关闭PTP时间戳功能,停止使用带
- 驱动修复方案:
- 将RX时间戳操作迁移至进程上下文:通过工作队列(workqueue)异步处理时间戳获取逻辑,在进程上下文中安全获取MDIO总线互斥锁,避免原子上下文睡眠;
- 替换MDIO总线锁类型:将互斥锁替换为自旋锁(
spinlock),自旋锁在原子上下文使用不会触发睡眠,但需确保MDIO操作耗时极短,避免长时间占用自旋锁导致系统响应延迟; - 内核补丁适配:检查Linux内核社区是否已有相关修复补丁,若没有,可编写驱动修复补丁提交至内核邮件列表,修正
vsc85xx_rxtstamp函数的上下文问题。
内容的提问来源于stack exchange,提问作者Sergey Mikayelyan
相关产品推荐
相关产品推荐

