unregister_netdevice: waiting for eth1 to become free?错误

前段日子在做vlan的时候遇见一个麻烦,问题大致是这样的:

Description:

路由器仅有一张网卡,phy0,通过vlan划分WAN端和LAN端。

vconfig add phy0 1  #lan phy0.1

vconfig add phy0 2 #wan phy0.2,(我通过ip link改了名字,使得phy0.2 更名为eth1)

然后因为要做Vlan-tag的功能,在实现过程中需要重新配置vlan,(问题主要在其中一部需要删除eth1,是通过vconfig rem eth1删除的),但是在执行这条删除命令的时候出现了标题所示的错误:

unregister_netdevice: waiting for eth1 to become free?,然后板子就宕掉了。

碰上问题时,进行了些分析,其间走了不少弯路,这里也顺便提下走的弯路了。

Analyse 1:

应该是由程序占用了eth1,那么,先找出占用它的程序。

首先看了下所有正在运行的进程,kill掉比较可能的进程,rmmod掉可能占用eth1的模块(包括一个名为enet的模块,这里先提一下,因为最后分析出来其实是enet模块导致了这个错误)。结果执行vconfig rem eth1 命令还是会出现错误,并宕机。

接着通过循环,kill掉所有能kill掉的进程,问题依然没有解决。

Analyse 2:

查资料,发现错误现象应该是:eth1设备的引用计数不为0,导致eth1的除名函数在netdev_run_todo中陷入死循环(循环判断eth1的引用计数是否为0),然后导致程序宕机。

乍一看,跟Analyse1 的分析结果差不多,其实不然。

其主要区别在于:

在Analyse 1中,我们认为,eth1是否程序占用了,那么我们把程序down/kill掉,就可以解除占用。而在Analyse 2中,eth1引用计数不为0,不一定是eth1被占用了,也可能因为占用它的程序/模块在自身down掉的时候,没有吧引用计数减一造成的。

在网上查了好久,出现unregister_netdevice: waiting for eth1 to become free?的原因可能是某一处代码中使用了dev_hold而没有使用dev_put。

dev_hold和dev_put是配对使用的,一个用来引用计数加一,一个用于引用计数减一。

查看模块代码,没有发现单独直接使用dev_hold的情况。那会不会是简介调用呢,仔细查找了好久,果然是间接调用。

在我们一些模块代码中,经常会通过dev_get_by_name来获取设备信息。而dev_get_by_name封装了dev_hold,导致引用计数加一。由于dev_get_by_name是内核提供的接口,不熟悉的coder很可能不晓得这点,也没有注意到需要调用dev_put.,于是便有了上面所说的错误。

另:用__dev_get_by_name 可以避免出现dev_hold和dev_put的匹配问题。

时间: 2024-10-11 20:47:54

unregister_netdevice: waiting for eth1 to become free?错误的相关文章

docker summary

http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html 总结的很好 ----------------------------------------------------------------------------------- 查看docker的子命令,直接敲docker或完整的docker help就可以了: [email protected]:~# docker [1/1617] Usage: docker [

wavecom短信猫常用AT命令

一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS 1900).当模块有多频带时,回应可能是不同频带的结合. 3. AT+CGMR 获得改订的软件版本. 4. AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号. 5. AT+CSCS 选择TE特征设定.这个命令报告TE用的是哪个状态设定上的ME.ME于是可以转换 每一个输入的或显示的字母.这个是用来发送.读取或者撰

MySQL数据库InnoDB存储引擎中的锁机制--转载

原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本类型 数据库上的操作可以归纳为两中,读和写.多个

docker基础命令详解

Commands: attach    Attach to a running container build     Build an image from a Dockerfile commit    Create a new image from a container's changes cp        Copy files/folders from a container's filesystem to the host path create    Create a new co

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

【转】SIMCOM的AT指令

AT+CIPSTART: { 0 IP INITIAL 初始化 1 IP START 启动任务 2 IP CONFIG 配置场景 3 IP IND 接受场景配置 4 IP GPRSACT 场景已激活 5 IP STATUS 获得本地IP地址 6 TCP/UDP CONNECTING 与SERVER建立连接阶段 7 IP CLOSE 连接已关闭 8 CONNECT OK 连接建立成功 AT+CIPSTART只有在IP_INITIAL.IP_CLOSE.IP_STATUS状态下 才可以进行连接的建立

AT 指令

2 1 简介.............................................. 5 1.1 名词术语........................................ 5 1.2 AT 命令简介..................................... 5 2 AT 命令祥解....................................... 5 2.1 一般命令..................................

DBCP object created 日期 by the following code was never closed:

1.分析 看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步 的分析.我们首先要做的就是想,想想数据库连接池,在项目中是如何实现的,那么不管你或早或晚,都会想到数据库连接池相关的配置文件和代码.那么 问题来了,是否是配置文件配置的有问题(挖掘技术哪家强?)? 那么先来分析下各项连接池配置的属性: #回收被遗弃的(一般是忘了释放的)数据库连接到连接池中. dataBase.removeAbandoned =fa

centos7.3 docker升级

#升级操作系统,centos7直接升级到7.3 yum clean all yum update #升级内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel