summaryrefslogtreecommitdiffstats
path: root/arch/s390/include
diff options
context:
space:
mode:
authorHeiko Carstens2015-10-09 13:48:03 +0200
committerMartin Schwidefsky2015-10-14 14:32:18 +0200
commit29b0a8250ba63beffba4fe3a42fa75dddf4bd06a (patch)
tree07d567892411d28f22003f73193ae37a80cf4d17 /arch/s390/include
parents390/pci: reshuffle struct used to write debug data (diff)
downloadkernel-qcow2-linux-29b0a8250ba63beffba4fe3a42fa75dddf4bd06a.tar.gz
kernel-qcow2-linux-29b0a8250ba63beffba4fe3a42fa75dddf4bd06a.tar.xz
kernel-qcow2-linux-29b0a8250ba63beffba4fe3a42fa75dddf4bd06a.zip
s390/etr,stp: fix possible deadlock on machine check
The first level machine check handler for etr and stp machine checks may call queue_work() while in nmi context. This may deadlock e.g. if the machine check happened when the interrupted context did hold a lock, that also will be acquired by queue_work(). Therefore split etr and stp machine check handling into first and second level handling. The second level handling will then issue the queue_work() call in process context which avoids the potential deadlock. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/include')
-rw-r--r--arch/s390/include/asm/etr.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/s390/include/asm/etr.h b/arch/s390/include/asm/etr.h
index f7e5c36688c3..105f90e63a0e 100644
--- a/arch/s390/include/asm/etr.h
+++ b/arch/s390/include/asm/etr.h
@@ -211,8 +211,9 @@ static inline int etr_ptff(void *ptff_block, unsigned int func)
#define ETR_PTFF_SGS 0x43 /* set gross steering rate */
/* Functions needed by the machine check handler */
-void etr_switch_to_local(void);
-void etr_sync_check(void);
+int etr_switch_to_local(void);
+int etr_sync_check(void);
+void etr_queue_work(void);
/* notifier for syncs */
extern struct atomic_notifier_head s390_epoch_delta_notifier;
@@ -253,7 +254,8 @@ struct stp_sstpi {
} __attribute__ ((packed));
/* Functions needed by the machine check handler */
-void stp_sync_check(void);
-void stp_island_check(void);
+int stp_sync_check(void);
+int stp_island_check(void);
+void stp_queue_work(void);
#endif /* __S390_ETR_H */