Linux内核小笔记:spin_lock锁内不能使用sleep休眠 | 迟思堂工作室
当前位置: 首页 > Linux内核研究, 嵌入式Linux > 正文

Linux内核小笔记:spin_lock锁内不能使用sleep休眠

有一个字符驱动,内部ioctl函数不同的分支均使用spin_lock和spin_unlock,以保证对外设操作的原子性。但是,有一个功能需要对一个GPIO引脚设置上下沿,于是就使用msplee来延时。结果应用层程序在多个线程中调用该驱动提供的ioctl接口时,发现系列卡死了,只能手动复位。原来不能在spin lock中使用sleep。

首先,执行了sleep,就可能切换到其它进程,此时,并没有调用spin_unlock释放锁。当另外的进程(线程)再次调用同一驱动时,需要获取相同的spin lock,由于之前并没有释放锁,于是就出现死锁了。

鉴于此,只能放弃msleep的做法,而使用循环达到延时的目标。

参考资料:

李迟 2017.1.12 周四 晚

 

如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate

本文固定链接: /embedded-linux/linux-kernel-cant-use-sleep-inside-spinlock.html

Linux内核小笔记:spin_lock锁内不能使用sleep休眠:目前有1 条留言

  1. 1楼
    chaotec:

    为什么不用udelay?

    2017-11-01 下午3:28 [回复]

发表评论

*

快捷键:Ctrl+Enter