aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2007-05-11 01:22:47 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-11 11:29:34 -0400
commita12bb44471b819c7f33d8a83044e7116c124e3d5 (patch)
treecdf3fee16c535d70659fd343d11b3578941f3596 /kernel
parent2d3fbbb391e280724f7f7804ab00ff61cf1b6a4c (diff)
stop_machine() now uses hard_irq_disable
Add a call to hard_irq_disable() to stop_machine so that we make sure IRQs are really disabled and not only lazy-disabled on archs like powerpc as some users of stop_machine() may rely on that. [akpm@linux-foundation.org: build fix] Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/stop_machine.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index daabb74ee0bc..fcee2a8e6da3 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -8,6 +8,8 @@
8#include <linux/sched.h> 8#include <linux/sched.h>
9#include <linux/stop_machine.h> 9#include <linux/stop_machine.h>
10#include <linux/syscalls.h> 10#include <linux/syscalls.h>
11#include <linux/interrupt.h>
12
11#include <asm/atomic.h> 13#include <asm/atomic.h>
12#include <asm/semaphore.h> 14#include <asm/semaphore.h>
13#include <asm/uaccess.h> 15#include <asm/uaccess.h>
@@ -45,6 +47,7 @@ static int stopmachine(void *cpu)
45 if (stopmachine_state == STOPMACHINE_DISABLE_IRQ 47 if (stopmachine_state == STOPMACHINE_DISABLE_IRQ
46 && !irqs_disabled) { 48 && !irqs_disabled) {
47 local_irq_disable(); 49 local_irq_disable();
50 hard_irq_disable();
48 irqs_disabled = 1; 51 irqs_disabled = 1;
49 /* Ack: irqs disabled. */ 52 /* Ack: irqs disabled. */
50 smp_mb(); /* Must read state first. */ 53 smp_mb(); /* Must read state first. */
@@ -124,6 +127,7 @@ static int stop_machine(void)
124 127
125 /* Make them disable irqs. */ 128 /* Make them disable irqs. */
126 local_irq_disable(); 129 local_irq_disable();
130 hard_irq_disable();
127 stopmachine_set_state(STOPMACHINE_DISABLE_IRQ); 131 stopmachine_set_state(STOPMACHINE_DISABLE_IRQ);
128 132
129 return 0; 133 return 0;