Linux数据包NAPI处理流程
1. 概念
NAPI:linux新的网卡数据包处理API,采用新的数据包处理流程。
round-robin:轮询调度调度算法。
硬中断:由外设产生,主要是用来通知通过操作系统外设发生变化。比如当网卡收到数据包的时候,就会产生一个硬中断。
软中断:为了满足实时性需要,中断处理应该是越快越好,当中断发生时,硬中断处理那些用时间短的工作,而时间较长的任务放在硬中断之后处理,也就是有软中断完成。软中断是有系统调用中断指令产生的,不是硬件设备触发的。
2. 非NAPI与NAP处理流程的区别
非NAPI的数据包处理流程:采用的是中断方式,即网卡收到数据包就触发一个中断,然后交由中断处理程序进行处理。
非NAPI方式,数据包会从DMA缓冲区中复制到CPU的back_log队列,然后由下半段去处理back_log队列中的数据包;NAPI方式,poll程序直接处理DMA缓冲区的数据包,简单明了。
3. NAPI处理数据包流程图
网卡收包产生中断,调用驱动处理函数,驱动处理函数会根据网络设备是否支持NAPI调用不通的内核处理函数,netif_rx和napi_schedule为内核入口函数。
enqueue_to_backlog和__napi_schedule都通过____napi_schedule函数(通过调用__raise_softirq_irqoff(NET_RX_SOFTIRQ))激触发软中断,但是区别是加入poll_list的回调函数不同,enqueue_to_backlog的回调函数为process_backlog,而__napi_schedule的回调函数为napi_struct中的poll函数,该方法由驱动提供,在通过netif_napi_add加入napi_struct时制定。
NAPI 的使用至少要得到下面的保证:
A. 要使用 DMA 的环形输入队列(也就是 ring_dma,这个在 2.4 驱动中关于 Ethernet 的部分有详细的介绍),或者是有足够的内存空间缓存驱动获得的包。
B. 在发送/接收数据包产生中断的时候有能力关断 NIC 中断的事件处理,并且在关断 NIC 以后,并不影响数据包接收到网络设备的环形缓冲区(以下简称 rx-ring)处理队列中。
---------------------
参考:https://blog.csdn.net/yrx0619/article/details/80990005
阅读(2988) | 评论(0) | 转发(0) |