跳到主要內容

發表文章

目前顯示的是 5月, 2016的文章

disable_irq() might be lazy in Linux kernel

在 Linux kernel 中,如果要 diable 某個 irq,會使用disable_irq(irq) 這個 API ,而這個 API 有一個有趣的實作:它有可能不會"真的"馬上在硬體上關閉該 irq ,而是到了下一次真的有該 irq 觸發時,才在 flow handler 中進行 disable。相關代碼如下: 252 void irq_disable (struct irq_desc * desc ) 253 { 254 irq_state_set_disabled ( desc ); /* set SW status as disabled */ 255 if ( desc -> irq_data . chip -> irq_disable ) { 256 desc -> irq_data . chip -> irq_disable (& desc -> irq_data ); /* if registered irq_disable() callback, use it */ 257 irq_state_set_masked ( desc ); 258 } else if ( irq_settings_disable_unlazy ( desc )) { 259 mask_irq ( desc ); /* if not disable lazy, mask it */ 260 } 261 } 525 void handle_fasteoi_irq (struct irq_desc * desc ) 526 { 527 struct irq_chip * chip = desc -> irq_data . chip ; 528 529 raw_spin_lock (& desc -> lock ); 530 531 if (! irq_may_run ( desc )) 532 g