首先我們看一下一個主流多隊列網卡(E1000)跟多核CPU之間的關系圖:
非多隊列:
linux的網卡由結構體net_device表示,一個該結構體對應一個可以排程的資料包發送隊列。
資料包的實體在核心中以結構體sk_buff(skb),形如:
多隊列:
一個網卡可以擁有多個隊列
接下來,看看TX引擎是如何工作的(注:對于發送和接收資料包有兩個名詞,分别應對TX,RX)
解釋:
函數-dev_queue_xmit():入隊一個buffer以傳輸到網絡驅動裝置。
配合該函數的源碼來解釋上圖的傳輸過程:
步驟一:可以看到如果裝置支援隊列,則資料包入裝置隊列。在入隊操作前後,有加鎖和釋放隊列鎖的過程。
步驟二:調出裝置的qdisc(該對象是隊列的排隊規則)
QDisc(排隊規則)是queueingdiscipline的簡寫,它是了解流量控制(traffic
control)的基礎。無論何時,核心如果需要通過某個網絡接口發送資料包,它都需要按照為這個接口配置的qdisc(排隊規則)把資料包加入隊列。然後,核心會盡可能多地從qdisc裡面取出資料包,把它們交給網絡擴充卡驅動子產品。最簡單的QDisc是pfifo它不對進入的資料包做任何的處理,資料包采用先入先出的方式通過隊列。不過,它會儲存網絡接口一時無法處理的資料包。
步驟三:重置skb的隊列映射,置為0
步驟四:tx lock->hard_start_xmit
到這裡,我們好像沒有看到tx_lock、hard_start_xmit函數,反而我們在無隊列的裝置分支中看到了這些:
Dev_hard_start_xmit的定義:
很明顯我們應該撥開雲霧看到一些本質,再次回到裝置支援隊列的分支中(這才是我們關心的):
不管怎麼樣,你總該有發送的函數調用吧,就是下面圈起來的這個:
果不其然,這是一個封裝函數:
參考:
<a href="http://www.landley.net/kdocs/ols/2007/ols2007v2-pages-305-310.pdf" target="_blank">http://www.landley.net/kdocs/ols/2007/ols2007v2-pages-305-310.pdf</a>
<a href="http://vger.kernel.org/~davem/davem_nyc09.pdf" target="_blank">http://vger.kernel.org/~davem/davem_nyc09.pdf</a>
<a href="http://www.chineselinuxuniversity.net/kerneldocs/networking/API-dev-queue-xmit.html" target="_blank">http://www.chineselinuxuniversity.net/kerneldocs/networking/API-dev-queue-xmit.html</a>
<a href="http://apps.hi.baidu.com/share/detail/36206005" target="_blank">http://apps.hi.baidu.com/share/detail/36206005</a>
<a href="http://cache.baidu.com/c?m=9d78d513d98017f419bc837f7d01d0120e55f0237b8bc7150ec3e54c84145d563164f4cd25351174c4b5777075d95e2cebe74703234460e99492ce0c9fac935b3295776a2d499141658243f4971532c157c304b2ff4ab7e9e732e4ff8f8cc2040d97061832daabc8015c41ca65ed4771a5fdc816424240b8fa3013a4537d2c992742b750f997682858df&p=ce7ddc1187904eac59b5c4710e14d625&user=baidu&fm=sc&query=qdisc_run+%D6%B4%D0%D0%B9%FD%B3%CC&qid=f6ae9cf00151dde4&p1=1" target="_blank">http://cache.baidu.com/c?m=9d78d513d98017f419bc837f7d01d0120e55f0237b8bc7150ec3e54c84145d563164f4cd25351174c4b5777075d95e2cebe74703234460e99492ce0c9fac935b3295776a2d499141658243f4971532c157c304b2ff4ab7e9e732e4ff8f8cc2040d97061832daabc8015c41ca65ed4771a5fdc816424240b8fa3013a4537d2c992742b750f997682858df&p=ce7ddc1187904eac59b5c4710e14d625&user=baidu&fm=sc&query=qdisc%5Frun+%D6%B4%D0%D0%B9%FD%B3%CC&qid=f6ae9cf00151dde4&p1=1</a>
<a href="http://lwn.net/Articles/289137/" target="_blank">http://lwn.net/Articles/289137/</a>
原文釋出時間為:2012-04-21