summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@athlon.transmeta.com>2002-02-04 20:14:29 -0800
committerLinus Torvalds <torvalds@athlon.transmeta.com>2002-02-04 20:14:29 -0800
commit70a8be476e663526c3cb17a157c17ccf4fca5bd4 (patch)
tree9cb7529d5c1d7e7d90a21b1a6c9f6133fbbb0511 /kernel
parent1c3cefa582a6b598d204bad02676df300e457efa (diff)
v2.4.9.5 -> v2.4.9.6
- Jens Axboe: remove trivially dead io_request_lock usage - Andrea Arcangeli: softirq cleanup and ARM fixes. Slab cleanups - Christoph Hellwig: gendisk handling helper functions/cleanups - Nikita Danilov: reiserfs dead code pruning - Anton Altaparmakov: NTFS update to 1.1.18 - firestream network driver: patch reverted on authors request - NIIBE Yutaka: SH architecture update - Paul Mackerras: PPC cleanups, PPC8xx update. - me: reverse broken bootdata allocation patch that went into pre5
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();
}
}