Author: mav
Date: Fri Mar  3 06:04:42 2017
New Revision: 314583
URL: https://svnweb.freebsd.org/changeset/base/314583

Log:
  MFC r313852: Freeze CAM SIM when request is postponed due to MaxCmdSN.
  
  This allows to avoid resource allocation (especially offload) for requests
  that can not be executed at this time any way.

Modified:
  stable/10/sys/dev/iscsi/iscsi.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/iscsi/iscsi.c
==============================================================================
--- stable/10/sys/dev/iscsi/iscsi.c     Fri Mar  3 06:04:03 2017        
(r314582)
+++ stable/10/sys/dev/iscsi/iscsi.c     Fri Mar  3 06:04:42 2017        
(r314583)
@@ -233,14 +233,16 @@ iscsi_session_send_postponed(struct iscs
 
        ISCSI_SESSION_LOCK_ASSERT(is);
 
-       while (!STAILQ_EMPTY(&is->is_postponed)) {
-               request = STAILQ_FIRST(&is->is_postponed);
+       if (STAILQ_EMPTY(&is->is_postponed))
+               return;
+       while ((request = STAILQ_FIRST(&is->is_postponed)) != NULL) {
                postpone = iscsi_pdu_prepare(request);
                if (postpone)
-                       break;
+                       return;
                STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next);
                icl_pdu_queue(request);
        }
+       xpt_release_simq(is->is_sim, 1);
 }
 
 static void
@@ -254,6 +256,8 @@ iscsi_pdu_queue_locked(struct icl_pdu *r
        iscsi_session_send_postponed(is);
        postpone = iscsi_pdu_prepare(request);
        if (postpone) {
+               if (STAILQ_EMPTY(&is->is_postponed))
+                       xpt_freeze_simq(is->is_sim, 1);
                STAILQ_INSERT_TAIL(&is->is_postponed, request, ip_next);
                return;
        }
@@ -339,8 +343,9 @@ iscsi_session_cleanup(struct iscsi_sessi
        /*
         * Remove postponed PDUs.
         */
-       while (!STAILQ_EMPTY(&is->is_postponed)) {
-               pdu = STAILQ_FIRST(&is->is_postponed);
+       if (!STAILQ_EMPTY(&is->is_postponed))
+               xpt_release_simq(is->is_sim, 1);
+       while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) {
                STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next);
                icl_pdu_free(pdu);
        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to