1. 同一个softirq可以在不同的CPU上同时运行,softirq必须是可重入的
2. 软中断是在编译期间静态分配的,它不像tasklet那样能被动态的注册或去除
3. tasklet是基于softirq实现,同一个tasklet只能同时在一个cpu上执行,tasklet无需关心互斥问题.
static void tasklet_action(struct softirq_action *a)
{
while (list) {
struct tasklet_struct *t = list;
list = list->next;
if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED,
&t->state))
BUG();
exynos_ss_irq(ESS_FLAG_SOFTIRQ_TASKLET,
t->func, irqs_disabled(), ESS_FLAG_IN);
t->func(t->data);
exynos_ss_irq(ESS_FLAG_SOFTIRQ_TASKLET,
t->func, irqs_disabled(), ESS_FLAG_OUT);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
}
}
4. 不同的tasklet可以在不同cpu上运行,提高了SMP效率
5. workqueue工作在线程环境,可以休眠.