public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 11/13] s390: instruction processing damage handling.
@ 2006-04-24 15:05 Martin Schwidefsky
  2006-04-24 23:58 ` Andrew Morton
  2006-04-28  7:33 ` Josef Sipek
  0 siblings, 2 replies; 9+ messages in thread
From: Martin Schwidefsky @ 2006-04-24 15:05 UTC (permalink / raw)
  To: linux-kernel, akpm, heiko.carstens

From: Heiko Carstens <heiko.carstens@de.ibm.com>

[patch 11/13] s390: instruction processing damage handling.

In case of an instruction processing damage (IPD) machine check in
kernel mode the resulting action is always to stop the kernel.
This is not necessarily the best solution since a retry of the
failing instruction might succeed. Add logic to retry the instruction
if no more than 30 instruction processing damage checks occured in
the last 5 minutes.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
---

 drivers/s390/s390mach.c |   33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diff -urpN linux-2.6/drivers/s390/s390mach.c linux-2.6-patched/drivers/s390/s390mach.c
--- linux-2.6/drivers/s390/s390mach.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6-patched/drivers/s390/s390mach.c	2006-04-24 16:47:28.000000000 +0200
@@ -362,12 +362,19 @@ s390_revalidate_registers(struct mci *mc
 	return kill_task;
 }
 
+#define MAX_IPD_COUNT	29
+#define MAX_IPD_TIME	(5 * 60 * 100 * 1000) /* 5 minutes */
+
 /*
  * machine check handler.
  */
 void
 s390_do_machine_check(struct pt_regs *regs)
 {
+	static DEFINE_SPINLOCK(ipd_lock);
+	static unsigned long long last_ipd;
+	static int ipd_count;
+	unsigned long long tmp;
 	struct mci *mci;
 	struct mcck_struct *mcck;
 	int umode;
@@ -404,11 +411,27 @@ s390_do_machine_check(struct pt_regs *re
 				s390_handle_damage("processing backup machine "
 						   "check with damage.");
 			}
-			if (!umode)
-				s390_handle_damage("processing backup machine "
-						   "check in kernel mode.");
-			mcck->kill_task = 1;
-			mcck->mcck_code = *(unsigned long long *) mci;
+
+			/*
+			 * Nullifying exigent condition, therefore we might
+			 * retry this instruction.
+			 */
+
+			spin_lock(&ipd_lock);
+
+			tmp = get_clock();
+
+			if (((tmp - last_ipd) >> 12) < MAX_IPD_TIME)
+				ipd_count++;
+			else
+				ipd_count = 1;
+
+			last_ipd = tmp;
+
+			if (ipd_count == MAX_IPD_COUNT)
+				s390_handle_damage("too many ipd retries.");
+
+			spin_unlock(&ipd_lock);
 		}
 		else {
 			/* Processing damage -> stopping machine */

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2006-04-28 16:46 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-24 15:05 [patch 11/13] s390: instruction processing damage handling Martin Schwidefsky
2006-04-24 23:58 ` Andrew Morton
2006-04-25 20:14   ` Arnd Bergmann
2006-04-28  7:33 ` Josef Sipek
2006-04-28  8:39   ` Heiko Carstens
2006-04-28  9:24     ` Martin Schwidefsky
2006-04-28 13:43       ` Paulo Marques
2006-04-28 14:53         ` Martin Schwidefsky
2006-04-28 16:46           ` Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox