[PATCHv2] [DCCP]: Use higher timeout value for nofeedback timer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Following the performance discussions, I would still
like to see this integrated. 

By using the default value (1 second), we have the same
nofeedback timer behaviour as in 2.6.19.

The patch is the same, but I
 * have reworded the configuration dialog / commit message and
   comments, to make it clearer [cf. Lars' email]
 * replaced multiplication by equivalent bit-shift operations
   
Both patches have been uploaded as 05a/05b, the former alredy
has Ian's signed-off line.

---------------------> The Patch <----------------------------
[DCCP]: Use higher RTO default for CCID3 

The TFRC nofeedback timer normally expires after the maximum of 4
RTTs and twice the current send interval (RFC 3448, 4.3). On LANs
with a small RTT this can mean a high processing load and reduced
performance, since then the nofeedback timer is triggered very
frequently. As a result, the sending rate quickly converges towards
zero.

This patch provides a configuration option to set the bound for the
nofeedback timer, using as default the TCP lower bound of 1 second.

By setting the configuration option to 0, strict RFC 3448 behaviour
can be enforced for the nofeedback timer.

Signed-off-by: Gerrit Renker <gerrit@xxxxxxxxxxxxxx>
---
 net/dccp/ccids/Kconfig |   24 ++++++++++++++++++++++++
 net/dccp/ccids/ccid3.c |   20 +++++++++++---------
 2 files changed, 35 insertions(+), 9 deletions(-)

--- a/net/dccp/ccids/Kconfig
+++ b/net/dccp/ccids/Kconfig
@@ -89,4 +89,28 @@ config IP_DCCP_CCID3_DEBUG
 	    parameter to 0 or 1.
 
 	    If in doubt, say N.
+
+config IP_DCCP_CCID3_RTO
+	  int "Use higher bound for nofeedback timer"
+	  default 1
+	  depends on IP_DCCP_CCID3
+	  ---help---
+	    Use higher lower bound for nofeedback timer expiration.
+
+	    The TFRC nofeedback timer normally expires after the maximum of 4
+	    RTTs and twice the current send interval (RFC 3448, 4.3). On LANs
+	    with a small RTT this can mean a high processing load and reduced
+	    performance, since then the nofeedback timer is triggered very
+	    frequently.
+
+	    This option enables to set a higher lower bound for the nofeedback
+	    value. Values in units of seconds can be set here.
+
+	    A value of 0 disables this feature by enforcing the value specified
+	    in RFC 3448. It is recommended to use the default value of 1 second,
+	    as this is also the suggested lower bound for TCP (RFC 2988, 2.4).
+
+	    Using a value of 2 seconds corresponds to the initial timeout (RFC
+	    3448, 4.2); higher values than this should not normally be necessary.
+
 endmenu
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -245,9 +245,10 @@ static void ccid3_hc_tx_no_feedback_time
 		}
 		/*
 		 * Schedule no feedback timer to expire in
-		 * max(4 * R, 2 * s/X)  =  max(4 * R, 2 * t_ipi)
+		 * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
+		 * See comments above regarding the value of t_RTO.
 		 */
-		t_nfb = max(4 * hctx->ccid3hctx_rtt, 2 * hctx->ccid3hctx_t_ipi);
+		t_nfb = max(hctx->ccid3hctx_t_rto, hctx->ccid3hctx_t_ipi << 1);
 		break;
 	case TFRC_SSTATE_NO_SENT:
 		DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
@@ -512,16 +513,17 @@ static void ccid3_hc_tx_packet_recv(stru
 		 */
 		sk->sk_write_space(sk);
 
-		/* Update timeout interval. We use the alternative variant of
-		 * [RFC 3448, 3.1] which sets the upper bound of t_rto to one
-		 * second, as it is suggested for TCP (see RFC 2988, 2.4). */
-		hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
-					      	   USEC_PER_SEC            );
+		/* 	Update timeout interval for the nofeedback timer:
+		 * A value of IP_DCCP_CCID3_RTO=0 lets the nofeedback timer
+		 * expire as per [RFC 3448, 4]; a value of 1 second corresponds
+		 * to the lower bound suggested for TCP  (see RFC 2988, 2.4). */
+		hctx->ccid3hctx_t_rto = max_t(u32, hctx->ccid3hctx_rtt << 2,
+					CONFIG_IP_DCCP_CCID3_RTO * USEC_PER_SEC);
 		/*
 		 * Schedule no feedback timer to expire in
-		 * max(4 * R, 2 * s/X)  =  max(4 * R, 2 * t_ipi)
+		 * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
 		 */
-		t_nfb = max(4 * hctx->ccid3hctx_rtt, 2 * hctx->ccid3hctx_t_ipi);
+		t_nfb = max(hctx->ccid3hctx_t_rto, hctx->ccid3hctx_t_ipi << 1);
 			
 		ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
 			       "expire in %lu jiffies (%luus)\n",


[Index of Archives]     [Linux Kernel Development]     [Linux DCCP]     [IETF Annouce]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [DDR & Rambus]

  Powered by Linux