Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Apr 2014 22:03:04 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264025 - head/sys/dev/iscsi
Message-ID:  <201404012203.s31M34Gr007384@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Tue Apr  1 22:03:03 2014
New Revision: 264025
URL: http://svnweb.freebsd.org/changeset/base/264025

Log:
  Get rid of the "autoscaling", instead just set socket buffer sizes
  in the usual way.  The only thing the old code did was making things
  less predictable.
  
  Sponsored by:	The FreeBSD Foundation

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

Modified: head/sys/dev/iscsi/icl.c
==============================================================================
--- head/sys/dev/iscsi/icl.c	Tue Apr  1 21:54:20 2014	(r264024)
+++ head/sys/dev/iscsi/icl.c	Tue Apr  1 22:03:03 2014	(r264025)
@@ -68,6 +68,14 @@ TUNABLE_INT("kern.icl.partial_receive_le
 SYSCTL_INT(_kern_icl, OID_AUTO, partial_receive_len, CTLFLAG_RW,
     &partial_receive_len, 1 * 1024, "Minimum read size for partially received "
     "data segment");
+static int sendspace = 1048576;
+TUNABLE_INT("kern.icl.sendspace", &sendspace);
+SYSCTL_INT(_kern_icl, OID_AUTO, sendspace, CTLFLAG_RW,
+    &sendspace, 1048576, "Default send socket buffer size");
+static int recvspace = 1048576;
+TUNABLE_INT("kern.icl.recvspace", &recvspace);
+SYSCTL_INT(_kern_icl, OID_AUTO, recvspace, CTLFLAG_RW,
+    &recvspace, 1048576, "Default receive socket buffer size");
 
 static uma_zone_t icl_conn_zone;
 static uma_zone_t icl_pdu_zone;
@@ -1008,7 +1016,7 @@ icl_conn_free(struct icl_conn *ic)
 static int
 icl_conn_start(struct icl_conn *ic)
 {
-	size_t bufsize;
+	size_t minspace;
 	struct sockopt opt;
 	int error, one = 1;
 
@@ -1029,18 +1037,28 @@ icl_conn_start(struct icl_conn *ic)
 	ICL_CONN_UNLOCK(ic);
 
 	/*
-	 * Use max available sockbuf size for sending.  Do it manually
-	 * instead of sbreserve(9) to work around resource limits.
+	 * For sendspace, this is required because the current code cannot
+	 * send a PDU in pieces; thus, the minimum buffer size is equal
+	 * to the maximum PDU size.  "+4" is to account for possible padding.
 	 *
-	 * XXX: This kind of sucks.  On one hand, we don't currently support
-	 *	sending a part of data segment; we always do it in one piece,
-	 *	so we have to make sure it can fit in the socket buffer.
-	 *	Once I've implemented partial send, we'll get rid of this
-	 *	and use autoscaling.
+	 * What we should actually do here is to use autoscaling, but set
+	 * some minimal buffer size to "minspace".  I don't know a way to do
+	 * that, though.
 	 */
-        bufsize = (sizeof(struct iscsi_bhs) +
-            ic->ic_max_data_segment_length) * 8;
-	error = soreserve(ic->ic_socket, bufsize, bufsize);
+	minspace = sizeof(struct iscsi_bhs) + ic->ic_max_data_segment_length +
+	    ISCSI_HEADER_DIGEST_SIZE + ISCSI_DATA_DIGEST_SIZE + 4;
+	if (sendspace < minspace) {
+		ICL_WARN("kern.icl.sendspace too low; must be at least %jd",
+		    minspace);
+		sendspace = minspace;
+	}
+	if (recvspace < minspace) {
+		ICL_WARN("kern.icl.recvspace too low; must be at least %jd",
+		    minspace);
+		recvspace = minspace;
+	}
+
+	error = soreserve(ic->ic_socket, sendspace, recvspace);
 	if (error != 0) {
 		ICL_WARN("soreserve failed with error %d", error);
 		icl_conn_close(ic);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404012203.s31M34Gr007384>