作者gn00618777 (123)
看板C_and_CPP
标题[问题] spinlock问题
时间Mon Jan 30 22:25:19 2023
板友们晚安
我想请教一个Linux Kernel的问题,但看了Linux板,感觉不是在讨论code。
所以我就来这里发文看看。若我在这边发文不适合可以在下面回文,我会
再删除,谢谢。
我在【知乎】这个平台看到有关於spin_lock_irq()的介绍
https://reurl.cc/eWe4lb
里面有个图关於spin_lock_irq(&lock1)後再一次spin_lock_irq(&lock2)
紧接着spin_unlock_irq(&lock2)後,CPU发生了interrupt,若好死不死
这ISR内要执行lock1所保护的critical section,由於前面已有task获取
到lock1的锁了,ISR内铁定拿不到lock1便会deadlock.
其实我不太知道为何deadlock的原因。查了网路上的说明更加混乱了...
这有两种deadlock的原因请问是哪一种呢?
1.ISR内因获得不到锁所以永久的spin,所以先前拿到锁的task也因此无法解锁.
2.先前拿到锁的task在被中断後状态变成TASK_INTERRUPT,schedual无法再调度
task使之有机会解锁,这意味着ISR内不会永久spin,且有一定的时间霸占CPU?
希望能有kernel高手能解答小弟疑惑@@,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.224.93.106 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1675088723.A.42F.html
1F:推 wulouise: ISR lock要等被interrupt的task unlock->可是cpu不会切 01/30 22:36
2F:→ wulouise: 永远等不到task unlock-> deadlock 01/30 22:36
3F:→ saxontai: 有LinuxDev版。 01/30 22:52
4F:→ KaiNBD: 原因如楼上,另外这主要是说明 spin_lock_irqsave 的需求 01/30 23:27
5F:→ KaiNBD: 因 lock_irq 没有处理 nested,导致 unlock_irq(&lock2)时 01/30 23:28
6F:→ KaiNBD: 就立即 enable IRQ,因此进入 deadlock 状态。 01/30 23:29
7F:→ KaiNBD: 修正上述: 有机会进入 deadlock 状态 01/30 23:30
8F:→ KaiNBD: 改用 lock_irqsave 後才能在 unlock 时回复先前 IRQ 状态 01/30 23:31
9F:→ KaiNBD: 而非无脑启用 IRQ。进而解决了误启用 IRQ 导致的 deadlock 01/30 23:32
10F:→ gn00618777: 请问原因是我列的第一种情况吗? ^^" 再确认一下 01/31 21:10
11F:推 dces4212: 你这句「schedual无法再调度 02/02 19:50
12F:→ dces4212: task使之有机会解锁」是啥意思?没法被排程的话,给定t 02/02 19:50
13F:→ dces4212: ask怎麽解开原先获得的锁? 02/02 19:50
14F:→ gn00618777: 我的意思是想说第2, ISR不会霸占CPU, OS透过schedual 02/02 21:37
15F:→ gn00618777: 让其他task使用CPU,只是不会给有lock的task。 02/02 21:40
16F:→ gn00618777: 因为也是从网路上看的,我也不知道是不是第2点而造成 02/02 21:41
17F:→ gn00618777: deadlock 02/02 21:42
18F:推 lc85301: ISR 霸占 CPU 的理由是,interrupt 会设定较高的优先权 02/04 10:01
19F:推 lc85301: 优先处理,但 ISR 又卡死在抢占 lock 的工作 02/04 10:02
20F:推 lc85301: 时间到了 timer interrupt 跳起来,CPU 进到 scheduler 02/04 10:03
21F:推 lc85301: scheduler 会选定优先权高的程序,也就是 ISR 继续执行 02/04 10:04
→ gn00618777: lc大,schedual会选定优先权高的程序这句我不
太认同 02/08 21:32
22F:→ gn00618777: 因为查了资料,ISR并不是process,也就不会被schedual 02/08 21:33
※ 编辑: gn00618777 (36.224.72.25 台湾), 02/08/2023 21:47:28
24F:推 lc85301: 这样说有道理,应该说 ISR 是中断处理,除非有权限更高的 02/08 22:42
25F:推 lc85301: interrupt,否则它不会被 timer interrupt 打断 02/08 22:42
26F:推 lc85301: 所以一但 ISR 在等待某个资源解锁,CPU 就直接卡死在那里 02/08 22:43