68127">
清单 2、NAPI 的轮询方法
int (*poll)(struct net_device *dev, int *budget);
这里的轮询函数用于在将网卡切换为轮询模式之后,用 poll() 方法处理接收队列中的数据包,如队列为空,则重新切换为中断模式。切换回中断模式需要先关闭轮询模式,使用的是函数 netif_rx_complete (),接着开启网卡接收中断 .。
清单 3、退出轮询模式
void netif_rx_complete(struct net_device *dev);
在驱动中创建轮询函数,需要和实际的网络设备 struct net_device 关联起来,这一般在网卡的初始化时候完成,示例代码如下:
清单 4、设置网卡支持轮询模式
dev->poll = my_poll; dev->weight = 64;
里面另外一个字段为权重 (weight),该值并没有一个非常严格的要求,实际上是个经验数据,一般 10Mb 的网卡,我们设置为 16,而更快的网卡,我们则设置为 64。
NAPI 的一些相关 Interface
下面是 NAPI 功能的一些接口,在前面都基本有涉及,我们简单看看:
netif_rx_schedule(dev)
在网卡的中断处理函数中调用,用于将网卡的接收模式切换为轮询
netif_rx_schedule_prep(dev)
在网卡是 Up 且运行状态时,将该网卡设置为准备将其加入到轮询列表的状态,可以将该函数看做是 netif_rx_schedule(dev) 的前半部分
__netif_rx_schedule(dev)
将设备加入轮询列表,前提是需要 netif_schedule_prep(dev) 函数已经返回了 1
__netif_rx_schedule_prep(dev)
与 netif_rx_schedule_prep(dev) 相似,但是没有判断网卡设备是否 Up 及运行,不建议使用
netif_rx_complete(dev)
用于将网卡接口从轮询列表中移除,一般在轮询函数完成之后调用该函数。
__netif_rx_complete(dev)
Newer newer NAPI
其实之前的 NAPI(New API) 这样的命名已经有点让人忍俊不禁了,可见 Linux 的内核极客们对名字的掌控,比对代码的掌控差太多,于是乎,连续的两次对 NAPI 的重构,被戏称为 Newer newer NAPI 了。
与 netif_rx_complete(dev) 类似,但是需要确保本地中断被禁止
本文来源:不详 作者:佚名