linux 3.10 的中断收包笔记
来看下NAPI和非NAPI的区别:
(1) 支持NAPI的网卡驱动必须提供轮询方法poll()。
(2) 非NAPI的内核接口为netif_rx(),NAPI的内核接口为napi_schedule(),或者类似的__napi_schedule之类的,总之都是在硬中断中调用对应的函数。
(3) 非NAPI使用共享的CPU队列softnet_data->input_pkt_queue,NAPI使用设备内存(或者
设备驱动程序的接收环)。
crash> struct softnet_data--------------会创建一个percpu变量
struct softnet_data {
struct Qdisc *output_queue;
struct Qdisc **output_queue_tailp;
struct list_head poll_list;------各个napi_struct的poll_list 串接在这个成员
struct sk_buff *completion_queue;
struct sk_buff_head process_queue;----这个就是从input_pkt_queue 中取下的链表,用两个成员是为了减少锁冲突
unsigned int processed;
unsigned int time_squeeze;
unsigned int cpu_collision;
unsigned int received_rps;
struct softnet_data *rps_ipi_list;
struct call_single_data csd;
struct softnet_data *rps_ipi_next;
unsigned int cpu;
unsigned int input_queue_head;
unsigned int input_queue_tail;
#endif
unsigned int dropped;
struct sk_buff_head input_pkt_queue;----入向的报文,非napi模式的,就放这个链
struct napi_struct backlog;---这个napi设备是虚拟的,为了能适配napi模式的poll,它的poll函数初始化为process_backlog
}
将 利用 ____napi_schedule(sd, &sd->backlog); 来加入对应的poll_list中,这样触发软中断之后,会在 net_rx_action 函数中处理。
那 net_rx_action 它的流程就比较简单了,它首先将 当前cpu的 softnet_data 变量 的poll_list链摘到一个临时链里面,然后循环调用napi_poll,
static int napi_poll(struct napi_struct *n, struct list_head *repoll)
{
。。。
if (test_bit(NAPI_STATE_SCHED, &n->state)) {
work = n->poll(n, weight);//调用这个napi自己的poll函数,对于backlog这个napi_struct 来说,就是 process_backlog函数了,比如对于ixgbe驱动,pll为ixgbe_poll
trace_napi_poll(n);
}
。。。。
当网卡支持napi接口,会如何处理收到的报文呢,其实就是利用 napi_schedule或者__napi_schedule,只要加入到了 softnet_data 的poll_list ,就等着报文来了。比如看一下i40e的驱动情况:
stap -d i40e netif_rx.stp
System Call Monitoring Started ( seconds)...
WARNING: DWARF expression stack underflow in CFI
0xffffffff815930b0 : __napi_schedule+0x0/0x50 [kernel]-----------把napi_struct 加入到对应poll_list,然后触发收包NET_RX_SOFTIRQ软中断
0xffffffffc01ce4a9 : i40e_msix_clean_rings+0x39/0x50 [i40e]
0xffffffff81136e44 : __handle_irq_event_percpu+0x44/0x1c0 [kernel]
0xffffffff81136ff2 : handle_irq_event_percpu+0x32/0x80 [kernel]
0xffffffff8113707c : handle_irq_event+0x3c/0x60 [kernel]
0xffffffff81139d7f : handle_edge_irq+0x7f/0x150 [kernel]
0xffffffff8102d314 : handle_irq+0xe4/0x1a0 [kernel]
0xffffffff816c9d9d : __irqentry_text_start+0x4d/0xf0 [kernel]
0xffffffff816bc362 : ret_from_intr+0x0/0x15 [kernel]
有一点点不同的是,在 netif_rx 中是需要申请skb,然后来将skb挂到收包队列去,而napi_schedule调用的各个napi设备的poll函数,由于实现的不一样,所以skb有可能是取的ring_buf
带的skb,然后将skb推送到协议栈。
linux 3.10 的中断收包笔记的更多相关文章
- Linux(10.5-10.11)学习笔记
3.2程序编码 unix> gcc -01 -o p p1.c p2.c -o用于指定输出(out)文件名. -01,-02 告诉编译器使用第一级或第二级优化 3.2.1机器级代码 机器级编程两 ...
- Linux(10.18-10.25)学习笔记
一.学习目标 1. 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 2. 理解局部性原理 3. 理解缓存思想 4. 理解局部性原理和缓存思想在存储层次结构中的应用 5. 高速缓存的原理和应用 ...
- linux网络收包过程
记录一下linux数据包从网卡进入协议栈的过程,不涉及驱动,不涉及其他层的协议处理. 内核是如何知道网卡收到数据的,这就涉及到网卡和内核的交互方式: 轮询(poll):内核周期性的检查网卡,查看是否收 ...
- 《linux设备驱动开发详解》笔记——10中断与时钟
10.1 中断与定时器 中断一般有如下类型: 内部中断和外部中断:内部中断来自CPU,例如软件中断指令.溢出.除0错误等:外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断和非向量中断,ARM ...
- 代码学习-Linux内核网卡收包过程(NAPI)【转】
转自:https://blog.csdn.net/crazycoder8848/article/details/46333761 版权声明:本文没有任何版权限制,任何人可以以任何方式使用本文. htt ...
- 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理
在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部 ...
- Linux系统针对网卡中断的优化处理
摘要: 中断: 当网卡接收到数据包后,会触发硬中断,通知CPU来收包.硬中断是一个CPU和网卡交互的过程.这其实会消耗CPU资源.特别是在使用速度极快的万兆网卡 之后,大量的网络交互使得CPU很大一部 ...
- 《Linux就该这么学》培训笔记_ch02_一些必须掌握的Linux命令
本文在原来作者的基础上做一些符合自己的修改.原文参考: <Linux就该这么学>培训笔记_ch02_一些必须掌握的Linux命令. 本章的内容虽然多,基本都是书本原话,但是笔记能精 ...
- 《Linux就该这么学》培训笔记_ch08_iptables与firewall防火墙
<Linux就该这么学>培训笔记_ch08_iptables与firewall防火墙 文章最后会post上书本的笔记照片. 文章主要内容: 防火墙管理工具 iptables firewal ...
随机推荐
- Jmeter(八)HTTPCookie管理器
Cookie绝对是日常工作以及技术中一个绕不过去的‘角色’,正常各种各样的业务需要Cookie的存在.Jmeter中也有支持发送Cookie的组件,但是,仅是后话:在此还是有必要先记一记Cookie到 ...
- T-SQL 有参数存储过程的创建与执行
use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery2') drop procedur ...
- win10配置labelImg
[引言]在目标检测中,需要用图像标注工具标注图像,如Labelme . labelImg等,本文使用的是LabelImg ,LabelImg在Ubuntu下很好部署, 在win10中有些地方要注意下, ...
- Unity中进程间通信——使用Protobuf-net序列化与反序列化
基于ProtoBuf协议实现网络传输(上) Protobuf 全称Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格 ...
- spring boot controller设置 @Transactional 不回滚的解决办法
@Transactional @ApiOperation(value = "添加一个用户信息") @RequestMapping(value = "/create&quo ...
- JS面试典型常见问题与解答
Q1:下面代码段的输出是什么? 为什么? (Scope) (function() { var a = b = 5; })(); console.log(b); A1: 输出是5. 在上面的立即调用函数 ...
- Java - 31 Java 发送邮件
Java 发送邮件 使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 ...
- KVM CPU线程等学习记录
绝大多数操作系统调度单位是线程.线程是调度和分配的基本单位,进程是资源拥有的基本单位.linux下fork的叫进程pthread叫线程创建进程比线程性能要差好多5-100倍,因进程不同而异.进程之间共 ...
- 导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes
ref: https://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-7 ...
- 运行vbs脚本
VBS是基于Visual Basic的脚本语言. VBS的全称是:Microsoft Visual Basic Script Edition.(微软公司可视化BASIC脚本版). 其语言类似Visua ...