收到報文
e1000e_poll
skb變數pfmemalloc的含義
ret = pci_register_driver(&e1000_driver);
pci_driver e1000_driver.probe = e1000_probe
e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
e1000_sw_init(adapter);
e1000e_read_mac_addr(&adapter->hw)
memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
register_netdev(netdev);
err = e1000_request_irq(adapter);
napi_enable(&adapter->napi);
e1000_irq_enable(adapter);
__napi_schedule(&adapter->napi) 注意napi代表乙個device
local_irq_restore(flags);
軟中斷net_rx_softirq handlernet_rx_action
local_irq_disable();
list_splice_init(&sd->poll_list, &list);
local_irq_enable();
關注對ethernet的gro
gro之後就把報文上傳給網路介面層 netif_receive_skb_internal
gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
netif_receive_skb_internal會考慮rps
receive packet steering把報文負載均衡到其他cpu softnetdata 的input_pkt_queue 中
對應 skb->pfmemalloc = 1; 參見 __napi_alloc_skb(struct napi_struct *napi,
Linux e1000e網絡卡驅動
目錄 這樣減少了系統中斷的負載並能降低cpu利用率,但是會增加處理報文的延遲。驅動預設是假定interruptthrottlerate的值是8000,綜合來看,這對所有流量型別的報文都是很好的,但是缺乏對小報文的效能和延遲。硬體每秒能處理更多的小報文,由此乙個自適應的中斷調節演算法就應運而生了。驅動...
isis receive 收包流程
如下 int isis receive struct thread thread 主要流程 1 收包 rx,呼叫註冊的處理函式,例如isis receive bcast p2p 2 處理報文 handle 3 處理下乙個 read on 處理報文的邏輯如下,static int isis handl...
軟中斷和收包流程
open softirq建立型別與handler的對應關係。void open softirq int nr,void action struct softirq action void data netif rx將收到的包放到softnet data的input pkt queue中,之後呼叫ne...