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

Ian Lepore ian at FreeBSD.org
Wed Apr 2 13:24:19 UTC 2014


On Tue, 2014-04-01 at 22:03 +0000, Edward Tomasz Napierala wrote:
> 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;
> +	}
> +

The %jd on these is causing build failures on 32-bit arches due to
size_t being only 32 bits.

-- Ian


> +	error = soreserve(ic->ic_socket, sendspace, recvspace);
>  	if (error != 0) {
>  		ICL_WARN("soreserve failed with error %d", error);
>  		icl_conn_close(ic);
> 




More information about the svn-src-all mailing list