没有合适的资源?快使用搜索试试~ 我知道了~
095746-NAPI-技术在-Linux-网络驱动上的应用和完善.doc
0 下载量 144 浏览量
2022-11-30
10:31:05
上传
评论
收藏 153KB DOC 举报
温馨提示
试读
14页
095746-NAPI-技术在-Linux-网络驱动上的应用和完善.doc
资源推荐
资源详情
资源评论
1
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的
方式读取数据,而代之以 POLL 的方法来轮询数据,类似于底半方式(bottom-half 的处理
模式);但是目前在 Linux 的 NAPI 工作效率比较差,本文在分析 NAPI 的同时,提供了
一种高效的改善方式供大家参考。
前言:
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中
断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法
来轮询数据,(类似于底半(bottom-half)处理模式);从我们在实验中所得到的数据来看,
在随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在
网卡驱动层和网络层得到了广泛的应用,驱动层次上已经有 E1000 系列网卡,RTL8139 系
列网卡,3c50X 系列等主流的网络适配器都采用了这个技术,而在网络层次上,NAPI 技术
已 经 完 全 被 应 用 到 了 著 名 的 netif_rx 函 数 中 间 , 并 且 提 供 了 专 门 的 POLL 方 法
--process_backlog 来处理轮询的方法;根据实验数据表明采用 NAPI 技术可以大大改善短长
度数据包接收的效率,减少中断触发的时间;由于 RTL8139CP 是一种应用比较广泛的网
络适配器,所以本文以其为例,说明了 NAPI 技术在网络适配器上的应用和基本原理。
但是 NAPI 存在一些比较严重的缺陷:而对于上层的应用程序而言,系统不能在每个
数据包接收到的时候都可以及时地去处理它,而且随着传输速度增加,累计的数据包将会耗
费大量的内存,经过实验表明在 Linux 平台上这个问题会比在 FreeBSD 上要严重一些;
另外采用 NAPI 所造成的另外一个问题是对于大的数据包处理比较困难,原因是大的数据
包传送到网络层上的时候耗费的时间比短数据包长很多(即使是采用 DMA 方式),所以正
如前面所说的那样,NAPI 技术适用于对高速率的短长度数据包的处理,在本文的末尾提出
了 NAPI 的改善方法,和实验数据。
使用 NAPI 先决条件:
驱动可以继续使用老的 2.4 内核的网络驱动程序接口,NAPI 的加入并不会导致向前
兼容性的丧失,但是 NAPI 的使用至少要得到下面的保证:
A. 要使用 DMA 的环形输入队列(也就是 ring_dma,这个在 2.4 驱动中关于 Ethernet
的部分有详细的介绍),或者是有足够的内存空间缓存驱动获得的包。
B. 在发送/接收数据包产生中断的时候有能力关断 NIC 中断的事件处理,并且在关断
NIC 以后,并不影响数据包接收到网络设备的环形缓冲区(以下简称 rx-ring)处理队列中。
NAPI 对数据包到达的事件的处理采用轮询方法,在数据包达到的时候,NAPI 就会强
制执行 dev->poll 方法。而和不象以前的驱动那样为了减少包到达时间的处理延迟,通常采
用中断的方法来进行。
应当注意的是,经过测试如果 DEC Tulip 系列(DE21x4x 芯片)以及 National Semi
的部分网卡芯片,的测试表明如果把从前中断处理的部分都改换用设备的 POLL 方法去执
行,那么会造成轻微的延迟,因此在进行 MII(介质无关)的操作上就需要一些小小的诀
窍,详见 mii_check_media 的函数处理流程,本文不做详细讨论。
在下面显示的例子表示了在 8139 中如何把处理过程放在 dev 的 poll 方法中,把所有
的原来中断应该处理的过程放在了 POLL 方法里面,篇幅起见,我们只介绍接收的 POLL
方法。
在下面的 8139CP 驱动程序介绍中表明了可以把在中断程序中所做的任何事情放在
POLL 方法中去做,当然不同的 NIC 在中断中所要处理的状态和事件是不一样的。
对于所有的 NIC 设备,以下两种类型的 NIC 接收事件寄存器响应机制:
COR 机制:当用户程序读状态/事件寄存器,读完成的时候寄存器和 NIC 的 rx-ring 中
表示的状态队列将被清零,natsemi 和 sunbmac 的 NIC 会这样做,在这种情况下,必须把
2
NIC 所有以前的中断响应的处理部分都移动到 POLL 方法中去。
COW 机制:用户程序写状态寄存器的时候,必须对要写的位先写 1 清 0,如下面要
介绍的 8139CP 就是这样的类型,大多数的 NIC 都属于这种类型,而且这种类型对 NAPI
响应得最好,它只需要把接收的数据包处理部分放置在 POLL 方法中,而接收事件的状态
处理部分放在原先的中断控制程序中,我们等下将要介绍的 8139CP 类型网卡就是属于这种
类型。
C. 有防止 NIC 队列中排队的数据包冲突的能力。
当关断发送/接收事件中断的时候,NAPI 将在 POLL 中被调用处理,由于 POLL 方
法的时候,NIC 中断已经不能通知包到达,那么这个时候在如果在完成轮询,并且中断打
开以后,会马上有一个 NIC 中断产生,从而触发一次 POLL 事件,这种在中断关断时刻
到达的包我们称为"rotting";这样就会在 POLL 机制和 NIC 中断之间产生一个竞争,解决
的方法就是利用网卡的接收状态位,继续接收环形队列缓冲 rx-ring 中的数据,直到没有数
据接收以后,才使能中断。
锁定和防冲突机制:
- 1.SMP 的保证机制:保证同时只有一个处理器调用网络设备的 POLL 方法,因为我
们将在下面看到同时只有一个处理器可以对调用 netif_rx_schedule 挂在 POLL 队列中的
NIC 设备调用 POLL 方法。
- 2. 网络核心层(net core)调用设备驱动程序使用循环方式发送数据包,在设备驱动层
接收数据包的时候完全无锁的接收,而网络核心层则同样要保证每次只有一个处理器可以使
用软中断处理接收队列。
- 3. 在多个处理器对 NIC 的 rx-ring 访问的时刻只能发生在对循环队列调用关闭
(close)和挂起(suspend)方法的时候(在这个时刻会试图清除接收循环队列)
- 4. 数据同步的问题(对于接收循环队列来说),驱动程序是不需要考虑的网络层上的
程序已经把这些事情做完了。
- 5. 如果没有把全部的部分交给 POLL 方法处理,那么 NIC 中断仍然需要使能,接
收链路状态发生变化和发送完成中断仍然和以前的处理步骤一样,这样处理的假设是接收中
断是设备负载最大的的情况,当然并不能说这样一定正确。
下面的部分将详细介绍在接收事件中调用设备的 POLL 方法。
NAPI 提供的重要函数和数据结构和函数:
核心数据结构:
struct softnet_data 结构内的字段就是 NIC 和网络层之间处理队列,这个结构是全局的,
它从 NIC 中断和 POLL 方法之间传递数据信息。其中包含的字段有:
struct softnet_data
{
intthrottle;/*为 1 表示当前队列的数据包被禁止*/
intcng_level;/*表示当前处理器的数据包处理拥塞程度*/
intavg_blog;/*某个处理器的平均拥塞度*/
struct sk_buff_headinput_pkt_queue;/*接收缓冲区的 sk_buff 队列*/
struct list_head poll_list;/*POLL 设备队列头*/
struct net_device output_queue; /*网络设备发送队列的队列头*/
struct sk_buffcompletion_queue; /*完成发送的数据包等待释放的队列*/
struct net_devicebacklog_dev;/*表示当前参与 POLL 处理的网络设备*/
};
核心 API:
3
1. netif_rx_schedule(dev)
这个函数被中断服务程序调用,将设备的 POLL 方法添加到网络层次的 POLL 处理队
列中去,排队并且准备接收数据包,在使用之前需要调用 netif_rx_reschedule_prep,并且返
回的数为 1,并且触发一个 NET_RX_SOFTIRQ 的软中断通知网络层接收数据包。
2. netif_rx_schedule_prep(dev)
确定设备处于运行,而且设备还没有被添加到网络层的 POLL 处理队列中,在调用
netif_rx_schedule 之前会调用这个函数。
3. netif_rx_complete(dev)
把当前指定的设备从 POLL 队列中清除,通常被设备的 POLL 方法调用,注意如果在
POLL 队列处于工作状态的时候是不能把指定设备清除的,否则将会出错。
如何在 8139CP 使用 NAPI:
剩余13页未读,继续阅读
资源评论
matlab大师
- 粉丝: 2375
- 资源: 9万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功