Linux驱动资源保护

时间:2015-07-05 21:57:35

标签: linux device-driver

我正在编写一个Linux设备驱动程序而且我很擅长这个,所以我很快就会学习如何不做事情。我目前正在使用几个互斥锁来防止某些函数同时从设备读取并在从暂停恢复时遇到死锁。我的问题有两方面:

1)中断处理程序调度工作队列以从设备的FIFO读取并处理数据。 FIFO需要不被其他读取中断读取,因此我在读取,写入函数中放置了互斥锁(A)锁定/解锁。

2)设备配置功能是一系列读写操作,使用与上面相同的读写功能,必须不受其他读写操作的影响,因此我在配置功能中放置了互斥锁(B)锁定/解锁功能。设备配置功能由SYSFS节点调用。

问题似乎是当系统从挂起恢复时,中断触发FIFO调用,并且几乎同时更高层写入SYSFS节点以设置配置参数,并且系统在配置序列期间似乎死锁。我的问题只是因为我正在使用互斥锁,它睡在我应该使用自旋锁的地方吗?或者我是以错误的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

  1. 获得中断。
  2. 在中断处理程序中确认/禁用中断。
  3. 开始工作队列。
  4. 执行高优先级处理,例如从设备获取数据并进入队列。
  5. 启用设备中断并处理工作队列中的低优先级数据。
  6. 这里有两个不同的互斥锁不能正常工作,因为锁定顺序可能是A-> B [其中试图在保持互斥锁A的同时获取互斥量B]而另一个路径是B-> A,这是教科书致命的拥抱。 / p>

    解决方案是将您的处理重新构建为高优先级的工作(非常有限的任务),以便为低优先级的工作提供数据。

    如果busy / availables的测试不仅仅是yes / no测试,请使用条件变量来保护复杂的测试。

相关问题