netdev_wait_allrefs()流程

 //此函数会等待net_device{}中的refcnt减值为0 才会退出
static void netdev_wait_allrefs(struct net_device *dev)
{
	unsigned long rebroadcast_time, warning_time;

	rebroadcast_time = warning_time = jiffies;
	while (atomic_read(&dev->refcnt) != 0) 
	{
		if (time_after(jiffies, rebroadcast_time + 1 * HZ)) 
		{
			rtnl_lock();

			/* Rebroadcast unregister notification */
            //每秒都会发出NETDEV_UNREGISTER消息通知链
			call_netdevice_notifiers(NETDEV_UNREGISTER, dev);

			//链路监测有未处理的时间如网线插拔或对端设备的打卡关闭
			/*通常,网络设备会定时地侦测设备是否处于可传递状态。
			  当状态发生变化时,会调用netif_carrier_on或者netif_carrier_off来通知内核
			*/
			if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
				     &dev->state)) 
		    {
				//将网线插拔事件从lweventlist队列中取出进行处理
				linkwatch_run_queue();
			}

			__rtnl_unlock();

			rebroadcast_time = jiffies;//更新发送通信信息的时间
		}

		//睡眠
		msleep(250);

        //每10秒都会打印一条警告信息
		if (time_after(jiffies, warning_time + 10 * HZ)) 
		{
			printk(KERN_EMERG "unregister_netdevice: "
			       "waiting for %s to become free. Usage "
			       "count = %d\n",
			       dev->name, atomic_read(&dev->refcnt));
			warning_time = jiffies;//更新打印警告信息的时间
		}
	}
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值