summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/softirq.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 3737fa91fb4f..571aa0e12b9e 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -108,6 +108,9 @@ restart:
local_irq_restore(flags);
}
+/*
+ * This function must run with irq disabled!
+ */
inline void cpu_raise_softirq(unsigned int cpu, unsigned int nr)
{
__cpu_raise_softirq(cpu, nr);
@@ -127,7 +130,11 @@ inline void cpu_raise_softirq(unsigned int cpu, unsigned int nr)
void raise_softirq(unsigned int nr)
{
+ long flags;
+
+ local_irq_save(flags);
cpu_raise_softirq(smp_processor_id(), nr);
+ local_irq_restore(flags);
}
void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
@@ -195,8 +202,8 @@ static void tasklet_action(struct softirq_action *a)
local_irq_disable();
t->next = tasklet_vec[cpu].list;
tasklet_vec[cpu].list = t;
- local_irq_enable();
__cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);
+ local_irq_enable();
}
}
@@ -229,8 +236,8 @@ static void tasklet_hi_action(struct softirq_action *a)
local_irq_disable();
t->next = tasklet_hi_vec[cpu].list;
tasklet_hi_vec[cpu].list = t;
- local_irq_enable();
__cpu_raise_softirq(cpu, HI_SOFTIRQ);
+ local_irq_enable();
}
}