diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/char/sclp.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 3457a9a31571..027cdc18df31 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
@@ -402,6 +402,7 @@ sclp_sync_wait(void) | |||
402 | unsigned long flags; | 402 | unsigned long flags; |
403 | unsigned long cr0, cr0_sync; | 403 | unsigned long cr0, cr0_sync; |
404 | u64 timeout; | 404 | u64 timeout; |
405 | int irq_context; | ||
405 | 406 | ||
406 | /* We'll be disabling timer interrupts, so we need a custom timeout | 407 | /* We'll be disabling timer interrupts, so we need a custom timeout |
407 | * mechanism */ | 408 | * mechanism */ |
@@ -414,7 +415,9 @@ sclp_sync_wait(void) | |||
414 | } | 415 | } |
415 | local_irq_save(flags); | 416 | local_irq_save(flags); |
416 | /* Prevent bottom half from executing once we force interrupts open */ | 417 | /* Prevent bottom half from executing once we force interrupts open */ |
417 | local_bh_disable(); | 418 | irq_context = in_interrupt(); |
419 | if (!irq_context) | ||
420 | local_bh_disable(); | ||
418 | /* Enable service-signal interruption, disable timer interrupts */ | 421 | /* Enable service-signal interruption, disable timer interrupts */ |
419 | trace_hardirqs_on(); | 422 | trace_hardirqs_on(); |
420 | __ctl_store(cr0, 0, 0); | 423 | __ctl_store(cr0, 0, 0); |
@@ -435,7 +438,8 @@ sclp_sync_wait(void) | |||
435 | } | 438 | } |
436 | local_irq_disable(); | 439 | local_irq_disable(); |
437 | __ctl_load(cr0, 0, 0); | 440 | __ctl_load(cr0, 0, 0); |
438 | _local_bh_enable(); | 441 | if (!irq_context) |
442 | _local_bh_enable(); | ||
439 | local_irq_restore(flags); | 443 | local_irq_restore(flags); |
440 | } | 444 | } |
441 | 445 | ||