悟空学Linux专栏----第43篇

本文详细记录了悟空在测试无线驱动debugfs功能时遇到的问题,发现发送队列状态位与802.11协议栈状态位不对应,并通过与圆方的合作分析,推测是中断在两步之间修改了状态位导致的问题。最终讨论了解决方案,即使用关中断自旋锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  按照圆方的建议,悟空打开了无线驱动的debugfs功能。悟空通过模拟大数据通信的场景,测试了一个多小时候,发现无线果然不再发送数据了。悟空查看了debugfs之后,发现发送队列的状态位和802.11协议栈的状态出现了冲动。发送队列的状态为显示为802.11协议栈没有挂起,而802.11协议栈的状态却是挂起的状态。这让悟空怎么也想不通,所以悟空再次找到了圆方。

  悟空曰:从测试的结果来看,发送队列的状态位,和802.11协议栈的状态位没有对应上。那么是什么原因导致了没有对应起来呢?圆方,你怎么看呢?

  圆方曰:我们先来分析一下发送的挂起流程。


  从这个图中我们可以看出设置802.11状态为的挂起和真正挂起802.11网络协议栈,其实是由两步组成的,所以我分析猜测,应该是在这两步之间被其他的程序修改了状态位的值。

  悟空曰:不可能啊,程序中虽然是由两步组成,但是在这两部之间设计人员已经加入了自旋锁啊。加入自旋锁之后按理来说,是不应该被打断的啊,难道是灵异事件。圆方,你怎么看呢?

  圆方曰:自旋锁的使用分很多种方法的,而且自旋锁是不能被进程和软中断打断,但是却可以被中断打断。因此如果在这两步之间插入一个中断,而且这个中断还修改了状态位的值,就会出现我们现在测试的情况。

  悟空曰:那么怎样才能不让中断打断呢?

  圆方曰:其实很简单,可以直接使用关中断自旋锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值