Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434452
  • 博文数量: 99
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 1012
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 16:30
个人简介

linux kernel 工程师

文章分类

全部博文(99)

文章存档

2018年(5)

2017年(12)

2016年(27)

2015年(10)

2014年(43)

2012年(2)

我的朋友

分类: LINUX

2014-02-17 16:01:19

 1. e1000_probe 函数里面

INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog);

初始化workqueue。

2. 当需要更新link 状态时,使用
schedule_delayed_work(&adapter->watchdog_task, 1);
来调度watchdog_task

3. e1000_watchdog 函数里面
通过
netif_carrier_on/netif_carrier_off 函数, 调用linkwatch_fire_event

4. link_watch.c

static DECLARE_DELAYED_WORK(linkwatch_work, linkwatch_event);


/* Must be called with the rtnl semaphore held */
void linkwatch_run_queue(void)
{
 __linkwatch_run_queue(0);
}


static void linkwatch_event(struct work_struct *dummy)
{
 rtnl_lock();
 __linkwatch_run_queue(time_after(linkwatch_nextevent, jiffies));
 rtnl_unlock();
}
5.
static void linkwatch_do_dev(struct net_device *dev)
{
 /*
  * Make sure the above read is complete since it can be
  * rewritten as soon as we clear the bit below.
  */
 smp_mb__before_clear_bit();

 /* We are about to handle this device,
  * so new events can be accepted
  */
 clear_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state);

 rfc2863_policy(dev);
 if (dev->flags & IFF_UP) {
  if (netif_carrier_ok(dev))
   dev_activate(dev);
  else
   dev_deactivate(dev);

  netdev_state_change(dev);
 }
 dev_put(dev);
}


 

阅读(1309) | 评论(0) | 转发(0) |
0

上一篇:dev_watchdog

下一篇:__sock_create

给主人留下些什么吧!~~