gpt4 book ai didi

Linux驱动资源保护

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:13 25 4
gpt4 key购买 nike

我正在编写一个 Linux 设备驱动程序并且在这方面还很陌生,所以我很快就学会了如何不做这些事情。我目前正在使用几个互斥锁来防止某些功能同时从设备读取并在从挂起恢复时遇到死锁。我的问题有两个方面:

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

2) 设备配置功能是使用与上述相同的读取、写入功能的一系列读取和写入,必须在不被其他读取或写入中断的情况下完成,因此我在配置功能中放置了互斥锁 (B) 锁定/解锁.设备配置函数由 SYSFS 节点调用。

问题似乎是当系统从挂起恢复时,中断触发 FIFO 调用,几乎同时更高层写入 SYSFS 节点以设置配置参数,系统似乎在配置序列期间死锁。我的问题只是我使用的互斥锁睡在我应该使用自旋锁的地方吗?还是我的做法有误?

最佳答案

  1. 获得中断。
  2. 在中断处理程序中确认/禁用中断。
  3. 启动工作队列。
  4. 执行高优先级处理,例如将数据从设备中取出并放入队列中。
  5. 启用设备中断并去处理工作队列中优先级较低的数据。

这里的两个不同的互斥锁是行不通的,因为锁定顺序可能是 A->B [在持有互斥锁 A 的同时尝试获取互斥锁 B],而另一条路径是 B->A,这是教科书般的致命拥抱。

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

如果忙碌/可用的测试不仅仅是是/否测试,请使用条件变量来保护必须完成的复杂测试。

关于Linux驱动资源保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com