diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2010-10-25 10:10:12 -0400 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-10-25 10:10:15 -0400 |
commit | 6931be0803ddae2791f3c646c8e1e0f82ca26013 (patch) | |
tree | 56bec1c2155be70d4202c4096fbb5eca0fad1bac /arch/s390/kernel | |
parent | 80217147a3d80c8a4e48f06e2f6e965455f3fe2a (diff) |
[S390] cpu hotplug/idle: move cpu_die call to enabled context
There is no difference if cpu_die is called from enabled or disabled
context. Except that the fast_gup code might be called via
cpu_die -> idle_task_exit -> __mm_drop -> crst_table_free. Which in
turn grabs and releases a spinlock using the _bh ops, which is not
allowed in irq disabled context, since spin_unlock_bh will
unconditionally enable interrupts again.
To get rid of the warning emitted by the softirq code just move the
code to enabled context.
In this case this doesn't fix a bug, we just get rid of a warning.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel')
-rw-r--r-- | arch/s390/kernel/process.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index d3a2d1c6438e..ec2e03b22ead 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -76,17 +76,17 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
76 | static void default_idle(void) | 76 | static void default_idle(void) |
77 | { | 77 | { |
78 | /* CPU is going idle. */ | 78 | /* CPU is going idle. */ |
79 | local_irq_disable(); | ||
80 | if (need_resched()) { | ||
81 | local_irq_enable(); | ||
82 | return; | ||
83 | } | ||
84 | #ifdef CONFIG_HOTPLUG_CPU | 79 | #ifdef CONFIG_HOTPLUG_CPU |
85 | if (cpu_is_offline(smp_processor_id())) { | 80 | if (cpu_is_offline(smp_processor_id())) { |
86 | preempt_enable_no_resched(); | 81 | preempt_enable_no_resched(); |
87 | cpu_die(); | 82 | cpu_die(); |
88 | } | 83 | } |
89 | #endif | 84 | #endif |
85 | local_irq_disable(); | ||
86 | if (need_resched()) { | ||
87 | local_irq_enable(); | ||
88 | return; | ||
89 | } | ||
90 | local_mcck_disable(); | 90 | local_mcck_disable(); |
91 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 91 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
92 | local_mcck_enable(); | 92 | local_mcck_enable(); |