Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de1b0438 authored by Peter Oberparleiter's avatar Peter Oberparleiter Committed by Martin Schwidefsky
Browse files

[S390] cio: improve error recovery for internal I/Os



Improve error recovery for internal I/Os by repeating each I/O
256 times per path to cope with long-running non-permanent error
conditions. Also retry each path twice to cope with link flapping,
i.e. single paths becoming unavailable in the order in which they
are tried.

Signed-off-by: default avatarPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 7a8ad100
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ static void ccwreq_do(struct ccw_device *cdev)
		/* Perform start function. */
		sch->lpm = 0xff;
		memset(&cdev->private->irb, 0, sizeof(struct irb));
		rc = cio_start(sch, cp, req->mask);
		rc = cio_start(sch, cp, (u8) req->mask);
		if (rc == 0) {
			/* I/O started successfully. */
			ccw_device_set_timeout(cdev, req->timeout);
@@ -116,7 +116,8 @@ void ccw_request_start(struct ccw_device *cdev)
{
	struct ccw_request *req = &cdev->private->req;

	req->mask	= 0x80;
	/* Try all paths twice to counter link flapping. */
	req->mask	= 0x8080;
	req->retries	= req->maxretries;
	req->mask	= lpm_adjust(req->mask, req->lpm);
	req->drc	= 0;
@@ -212,7 +213,7 @@ static void ccwreq_log_status(struct ccw_device *cdev, enum io_status status)
	}  __attribute__ ((packed)) data;
	data.dev_id	= cdev->private->dev_id;
	data.retries	= req->retries;
	data.lpm	= req->mask;
	data.lpm	= (u8) req->mask;
	data.status	= (u8) status;
	CIO_TRACE_EVENT(2, "reqstat");
	CIO_HEX_EVENT(2, &data, sizeof(data));
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
#include "device.h"
#include "io_sch.h"

#define SENSE_ID_RETRIES	5
#define SENSE_ID_RETRIES	256
#define SENSE_ID_TIMEOUT	(10 * HZ)
#define SENSE_ID_MIN_LEN	4
#define SENSE_ID_BASIC_LEN	7
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
#include "device.h"
#include "io_sch.h"

#define PGID_RETRIES	5
#define PGID_RETRIES	256
#define PGID_TIMEOUT	(10 * HZ)

/*
+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ struct ccw_request {
	void (*callback)(struct ccw_device *, void *, int);
	void *data;
	/* These fields are used internally. */
	u8 mask;
	u16 mask;
	u16 retries;
	int drc;
	int cancel:1;