ruger 发表于 2006-12-4 11:02:38

再问个问题:NAPI和软中断的关系?

NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据,(类似于底半(bottom-half)处理模式);从我们在实验中所得到的数据来看,在随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在网卡驱动层和网络层得到了广泛的应用,驱动层次上已经有 E1000 系列网卡,RTL8139 系列网卡,3c50X 系列等主流的网络适配器都采用了这个技术,而在网络层次上,NAPI 技术已经完全被应用到了著名的 netif_rx 函数中间,并且提供了专门的 POLL 方法--process_backlog 来处理轮询的方法;根据实验数据表明采用NAPI技术可以大大改善短长度数据包接收的效率,减少中断触发的时间;由于 RTL8139CP 是一种应用比较广泛的网络适配器,所以本文以其为例,说明了NAPI技术在网络适配器上的应用和基本原理。

对于下半部的实现,《Linux Kernel Developmnet》讲有三种方式:软中断,tasklet和工作队列。《Linux内核设计与编程》(倪继利)又说NAPI是一种中断和轮询机制的混合体,首先采用中断唤醒数据接收的服务程序,然后采用POLL的方法来轮询数据。

而上文又说“它的核心概念就是不采用中断的方式读取数据”,是否可以理解为NAPI是中断处理程序下半部软中断实现方式的继续,在软中断的基础上继续调用POLL函数,轮询设备?请问这样理解对吗?

zyzii 发表于 2006-12-4 17:28:23

NAPI过程:
   <1>就是在中断函数中,调用netif_rx_schedule(dev),该函数将本dev挂到本CPU的软中断的队列poll_list中去。
    <2> 软中断函数net_rx_action会调用该dev的poll函数来处理包。
    <3> poll函数来处理接受包。

《Linux内核设计与编程》(倪继利)525页有个图,比较不错的。过程简单,但若真的实现到驱动中还是要费功夫的。
我目前正在把一个网卡的驱动改造成NAPI方式。因为网卡要发大包,但据说大包的NAPI效果不是太好。不管怎么说,先改了再说吧。

ruger 发表于 2006-12-4 21:53:49

NAPI过程:
   <1>就是在中断函数中,调用netif_rx_schedule(dev),该函数将本dev挂到本CPU的软中断的队列poll_list中去。
    <2> 软中断函数net_rx_action会调用该dev的poll函数来处理包。
    <3> poll函数来处理接受包。

《Linux内核设计与编程》(倪继利)525页有个图,比较不错的。过程简单,但若真的实现到驱动中还是要费功夫的。
我目前正在把一个网卡的驱动改造成NAPI方式。因为网卡要发大包,但据说大包的NAPI效果不是太好。不管怎么说,先改了再说吧。
哈,我正好在作NAPI上层处理包的这个工作,所以需要下层的工作原理,以后还要多多请教啊~

generic_bj 发表于 2007-1-23 12:30:54

NAPI 对大包的处理不存在性能问题,至少e1000的驱动没问题,r8169应该会差点,跟具体驱动实现有关系,与NAPI无关
页: [1]
查看完整版本: 再问个问题:NAPI和软中断的关系?