+ -
当前位置:首页 → 问答吧 → 请教与tasklet的几个问题

请教与tasklet的几个问题

时间:2010-08-28

来源:互联网

1)书上说,tasklet_schedule()用于注册一个tasklet,那么该tasklet被调度之后由谁来注销呢?
2)书上说,tasklet用状态TASKLET_STATE_RUN来保护tasklet在多个处理器上并发执行(一次最多只能有一个CPU执行同一个tasklet函数);但是tasklet注册之后,是存放在per-cpu的一个链表中的,怎么可能有多个CPU执行同一个tasklet函数呢?

附上相关代码(v2.6.24)
  1. static inline void tasklet_schedule(struct tasklet_struct *t)
  2. {
  3.         if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
  4.                 __tasklet_schedule(t);
  5. }

  6. void fastcall __tasklet_schedule(struct tasklet_struct *t)
  7. {
  8.         unsigned long flags;

  9.         local_irq_save(flags);
  10.         t->next = __get_cpu_var(tasklet_vec).list;
  11.         __get_cpu_var(tasklet_vec).list = t;
  12.         raise_softirq_irqoff(TASKLET_SOFTIRQ);
  13.         local_irq_restore(flags);
  14. }

  15. static void tasklet_action(struct softirq_action *a)
  16. {
  17.         struct tasklet_struct *list;

  18.         local_irq_disable();
  19.         list = __get_cpu_var(tasklet_vec).list;
  20.         __get_cpu_var(tasklet_vec).list = NULL;
  21.         local_irq_enable();

  22.         while (list) {
  23.                 struct tasklet_struct *t = list;

  24.                 list = list->next;

  25.                 if (tasklet_trylock(t)) {
  26.                         if (!atomic_read(&t->count)) {
  27.                                 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
  28.                                         BUG();
  29.                                 t->func(t->data);
  30.                                 tasklet_unlock(t);
  31.                                 continue;
  32.                         }
  33.                         tasklet_unlock(t);
  34.                 }

  35.                 local_irq_disable();
  36.                 t->next = __get_cpu_var(tasklet_vec).list;
  37.                 __get_cpu_var(tasklet_vec).list = t;
  38.                 __raise_softirq_irqoff(TASKLET_SOFTIRQ);
  39.                 local_irq_enable();
  40.         }
  41. }
复制代码

作者: rc_hz   发布时间: 2010-08-28

一个tasklet只 会在一个CPU上执行。LKD上已经说了。

作者: smalloc   发布时间: 2010-08-28