Linux内核分析之工作队列

发表于:2012-3-02 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bullbat    来源:51Testing软件测试网采编

分享:

  可见,工作队列在创建时就唤醒创建的内核线程,下面我们看看他创建的内核线程

static int worker_thread(void *__cwq)
{
 struct cpu_workqueue_struct *cwq = __cwq;
 DEFINE_WAIT(wait);

 if (cwq->wq->freezeable)
  set_freezable();

 for (;;) {
  prepare_to_wait(&cwq->more_work, &wait, TASK_INTERRUPTIBLE);
  if (!freezing(current) &&
      !kthread_should_stop() &&
      list_empty(&cwq->worklist))
   schedule();
  finish_wait(&cwq->more_work, &wait);

  try_to_freeze();

  if (kthread_should_stop())
   break;
  /*执行工作队列*/
  run_workqueue(cwq);
 }

 return 0;
}

static void run_workqueue(struct cpu_workqueue_struct *cwq)
{
 spin_lock_irq(&cwq->lock);
 while (!list_empty(&cwq->worklist)) {
  struct work_struct *work = list_entry(cwq->worklist.next,
      struct work_struct, entry);
  work_func_t f = work->func;
#ifdef CONFIG_LOCKDEP
  /*
   * It is permissible to free the struct work_struct
   * from inside the function that is called from it,
   * this we need to take into account for lockdep too.
   * To avoid bogus "held lock freed" warnings as well
   * as problems when looking into work->lockdep_map,
   * make a copy and use that here.
   */
  struct lockdep_map lockdep_map = work->lockdep_map;
#endif
  trace_workqueue_execution(cwq->thread, work);
  cwq->current_work = work;
  list_del_init(cwq->worklist.next);
  spin_unlock_irq(&cwq->lock);

  BUG_ON(get_wq_data(work) != cwq);
  work_clear_pending(work);
  lock_map_acquire(&cwq->wq->lockdep_map);
  lock_map_acquire(&lockdep_map);
  f(work);/*执行工作队列中实际的函数*/
  lock_map_release(&lockdep_map);
  lock_map_release(&cwq->wq->lockdep_map);

  if (unlikely(in_atomic() || lockdep_depth(current) > 0)) {
   printk(KERN_ERR "BUG: workqueue leaked lock or atomic: "
     "%s/0x%08x/%d\n",
     current->comm, preempt_count(),
            task_pid_nr(current));
   printk(KERN_ERR "    last function: ");
   print_symbol("%s\n", (unsigned long)f);
   debug_show_held_locks(current);
   dump_stack();
  }

  spin_lock_irq(&cwq->lock);
  cwq->current_work = NULL;
 }
 spin_unlock_irq(&cwq->lock);
}

32/3<123>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号