提交 a12bb444 编写于 作者: B Benjamin Herrenschmidt 提交者: Linus Torvalds

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: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: NRusty Russell <rusty@rustcorp.com.au>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 2d3fbbb3
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/stop_machine.h> #include <linux/stop_machine.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/interrupt.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -45,6 +47,7 @@ static int stopmachine(void *cpu) ...@@ -45,6 +47,7 @@ static int stopmachine(void *cpu)
if (stopmachine_state == STOPMACHINE_DISABLE_IRQ if (stopmachine_state == STOPMACHINE_DISABLE_IRQ
&& !irqs_disabled) { && !irqs_disabled) {
local_irq_disable(); local_irq_disable();
hard_irq_disable();
irqs_disabled = 1; irqs_disabled = 1;
/* Ack: irqs disabled. */ /* Ack: irqs disabled. */
smp_mb(); /* Must read state first. */ smp_mb(); /* Must read state first. */
...@@ -124,6 +127,7 @@ static int stop_machine(void) ...@@ -124,6 +127,7 @@ static int stop_machine(void)
/* Make them disable irqs. */ /* Make them disable irqs. */
local_irq_disable(); local_irq_disable();
hard_irq_disable();
stopmachine_set_state(STOPMACHINE_DISABLE_IRQ); stopmachine_set_state(STOPMACHINE_DISABLE_IRQ);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册