svn commit: r355339 - stable/12/sys/cam
Alexander Motin
mav at FreeBSD.org
Tue Dec 3 16:51:27 UTC 2019
Author: mav
Date: Tue Dec 3 16:51:26 2019
New Revision: 355339
URL: https://svnweb.freebsd.org/changeset/base/355339
Log:
MFC r355023: Do not retry long ready waits if previous gave nothing.
I have some disks reporting "Logical unit is in process of becoming ready"
for about half an hour before finally reporting failure. During that time
CAM waits for the readiness during ~2 minutes for each request, that makes
system boot take very long time.
This change reduces wait times for the following requests to ~1 second if
previously long wait for that device has timed out.
Modified:
stable/12/sys/cam/cam_periph.c
stable/12/sys/cam/cam_periph.h
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cam/cam_periph.c
==============================================================================
--- stable/12/sys/cam/cam_periph.c Tue Dec 3 16:50:06 2019 (r355338)
+++ stable/12/sys/cam/cam_periph.c Tue Dec 3 16:51:26 2019 (r355339)
@@ -1428,6 +1428,14 @@ camperiphdone(struct cam_periph *periph, union ccb *do
xpt_async(AC_INQ_CHANGED, done_ccb->ccb_h.path, NULL);
}
+ /* If we tried long wait and still failed, remember that. */
+ if ((periph->flags & CAM_PERIPH_RECOVERY_WAIT) &&
+ (done_ccb->csio.cdb_io.cdb_bytes[0] == TEST_UNIT_READY)) {
+ periph->flags &= ~CAM_PERIPH_RECOVERY_WAIT;
+ if (error != 0 && done_ccb->ccb_h.retry_count == 0)
+ periph->flags |= CAM_PERIPH_RECOVERY_WAIT_FAILED;
+ }
+
/*
* After recovery action(s) completed, return to the original CCB.
* If the recovery CCB has failed, considering its own possible
@@ -1783,7 +1791,9 @@ camperiphscsisenseerror(union ccb *ccb, union ccb **or
*/
int retries;
- if ((err_action & SSQ_MANY) != 0) {
+ if ((err_action & SSQ_MANY) != 0 && (periph->flags &
+ CAM_PERIPH_RECOVERY_WAIT_FAILED) == 0) {
+ periph->flags |= CAM_PERIPH_RECOVERY_WAIT;
*action_string = "Polling device for readiness";
retries = 120;
} else {
Modified: stable/12/sys/cam/cam_periph.h
==============================================================================
--- stable/12/sys/cam/cam_periph.h Tue Dec 3 16:50:06 2019 (r355338)
+++ stable/12/sys/cam/cam_periph.h Tue Dec 3 16:51:26 2019 (r355339)
@@ -132,6 +132,8 @@ struct cam_periph {
#define CAM_PERIPH_RUN_TASK 0x40
#define CAM_PERIPH_FREE 0x80
#define CAM_PERIPH_ANNOUNCED 0x100
+#define CAM_PERIPH_RECOVERY_WAIT 0x200
+#define CAM_PERIPH_RECOVERY_WAIT_FAILED 0x400
uint32_t scheduled_priority;
uint32_t immediate_priority;
int periph_allocating;
More information about the svn-src-stable
mailing list