svn commit: r292218 - in head/sys/dev: mpr mps
Alan Somers
asomers at FreeBSD.org
Mon Dec 14 19:40:48 UTC 2015
Author: asomers
Date: Mon Dec 14 19:40:47 2015
New Revision: 292218
URL: https://svnweb.freebsd.org/changeset/base/292218
Log:
Don't retry SAS commands in response to protocol errors
sys/dev/mpr/mpr_sas_lsi.c
sys/dev/mps/mps_sas_lsi.c
When mp[rs]sas_get_sata_identify returns
MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR, don't bother retrying. Protocol
errors aren't likely to be fixed by sleeping.
Without this change, a system that generated may protocol errors due
to signal integrity issues was taking more than an hour to boot, due
to all the retries.
Reviewed by: slm
MFC after: 4 weeks
Sponsored by: Spectra Logic Corp
Differential Revision: https://reviews.freebsd.org/D4553
Modified:
head/sys/dev/mpr/mpr_sas_lsi.c
head/sys/dev/mps/mps_sas_lsi.c
Modified: head/sys/dev/mpr/mpr_sas_lsi.c
==============================================================================
--- head/sys/dev/mpr/mpr_sas_lsi.c Mon Dec 14 19:20:18 2015 (r292217)
+++ head/sys/dev/mpr/mpr_sas_lsi.c Mon Dec 14 19:40:47 2015 (r292218)
@@ -885,7 +885,13 @@ mprsas_get_sas_address_for_sata_disk(str
ioc_status = le16toh(mpi_reply.IOCStatus)
& MPI2_IOCSTATUS_MASK;
sas_status = mpi_reply.SASStatus;
- if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
+ switch (ioc_status) {
+ case MPI2_IOCSTATUS_SUCCESS:
+ break;
+ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
+ /* No sense sleeping. this error won't get better */
+ break;
+ default:
if (sc->spinup_wait_time > 0) {
mpr_dprint(sc, MPR_INFO, "Sleeping %d seconds "
"after SATA ID error to wait for spinup\n",
@@ -894,8 +900,10 @@ mprsas_get_sas_address_for_sata_disk(str
"mprid", sc->spinup_wait_time * hz);
}
}
- } while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
- (try_count < 5));
+ } while (((rc && (rc != EWOULDBLOCK)) ||
+ (ioc_status &&
+ (ioc_status != MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR))
+ || sas_status) && (try_count < 5));
if (rc == 0 && !ioc_status && !sas_status) {
mpr_dprint(sc, MPR_MAPPING, "%s: got SATA identify "
Modified: head/sys/dev/mps/mps_sas_lsi.c
==============================================================================
--- head/sys/dev/mps/mps_sas_lsi.c Mon Dec 14 19:20:18 2015 (r292217)
+++ head/sys/dev/mps/mps_sas_lsi.c Mon Dec 14 19:40:47 2015 (r292218)
@@ -794,7 +794,13 @@ mpssas_get_sas_address_for_sata_disk(str
ioc_status = le16toh(mpi_reply.IOCStatus)
& MPI2_IOCSTATUS_MASK;
sas_status = mpi_reply.SASStatus;
- if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
+ switch (ioc_status) {
+ case MPI2_IOCSTATUS_SUCCESS:
+ break;
+ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
+ /* No sense sleeping. this error won't get better */
+ break;
+ default:
if (sc->spinup_wait_time > 0) {
mps_dprint(sc, MPS_INFO, "Sleeping %d seconds "
"after SATA ID error to wait for spinup\n",
@@ -803,8 +809,10 @@ mpssas_get_sas_address_for_sata_disk(str
"mpsid", sc->spinup_wait_time * hz);
}
}
- } while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
- (try_count < 5));
+ } while (((rc && (rc != EWOULDBLOCK)) ||
+ (ioc_status &&
+ (ioc_status != MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR))
+ || sas_status) && (try_count < 5));
if (rc == 0 && !ioc_status && !sas_status) {
mps_dprint(sc, MPS_MAPPING, "%s: got SATA identify "
More information about the svn-src-head
mailing list