diff options
Diffstat (limited to 'drivers/s390/char/sclp.c')
| -rw-r--r-- | drivers/s390/char/sclp.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 4138564402b8..985d1613baaa 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
| @@ -383,6 +383,7 @@ void | |||
| 383 | sclp_sync_wait(void) | 383 | sclp_sync_wait(void) |
| 384 | { | 384 | { |
| 385 | unsigned long psw_mask; | 385 | unsigned long psw_mask; |
| 386 | unsigned long flags; | ||
| 386 | unsigned long cr0, cr0_sync; | 387 | unsigned long cr0, cr0_sync; |
| 387 | u64 timeout; | 388 | u64 timeout; |
| 388 | 389 | ||
| @@ -395,9 +396,11 @@ sclp_sync_wait(void) | |||
| 395 | sclp_tod_from_jiffies(sclp_request_timer.expires - | 396 | sclp_tod_from_jiffies(sclp_request_timer.expires - |
| 396 | jiffies); | 397 | jiffies); |
| 397 | } | 398 | } |
| 399 | local_irq_save(flags); | ||
| 398 | /* Prevent bottom half from executing once we force interrupts open */ | 400 | /* Prevent bottom half from executing once we force interrupts open */ |
| 399 | local_bh_disable(); | 401 | local_bh_disable(); |
| 400 | /* Enable service-signal interruption, disable timer interrupts */ | 402 | /* Enable service-signal interruption, disable timer interrupts */ |
| 403 | trace_hardirqs_on(); | ||
| 401 | __ctl_store(cr0, 0, 0); | 404 | __ctl_store(cr0, 0, 0); |
| 402 | cr0_sync = cr0; | 405 | cr0_sync = cr0; |
| 403 | cr0_sync |= 0x00000200; | 406 | cr0_sync |= 0x00000200; |
| @@ -415,11 +418,10 @@ sclp_sync_wait(void) | |||
| 415 | barrier(); | 418 | barrier(); |
| 416 | cpu_relax(); | 419 | cpu_relax(); |
| 417 | } | 420 | } |
| 418 | /* Restore interrupt settings */ | 421 | local_irq_disable(); |
| 419 | asm volatile ("SSM 0(%0)" | ||
| 420 | : : "a" (&psw_mask) : "memory"); | ||
| 421 | __ctl_load(cr0, 0, 0); | 422 | __ctl_load(cr0, 0, 0); |
| 422 | __local_bh_enable(); | 423 | _local_bh_enable(); |
| 424 | local_irq_restore(flags); | ||
| 423 | } | 425 | } |
| 424 | 426 | ||
| 425 | EXPORT_SYMBOL(sclp_sync_wait); | 427 | EXPORT_SYMBOL(sclp_sync_wait); |
