diff options
author | Sven Schnelle <svens@linux.ibm.com> | 2020-02-20 12:09:36 +0100 |
---|---|---|
committer | Vasily Gorbik <gor@linux.ibm.com> | 2020-05-28 12:21:54 +0200 |
commit | 0b0ed657fe003fdf4df3766b898e8869950aa1ce (patch) | |
tree | aa4ee98940a9605c6bc5dd580794c9378f66a640 /arch/s390/lib | |
parent | 11886c199d8d62e2469cb404235a4ee7266f01c7 (diff) | |
download | linux-stable-0b0ed657fe003fdf4df3766b898e8869950aa1ce.tar.gz linux-stable-0b0ed657fe003fdf4df3766b898e8869950aa1ce.tar.bz2 linux-stable-0b0ed657fe003fdf4df3766b898e8869950aa1ce.zip |
s390: remove critical section cleanup from entry.S
The current code is rather complex and caused a lot of subtle
and hard to debug bugs in the past. Simplify the code by calling
the system_call handler with interrupts disabled, save
machine state, and re-enable them later.
This requires significant changes to the machine check handling code
as well. When the machine check interrupt arrived while being in kernel
mode the new code will signal pending machine checks with a SIGP external
call. When userspace was interrupted, the handler will switch to the
kernel stack and directly execute s390_handle_mcck().
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/lib')
-rw-r--r-- | arch/s390/lib/delay.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index d4aa10795605..daca7bad66de 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c @@ -33,7 +33,7 @@ EXPORT_SYMBOL(__delay); static void __udelay_disabled(unsigned long long usecs) { - unsigned long cr0, cr0_new, psw_mask; + unsigned long cr0, cr0_new, psw_mask, flags; struct s390_idle_data idle; u64 end; @@ -45,7 +45,9 @@ static void __udelay_disabled(unsigned long long usecs) psw_mask = __extract_psw() | PSW_MASK_EXT | PSW_MASK_WAIT; set_clock_comparator(end); set_cpu_flag(CIF_IGNORE_IRQ); + local_irq_save(flags); psw_idle(&idle, psw_mask); + local_irq_restore(flags); clear_cpu_flag(CIF_IGNORE_IRQ); set_clock_comparator(S390_lowcore.clock_comparator); __ctl_load(cr0, 0, 0); |