[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>
This commit is contained in:
Heiko Carstens 2008-03-05 12:37:08 +01:00 committed by Martin Schwidefsky
parent 9361a492cd
commit 5ccd0e43bb
2 changed files with 4 additions and 2 deletions

View File

@ -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;

View File

@ -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());