aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2008-03-05 06:37:08 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2008-03-05 06:37:17 -0500
commit5ccd0e43bb916872022df974d0f39337797d9277 (patch)
treed87472ab01f467187ae6b3024b28939ab6672783 /arch/s390/kernel
parent9361a492cded45af2c3e7f50dbec9dd6dab49861 (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.c4
-rw-r--r--arch/s390/kernel/time.c2
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 */
210static void start_hz_timer(void) 210static 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());