TCP IP學習 32 軟中斷的處理詳細分析

2021-06-22 19:15:40 字數 2265 閱讀 9167

摘自:

為了更好的併發性和更快的響應,軟中斷是網絡卡驅動使用bottom-half方式。軟中斷的處理方式有兩種,一種是在各個檢查點呼叫do_softirq去處理,還有就是由核心執行緒ksoftirqd週期檢查,如有pending的軟中斷,仍然是呼叫do_softirq去處理。

首先看直接呼叫do_softirq(或__do_softirq)的地方:

1. 中斷處理do_irq,

unsigned int __irq_entry do_irq(struct pt_regs *regs)

void irq_exit(void)

2. 系統呼叫,任何interrupt或exception返回時;

3. local_bh_enable中:當然了,重新enable bh,這時只要有pending的軟中斷,自然要執行了;

4. 在有的書中還說在kernel的**中,還有一些地方由於執行時間可能稍長,也會呼叫do_softirq處理軟中斷——目前看的kernel**不夠多,暫未發現。並且這點不影響今天的主題。

處理軟中斷的函式就是do_softirq。因為軟中斷的處理有些是與平台相關的,所以有的平台需要自己的實現。此處以x86平台為例,do_softirq位於arch/x86/kernel/irq_32.c。

asmlinkage void do_softirq(void)

/* 恢復中斷標誌 */

local_irq_restore(flags);}

從這個函式看,好像在做軟中斷時,中斷是被關掉的——這與我們的認知是不同的。實際上在真正的worker __do_softirq會enable中斷。所以軟中斷的處理時,並沒有關中斷,也因此可以被中斷。

下面看__do_softirq

asmlinkage void __do_softirq(void)

rcu_bh_qs(cpu);}

h++;pending >

>

= 1;

}while

(pending);

/* 再關中斷 

*/local_irq_disable();

/* 再檢查pending的軟中斷,因為在之前的處理軟中斷的過程中,很可能發生了新的中斷,並設定了新的軟中斷標誌位,所以需要再次檢查 */

pending = local_softirq_pending();

/* 如果有了新的pending並且沒有超過最多的迴圈限制,那麼就繼續處理軟中斷。

之所以要加乙個最多的迴圈處理限制,因為在網路負載比較大的環境,網絡卡會產生很多軟中斷。如果沒有迴圈,那麼kernel就把大部分時間集中在軟中斷處理上,而無法處理其他工作。

*/if

(pending &&-

-max_restart)

goto restart;

/* 還有軟中斷剩下沒有處理,那麼就喚醒softirqd去處理剩下的軟中斷 

*/if

(pending)

wakeup_softirqd();

lockdep_softirq_exit();

account_system_vtime(current)

;/* enable bh*/

__local_bh_enable(softirq_offset);}

下面看看ksoftirqd的**

static int run_ksoftirqd(void * __bind_cpu)

__set_current_state(task_running);

/* 有pending的軟中斷 */

while

(local_softirq_pending())

preempt_enable();

set_current_state(task_interruptible);}

__set_current_state(task_running)

;return 0;

wait_to_die:

preempt_enable();

/* wait for kthread_stop *

/set_current_state(task_interruptible)

;while

(!kthread_should_stop())

__set_current_state(task_running)

;return 0;}

雖然ksoftirqd是乙個核心執行緒,但是由於眾多的do_softirq的呼叫點,所以真正由ksoftirqd處理的軟中斷並不多。

ok,這就是軟中斷處理的詳細流程分析。

網路處理的軟中斷機制分析

首先需要介紹的就是netif rx 在net core dev.c中定義 函式,這個函式在網絡卡驅動程式與linux核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff形式 插入核心維護的接收緩衝區佇列當中 int netif rx struct sk buff skb if queue...

網路處理的軟中斷機制分析

核心預設軟中斷機制分析 process backlog 首先需要介紹的就是 netif rx 在net core dev.c 中定義 函式,這個函式在網絡卡驅動程式與 linux 核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff 形式 插入核心維護的接收緩衝區佇列當中 int net...

網路處理的軟中斷機制分析

核心預設軟中斷機制分析 process backlog 首先需要介紹的就是netif rx 在net core dev.c中定義 函式,這個函式在網絡卡驅動程式與linux核心之間建立了一道橋梁,將網絡卡接收上來的資料報 sk buff形式 插入核心維護的接收緩衝區佇列當中 int netif rx...