svn commit: r313852 - head/sys/dev/iscsi

Alexander Motin mav at FreeBSD.org
Fri Feb 17 04:34:19 UTC 2017


Author: mav
Date: Fri Feb 17 04:34:17 2017
New Revision: 313852
URL: https://svnweb.freebsd.org/changeset/base/313852

Log:
  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.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/iscsi/iscsi.c

Modified: head/sys/dev/iscsi/iscsi.c
==============================================================================
--- head/sys/dev/iscsi/iscsi.c	Fri Feb 17 04:29:23 2017	(r313851)
+++ head/sys/dev/iscsi/iscsi.c	Fri Feb 17 04:34:17 2017	(r313852)
@@ -231,14 +231,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
@@ -252,6 +254,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);
 	}


More information about the svn-src-head mailing list