2018年8月21日 星期二

Linux interrupt

Q: Difference between enable_irq_wake and enable_irq
A: (not validated) https://stackoverflow.com/questions/26331348/difference-between-enable-irq-wake-and-enable-irq
If you check here, you'll see that enable_irq_wake invokes set_irq_wake_real that does not enable the irq.
Further more, take for example this driver: they enable/disable_irq the irq at open/close, while they enable/disable_irq_wake at suspend/resume.

Q: Difference between request_irq and request_threaded_irq
A:
extern int __must_check request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev); 

static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)
{ return request_threaded_irq(irq, handler, NULL, flags, name, dev); }

handler : top half handler that can only (?) invoke limited APIs. Real-time response is expected.
thread_fn : bottom half handler that runs in kernel thread.

https://blog.csdn.net/qwaszx523/article/details/52635431
分析request_threaded_irq()函數中的各個形參
1>:irq:表示申請的中斷號。
2>:handler:表示中斷服務例程
3.> thread_fn:中斷線程化,此處傳遞的是NULL。NULL表示沒有中斷線程化。
    在Linux中,中斷具有最高的優先級。不論在任何時刻,只要產生中斷事件,內核將立即執行相應的中斷處理程序,等到所有掛起的中斷和軟中斷處理完畢後才能執行正常的任務,因此有可能造成實時任務得不到及時的處理。中斷線程化之後,中斷將作為內核線程運行而且被賦予不同的實時優先級,實時任務可以有比中斷線程更高的優先級。這樣,具有最高優先級的實時任務就能得到優先處理,即使在嚴重負載下仍有實時性保證。but,並不是所有的中斷都可以被線程化,比如時鐘中斷,主要用來維護系統時間以及定時器等,其中定時器是操作系統的脈搏,一旦被線程化,就有可能被掛起,這樣後果將不堪設想,所以不應當被線程化。 
4>.irqflags:表示中斷標誌位。
5>.devname:表示請求中斷的設備的名稱。
6>.dev_id: 對應於request_irq()函數中所傳遞的第五個參數,可取任意值,但必須唯一能夠代表發出中斷請求的設備,通常取描述該設備的結構體。共享中斷時所用。

http://webcache.googleusercontent.com/search?q=cache:MTmrEGHefQ8J:angledark0123.pixnet.net/blog/post/57650121-linux-request_threaded_irq%2528%2529-%25E8%2588%2587-request_irq%2528%2529-%25E5%25B7%25AE%25E7%2595%25B0+&cd=1&hl=zh-TW&ct=clnk&gl=tw

這幾年linux新增進來的function,讓irq handle能更簡潔快速,一些會sleep的動作可以在一開始request irq 的時候就指定好要由kernel thread來執行

也因為是在kernel context下執行,所以他不受interrupt context的atomic限制,可以有sleep的動作(像是i2c,spi和semaphore)
傳統的irq handle只能用worqueue或是tasklet等來處理bottom half的部份,top half 就考量到hw interrupt不能咬住太久所以要馬上放掉
這種新的threaded irq 能夠再hw irq上得到更快速的處理吧
然後interrupt process的pid 其實不存在,他顯示的是interrupt進來前被中斷的process的pid,所以你會看到interrupt process可能並沒有固定pid的原因就是這個
p.s 要確定你寫code的地方是不是atomic可以用might_sleep() 來確定,如果再的地方是atomic 也就是不能sleep和preempt的地方,在log裏面你會看到他會顯示isatomic &call stack
注意這個isatomic不會狂吐,他是有timer固定一段時間吐一下的


沒有留言: