唤醒任务队列处理消息
static DECLARE_DELAYED_WORK(linkwatch_work, linkwatch_event);
=>void linkwatch_event(struct work_struct *dummy)
rtnl_lock();
__linkwatch_run_queue(time_after(linkwatch_nextevent, jiffies));
=>void __linkwatch_run_queue(int urgent_only)
list_splice_init(&lweventlist, &wrk);
while (!list_empty(&wrk))
dev = list_first_entry(&wrk, struct net_device, link_watch_list);
list_del_init(&dev->link_watch_list);
if (urgent_only && !linkwatch_urgent_event(dev)) {
list_add_tail(&dev->link_watch_list, &lweventlist);
continue;
}
linkwatch_do_dev(dev);
if (!list_empty(&lweventlist))
linkwatch_schedule_work(0);
rtnl_unlock();
状态变化添加消息
void netif_carrier_on(struct net_device *dev)
linkwatch_fire_event(dev);
=>void linkwatch_fire_event(struct net_device *dev)
bool urgent = linkwatch_urgent_event(dev);
linkwatch_add_event(dev);
=>void linkwatch_add_event(struct net_device *dev)
if (list_empty(&dev->link_watch_list))
list_add_tail(&dev->link_watch_list, &lweventlist);
dev_hold(dev);
linkwatch_schedule_work(urgent);
if (netif_running(dev))
__netdev_watchdog_up(dev);