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

[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
...@@ -82,7 +82,7 @@ static void ccwreq_do(struct ccw_device *cdev) ...@@ -82,7 +82,7 @@ static void ccwreq_do(struct ccw_device *cdev)
/* Perform start function. */ /* Perform start function. */
sch->lpm = 0xff; sch->lpm = 0xff;
memset(&cdev->private->irb, 0, sizeof(struct irb)); 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) { if (rc == 0) {
/* I/O started successfully. */ /* I/O started successfully. */
ccw_device_set_timeout(cdev, req->timeout); ccw_device_set_timeout(cdev, req->timeout);
...@@ -116,7 +116,8 @@ void ccw_request_start(struct ccw_device *cdev) ...@@ -116,7 +116,8 @@ void ccw_request_start(struct ccw_device *cdev)
{ {
struct ccw_request *req = &cdev->private->req; 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->retries = req->maxretries;
req->mask = lpm_adjust(req->mask, req->lpm); req->mask = lpm_adjust(req->mask, req->lpm);
req->drc = 0; req->drc = 0;
...@@ -212,7 +213,7 @@ static void ccwreq_log_status(struct ccw_device *cdev, enum io_status status) ...@@ -212,7 +213,7 @@ static void ccwreq_log_status(struct ccw_device *cdev, enum io_status status)
} __attribute__ ((packed)) data; } __attribute__ ((packed)) data;
data.dev_id = cdev->private->dev_id; data.dev_id = cdev->private->dev_id;
data.retries = req->retries; data.retries = req->retries;
data.lpm = req->mask; data.lpm = (u8) req->mask;
data.status = (u8) status; data.status = (u8) status;
CIO_TRACE_EVENT(2, "reqstat"); CIO_TRACE_EVENT(2, "reqstat");
CIO_HEX_EVENT(2, &data, sizeof(data)); CIO_HEX_EVENT(2, &data, sizeof(data));
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include "device.h" #include "device.h"
#include "io_sch.h" #include "io_sch.h"
#define SENSE_ID_RETRIES 5 #define SENSE_ID_RETRIES 256
#define SENSE_ID_TIMEOUT (10 * HZ) #define SENSE_ID_TIMEOUT (10 * HZ)
#define SENSE_ID_MIN_LEN 4 #define SENSE_ID_MIN_LEN 4
#define SENSE_ID_BASIC_LEN 7 #define SENSE_ID_BASIC_LEN 7
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "device.h" #include "device.h"
#include "io_sch.h" #include "io_sch.h"
#define PGID_RETRIES 5 #define PGID_RETRIES 256
#define PGID_TIMEOUT (10 * HZ) #define PGID_TIMEOUT (10 * HZ)
/* /*
......
...@@ -109,7 +109,7 @@ struct ccw_request { ...@@ -109,7 +109,7 @@ struct ccw_request {
void (*callback)(struct ccw_device *, void *, int); void (*callback)(struct ccw_device *, void *, int);
void *data; void *data;
/* These fields are used internally. */ /* These fields are used internally. */
u8 mask; u16 mask;
u16 retries; u16 retries;
int drc; int drc;
int cancel:1; int cancel:1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment