//此函数会等待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;//更新打印警告信息的时间
}
}
}