diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2008-03-05 06:37:08 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2008-03-05 06:37:17 -0500 |
commit | 5ccd0e43bb916872022df974d0f39337797d9277 (patch) | |
tree | d87472ab01f467187ae6b3024b28939ab6672783 /arch/s390/kernel | |
parent | 9361a492cded45af2c3e7f50dbec9dd6dab49861 (diff) |
[S390] idle: Fix machine check handling in idle loop.
If a machine check handling is pending when the idle loop is entered
default_idle will be left with timer ticks and virtual timer disabled.
Fix this by "calling" the idle_chain. Also a BUG_ON(!in_interrupt) in
start_hz_timer must be removed since the function now gets called from
non interrupt context as well.
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 | 4 | ||||
-rw-r--r-- | arch/s390/kernel/time.c | 2 |
2 files changed, 4 insertions, 2 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 1c59ec161cf8..ce203154d8ce 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -152,6 +152,10 @@ static void default_idle(void) | |||
152 | local_mcck_disable(); | 152 | local_mcck_disable(); |
153 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 153 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
154 | local_mcck_enable(); | 154 | local_mcck_enable(); |
155 | /* disable monitor call class 0 */ | ||
156 | __ctl_clear_bit(8, 15); | ||
157 | atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE, | ||
158 | hcpu); | ||
155 | local_irq_enable(); | 159 | local_irq_enable(); |
156 | s390_handle_mcck(); | 160 | s390_handle_mcck(); |
157 | return; | 161 | return; |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 76a5dd1b4ce9..cb232c155360 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -209,8 +209,6 @@ static void stop_hz_timer(void) | |||
209 | */ | 209 | */ |
210 | static void start_hz_timer(void) | 210 | static void start_hz_timer(void) |
211 | { | 211 | { |
212 | BUG_ON(!in_interrupt()); | ||
213 | |||
214 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) | 212 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) |
215 | return; | 213 | return; |
216 | account_ticks(get_clock()); | 214 | account_ticks(get_clock()); |