Kernel: 4.12.6

网络设备初始化,主要包括初始化softnet_data,注册收发包软中断等;

 static int __init net_dev_init(void)
{
int i, rc = -ENOMEM; BUG_ON(!dev_boot_phase); //初始化统计信息的proc文件
if (dev_proc_init())
goto out; //初始化kobject
if (netdev_kobject_init())
goto out; //初始化协议类型链表
INIT_LIST_HEAD(&ptype_all); //初始化协议类型hash表
for (i = ; i < PTYPE_HASH_SIZE; i++)
INIT_LIST_HEAD(&ptype_base[i]); //初始化offload列表
INIT_LIST_HEAD(&offload_base); //注册网络命名空间子系统
if (register_pernet_subsys(&netdev_net_ops))
goto out; /*
* Initialise the packet receive queues.
*/
//初始化数据包接收队列
for_each_possible_cpu(i) {
struct work_struct *flush = per_cpu_ptr(&flush_works, i);
struct softnet_data *sd = &per_cpu(softnet_data, i); //初始化清理backlog队列
INIT_WORK(flush, flush_backlog); //初始化非napi接口层的缓存队列
skb_queue_head_init(&sd->input_pkt_queue); //初始化数据包处理队列
skb_queue_head_init(&sd->process_queue); //初始化网络设备轮询队列
INIT_LIST_HEAD(&sd->poll_list); //初始化输出队列尾部
sd->output_queue_tailp = &sd->output_queue; //若支持RPS
#ifdef CONFIG_RPS
sd->csd.func = rps_trigger_softirq;
sd->csd.info = sd;
sd->cpu = i;
#endif //支持非napi虚拟设备的回调和配额设置
sd->backlog.poll = process_backlog;
sd->backlog.weight = weight_p;
} dev_boot_phase = ; /* The loopback device is special if any other network devices
* is present in a network namespace the loopback device must
* be present. Since we now dynamically allocate and free the
* loopback device ensure this invariant is maintained by
* keeping the loopback device as the first device on the
* list of network devices. Ensuring the loopback devices
* is the first device that appears and the last network device
* that disappears.
*/
//注册回环设备
if (register_pernet_device(&loopback_net_ops))
goto out; if (register_pernet_device(&default_device_ops))
goto out; //注册发送软中断
open_softirq(NET_TX_SOFTIRQ, net_tx_action); //注册接收软中断
open_softirq(NET_RX_SOFTIRQ, net_rx_action); //注册响应cpu状态变化的回调
rc = cpuhp_setup_state_nocalls(CPUHP_NET_DEV_DEAD, "net/dev:dead",
NULL, dev_cpu_dead);
WARN_ON(rc < ); //注册响应网络状态变化的回调
dst_subsys_init();
rc = ;
out:
return rc;
}

net_dev_init的更多相关文章

  1. Linux启动过程详述

    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...

  2. 网络数据包收发流程(二):不配置NAPI的情况

    一.no NAPI 数据结构不配置NAPI的时候,网络设备不使用自己的napi_struct结构,所有网络设备驱动都使用同一个napi_struct,即cpu私有变量__get_cpu_var(sof ...

  3. Linux内核NAPI机制分析

    转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...

  4. init/main.c

    /* * linux/init/main.c * * Copyright (C) 1991, 1992 Linus Torvalds */ #include <stdarg.h> #inc ...

  5. Softnet_data

    Softnet_data的初始化: 每个CPU的softnet_data是在net_dev_init中初始化的,代码如下: "/net/core/dev.c" "stat ...

  6. Linux 软中断

    本文转载自: http://blog.chinaunix.net/uid-9620812-id-3833377.html,如有需要,请移步访问. Technorati 标签: Linux 软中断 -- ...

  7. Monitoring and Tuning the Linux Networking Stack: Receiving Data

    http://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/ ...

  8. Linux协议栈函数调用流程

    普通网络驱动程序中必须要调用的函数是eth_type_trans(略),然后向上递交sk_buff时调用netif_rx()(net/core/dev.c).其函数中主要几行 __skb_queue_ ...

  9. 深入理解linux网络技术内幕读书笔记(九)--中断与网络驱动程序

    Table of Contents 1 接收到帧时通知驱动程序 1.1 轮询 1.2 中断 2 中断处理程序 3 抢占功能 4 下半部函数 4.1 内核2.4版本以后的下半部函数: 引入软IRQ 5 ...

随机推荐

  1. 一日一句 SQL [持续更新] MySQL + Oracle

    1 . group by 和 having字句: group by是根据列值对数据进行分组, having子句用于对分组的数据进行过滤. [ having 针对的对象是分好的组] eg: employ ...

  2. Access Denied for user root @localhost 解决方案

    问题描述: C:\Users\bo.wang> mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for us ...

  3. Foundation框架—时间输出格式NSDateFormatter

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.下面来介绍NSDateFormatter的常用属性和API:  1.常用属性 @ ...

  4. BZOJ 1211 树的计数(purfer序列)

    首先考虑无解的情况, 根据purfer序列,当dee[i]=0并且n!=1的时候,必然无解.否则为1. 且sum(dee[i]-1)!=n-2也必然无解. 剩下的使用排列组合即可推出公式.需要注意的是 ...

  5. [SOJ #47]集合并卷积

    题目大意:给你两个多项式$A,B$,求多项式$C$使得:$$C_n=\sum\limits_{x|y=n}A_xB_y$$题解:$FWT$,他可以解决形如$C_n=\sum\limits_{x\opl ...

  6. [洛谷P5091]【模板】欧拉定理

    题目大意:求$a^b\bmod m(a\leqslant10^9,m\leqslant10^6,b\leqslant10^{2\times10^7})$ 题解:扩展欧拉定理:$$a^b\equiv\b ...

  7. UVA.725 Division (暴力)

    UVA.725 Division (暴力) 题意分析 找出abcdefghij分别是0-9(不得有重复),使得式子abcde/fghij = n. 如果分别枚举每个数字,就会有10^10,肯定爆炸,由 ...

  8. HDU 4417 主席树写法

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. radio is checked

    var is_rec =$("#is_rec_on").is(':checked'); if(is_rec){ $('.rec_img').css('display','block ...

  10. 在IIS中寄存服务

    http://blog.csdn.net/songyefei/article/details/7381595 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型 ...