- 论坛徽章:
- 0
|
代码如下, 疑问一:tasklet_schedule判断该tasklet是否已经被SCHE,如果没有则执行 __tasklet_schedule(),并且只加入当前的CPU队列,而不是每个CPU队列,
所以说每个tasklet只是被schedule一次?但ULK3上说可能是多次。
疑问二:tasklet_action()中,
if (tasklet_trylock(t)) 首先判断是否已经在其他CPU上执行,如果只被在当前CPU上schedule一次,这个似乎没有必要?
疑问三: tasklet如果被schedule多次,怎么保证它只被执行一次,而不是在各个CPU上各执行一次?
以上假设在SMP环境下。高手请指点。HELP!
void fastcall __tasklet_schedule(struct tasklet_struct *t)
{
unsigned long flags;
local_irq_save(flags);
t->next = __get_cpu_var(tasklet_vec).list;
__get_cpu_var(tasklet_vec).list= t; /* 只是当前CPU ? */
raise_softirq_irqoff(TASKLET_SOFTIRQ);
local_irq_restore(flags);
}
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if(!test_and_set_bit(TASKLET_STATE_SCHED,&t->state))
/*判断是否被SCHED,如果是,则什么也不做,这不是只调度一次吗? */
__tasklet_schedule(t);
} |
static void tasklet_action(struct softirq_action *a)
{
struct tasklet_struct *list;
local_irq_disable();
list = __get_cpu_var(tasklet_vec).list;
__get_cpu_var(tasklet_vec).list = NULL;
local_irq_enable();
while (list) {
struct tasklet_struct *t = list;
list = list->next;
if (tasklet_trylock(t)) {
/*判断是否在其他CPU上执行 */
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
BUG();
t->func(t->data);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
/*已经在其他CPU上执行了,为什么还要再次加入当前的CPU队列? */
local_irq_disable();
t->next = __get_cpu_var(tasklet_vec).list;
__get_cpu_var(tasklet_vec).list = t;
__raise_softirq_irqoff(TASKLET_SOFTIRQ);
local_irq_enable();
}
}
|
|
[ 本帖最后由 rwen2012 于 2008-6-12 10:10 编辑 ] |
|