本文档的 Copyleft 归 wwwlkk 所有,使用 GPL 发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁
用于任何商业用途。
E-mail: wwwlkk@126.com
来源: http://passport.baidu.com/?business&aid=6&un=wwwlkk#7
多 CPU 下基于 e1000e 驱动的数据包以及网卡中断流程分析
图 1 e1000e 网卡收包环和发包环控制
收包环说明:
next_to_clean 和 next_to_use 是内核读写的;
rdt 是内核写,网卡只读;
rdh 是网卡写,内核只读;
next_to_clean 和 rdh 之间的是已经接收到数据包的内存;
rdh 和 rdt 之间是还未接收到数据包的内存;
next_to_use 后的是还未使用的区域。
发包环说明:
next_to_clean 和 next_to_use 是内核读写的;
tdt 是内核写,网卡只读;
tdh 是网卡写,内核只读;
next_to_clean 和 tdh 之间的是已经发送的数据包,可以被释放;
rdh 和 rdt 之间是发送的数据包;
next_to_use 后的是还未使用的区域。
网卡产生中断的时机,一共 3 个:
1) 当网卡接收到一个数据包,并通过 DMA 方式写入内存,此时网卡会向前移动 rdh,并发送网
卡中断。
2) 网卡发送完数据包,并移动 tdh,当 tdh 移动次数达到一定数量,或者 tdh 等于 tdt 的时候会发
生网卡中断。
3) 如果不发送也不接收数据包,网卡也会定时产生中断,比如一秒一次。
以上 3 个时机产生相同的中断信号,所以会调用相同的中断处理例程。
说明:这里对时机的总结是通过实验获得,不是很精确,但是基本上是正确的。
网卡只是产生网卡中断,但是网卡不能决定由哪个 CPU 来响应中断。在多 CPU 体系下,由中断
控制器来决定由哪个 CPU 响应中断。
图 2 是 linux-2.6.35 在没有使用 RPS 下的数据包接收和发生流程。
在这种模式下,当有一个 CPU 在处理数据包时,其它 CPU 就不会再处理数据包了,虽然中断控
制器会选择不同的 CPU 来响应网卡中断,但 CPU 不是并发的处理数据包,而是串行的处理数据
多 CPU+e1000e+中断 1 /4