- 论坛徽章:
- 0
|
谢谢热心的版主!这个问题有答案了:
首先,如果系统中如果有不支持SG的网卡,则在调用dev_queue_xmit时会检查到这个情况,
然后将skb做线性化处理__skb_linearize(skb),所以不存在报文发送不通的情况:
if (skb_has_frags(skb) &&
!(dev->features & NETIF_F_FRAGLIST) &&
__skb_linearize(skb))
goto out_kfree_skb;
/* Fragmented skb is linearized if device does not support SG,
* or if at least one of fragments is in highmem and device
* does not support DMA from it.
*/
if (skb_shinfo(skb)->nr_frags &&
(!(dev->features & NETIF_F_SG) || illegal_highdma(dev, skb)) &&
__skb_linearize(skb))
goto out_kfree_skb;
但是,这样会严重降低系统的数据吞吐量,因为线性化的过程无非就是数据的copy,比较耗资源。
目前很多无线网卡驱动都是不支持SG,即nonlinear的处理,因为802.11n之前,最高速率达到40多M已经相当不错了,不过由于11n协议将来300M的性能要求,以后无线网卡驱动必定会做出优化,以支持此特性。 |
|