diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-04-15 06:55:07 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-05-20 02:58:47 -0400 |
commit | d3a73acbc26a4a81a01a35fd162973e53d0386f5 (patch) | |
tree | 5b8fd3880f3b38575b1a043f3f4f07623a633bd1 /arch/s390/kernel/nmi.c | |
parent | beef560b4cdfafb2211a856e1d722540f5151933 (diff) |
s390: split TIF bits into CIF, PIF and TIF bits
The oi and ni instructions used in entry[64].S to set and clear bits
in the thread-flags are not guaranteed to be atomic in regard to other
CPUs. Split the TIF bits into CPU, pt_regs and thread-info specific
bits. Updates on the TIF bits are done with atomic instructions,
updates on CPU and pt_regs bits are done with non-atomic instructions.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/nmi.c')
-rw-r--r-- | arch/s390/kernel/nmi.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index c4c033819879..210e1285f75a 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c | |||
@@ -55,7 +55,7 @@ void s390_handle_mcck(void) | |||
55 | local_mcck_disable(); | 55 | local_mcck_disable(); |
56 | mcck = __get_cpu_var(cpu_mcck); | 56 | mcck = __get_cpu_var(cpu_mcck); |
57 | memset(&__get_cpu_var(cpu_mcck), 0, sizeof(struct mcck_struct)); | 57 | memset(&__get_cpu_var(cpu_mcck), 0, sizeof(struct mcck_struct)); |
58 | clear_thread_flag(TIF_MCCK_PENDING); | 58 | clear_cpu_flag(CIF_MCCK_PENDING); |
59 | local_mcck_enable(); | 59 | local_mcck_enable(); |
60 | local_irq_restore(flags); | 60 | local_irq_restore(flags); |
61 | 61 | ||
@@ -313,7 +313,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs) | |||
313 | */ | 313 | */ |
314 | mcck->kill_task = 1; | 314 | mcck->kill_task = 1; |
315 | mcck->mcck_code = *(unsigned long long *) mci; | 315 | mcck->mcck_code = *(unsigned long long *) mci; |
316 | set_thread_flag(TIF_MCCK_PENDING); | 316 | set_cpu_flag(CIF_MCCK_PENDING); |
317 | } else { | 317 | } else { |
318 | /* | 318 | /* |
319 | * Couldn't restore all register contents while in | 319 | * Couldn't restore all register contents while in |
@@ -352,12 +352,12 @@ void notrace s390_do_machine_check(struct pt_regs *regs) | |||
352 | if (mci->cp) { | 352 | if (mci->cp) { |
353 | /* Channel report word pending */ | 353 | /* Channel report word pending */ |
354 | mcck->channel_report = 1; | 354 | mcck->channel_report = 1; |
355 | set_thread_flag(TIF_MCCK_PENDING); | 355 | set_cpu_flag(CIF_MCCK_PENDING); |
356 | } | 356 | } |
357 | if (mci->w) { | 357 | if (mci->w) { |
358 | /* Warning pending */ | 358 | /* Warning pending */ |
359 | mcck->warning = 1; | 359 | mcck->warning = 1; |
360 | set_thread_flag(TIF_MCCK_PENDING); | 360 | set_cpu_flag(CIF_MCCK_PENDING); |
361 | } | 361 | } |
362 | nmi_exit(); | 362 | nmi_exit(); |
363 | } | 363 | } |