2

我正試圖理解Linux內核中的NAPI實現。這些是我基本的疑問。NAPI中斷禁用和處理共享中斷線

1)NAPI禁止進一步的中斷,並處理skbs'使用輪詢

  • 誰禁止呢?
  • 中斷處理程序是否應該禁用它?

    如果是 - 禁用中斷和處理實際輪詢完成的SOFTIRQ net_rx_action之間的時間間隔不是太大。

2)默認在下半區使用輪詢接收單個幀禁止中斷,處理剩餘的幀的所有NAPI啓用驅動程序? 還是有一個邏輯,只有當幀> 32(連續接收IRQ處理程序中的所有幀)切換到輪詢模式?

3)現在來共享IRQ -

  • 發生了什麼其它設備的中斷,其他設備下半部分可能無法運行,因爲這些設備是不存在的poll_list。

回答

5

我寫了一本關於網絡驅動程序,NAPI等更多內容的全面指南,所以請查看。

至於你的問題:

  1. 設備的IRQ應該啓用NAPI後,由駕駛者的IRQ處理程序禁用。是的,有一段時間差距,但應該很小。這是您必須做出權衡決定的一部分:您是否更關心吞吐量或延遲?根據哪個,您可以適當地優化您的網絡堆棧。在任何情況下,大多數NIC都允許用戶增加(或減少)跟蹤傳入網絡數據的環形緩衝區的大小。所以,暫停是好的,因爲數據包稍後將被排隊等待處理。

  2. 它取決於驅動程序,但一般情況下,一旦大多數驅動程序在調用napi_schedule時(通常)觸發IRQ處理程序,將啓用NAPI輪詢模式。你可以找到一個演練如何NAPI is enabled for the Intel igb driver here.請注意,IRQ處理程序不一定每個單個數據包被解僱。通過使用名爲interrupt coalescing的功能,您可以調整IRQ處理程序在大多數卡上觸發的速率。某些網卡可能不支持此選項。

  3. 由於IRQ處理程序在CPU上具有非常高的優先級,所以在IRQ被觸發時,其他設備的IRQ處理程序將被執行。 NAPI輪詢循環(在SoftIRQ中運行)將在設備IRQ處理的任何CPU上運行。因此,如果您有多個NIC和多個CPU,則可以調整每個NIC的IRQ的IRQ關聯性,以防止捱餓特定的NIC。

  4. 至於例子,你在評論中問到:

說NIC 1和NIC 2共享IRQ線,讓我們假設NIC 1是低負荷時,NIC 2高負荷和NIC 1接收到中斷,NIC 1的驅動程序將禁用中斷,直到處理完softirq,將時間間隔稱爲t1。因此,對於時間t1,NIC 2中斷被禁用,對吧?

這取決於驅動程序,但在正常情況下,NIC 1只在IRQ處理程序執行時禁用中斷。對napi_schedule的調用告訴softirq代碼,如果尚未啓動,它應該開始運行。 softirq代碼異步運行,因此沒有NIC 1不等待softirq被處理。

現在,就共享IRQ而言:再次取決於設備和驅動程序。驅動程序的編寫方式應該可以處理共享的IRQ。如果驅動程序禁用正在共享的IRQ,則共享該IRQ的所有設備都不會收到中斷。這會很糟糕。有些設備解決這個問題的一種方式是允許驅動程序讀/寫特定的寄存器,使特定設備停止產生中斷。這是首選解決方案,因爲它不會阻止其他設備生成相同的IRQ。

當NAPI的IRQ禁用時,意味着驅動程序要求NIC硬件停止發送IRQ。因此,同一行(其他設備)上的其他IRQ仍將繼續處理。下面是Intel igb driver通過寫入寄存器關閉該器件的IRQ的示例。

+0

謝謝理解1&2,但是3我還不清楚,比如說NIC 1和NIC 2共享IRQ線,讓我們假設NIC 1是低負載,NIC 2高負載,NIC 1接收中斷,NIC 1的驅動程序將會禁用中斷,直到它處理了softirq,並將時間間隔稱爲t1。因此,對於時間t1,NIC 2中斷被禁用,對吧? – Pramod

+0

@Pramod,啊行。我更新了上面的答案 - 讓我知道是否有幫助。對不起,我誤解你在問什麼。您想知道兩臺共享IRQ的設備如何禁用IRQ以開始使用NAPI而不會阻塞其他設備。是對的嗎?如果是這樣,我認爲我的補充信息解釋了這一點。 –

+0

@Pramod我剛剛做了另一次更新並鏈接到了intel IGB源,因此您可以看到它是如何禁用該NIC的中斷的。 –