aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/nmi.c
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2014-04-15 06:55:07 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-05-20 02:58:47 -0400
commitd3a73acbc26a4a81a01a35fd162973e53d0386f5 (patch)
tree5b8fd3880f3b38575b1a043f3f4f07623a633bd1 /arch/s390/kernel/nmi.c
parentbeef560b4cdfafb2211a856e1d722540f5151933 (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.c8
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}