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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to