You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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选项,避免加载存在问题的驱动路径。
  • 驱动修复方案:
    • 将RX时间戳操作迁移至进程上下文:通过工作队列(workqueue)异步处理时间戳获取逻辑,在进程上下文中安全获取MDIO总线互斥锁,避免原子上下文睡眠;
    • 替换MDIO总线锁类型:将互斥锁替换为自旋锁(spinlock),自旋锁在原子上下文使用不会触发睡眠,但需确保MDIO操作耗时极短,避免长时间占用自旋锁导致系统响应延迟;
    • 内核补丁适配:检查Linux内核社区是否已有相关修复补丁,若没有,可编写驱动修复补丁提交至内核邮件列表,修正vsc85xx_rxtstamp函数的上下文问题。

内容的提问来源于stack exchange,提问作者Sergey Mikayelyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:14