Skip to content

Commit

Permalink
[PATCH] s390: instruction processing damage handling
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Heiko Carstens authored and Linus Torvalds committed Apr 28, 2006
1 parent 9b5dec1 commit b73d40c
Showing 1 changed file with 28 additions and 5 deletions.
33 changes: 28 additions & 5 deletions drivers/s390/s390mach.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,12 +362,19 @@ s390_revalidate_registers(struct mci *mci)
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;
Expand Down Expand Up @@ -404,11 +411,27 @@ s390_do_machine_check(struct pt_regs *regs)
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 */
Expand Down

0 comments on commit b73d40c

Please sign in to comment.