Browse Source

[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>
Heiko Carstens 17 years ago
parent
commit
5ccd0e43bb
2 changed files with 4 additions and 2 deletions
  1. 4 0
      arch/s390/kernel/process.c
  2. 0 2
      arch/s390/kernel/time.c

+ 4 - 0
arch/s390/kernel/process.c

@@ -152,6 +152,10 @@ static void default_idle(void)
 	local_mcck_disable();
 	local_mcck_disable();
 	if (test_thread_flag(TIF_MCCK_PENDING)) {
 	if (test_thread_flag(TIF_MCCK_PENDING)) {
 		local_mcck_enable();
 		local_mcck_enable();
+		/* disable monitor call class 0 */
+		__ctl_clear_bit(8, 15);
+		atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE,
+					   hcpu);
 		local_irq_enable();
 		local_irq_enable();
 		s390_handle_mcck();
 		s390_handle_mcck();
 		return;
 		return;

+ 0 - 2
arch/s390/kernel/time.c

@@ -209,8 +209,6 @@ static void stop_hz_timer(void)
  */
  */
 static void start_hz_timer(void)
 static void start_hz_timer(void)
 {
 {
-	BUG_ON(!in_interrupt());
-
 	if (!cpu_isset(smp_processor_id(), nohz_cpu_mask))
 	if (!cpu_isset(smp_processor_id(), nohz_cpu_mask))
 		return;
 		return;
 	account_ticks(get_clock());
 	account_ticks(get_clock());