Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1488489

[PATCH net-next 9/9] rxrpc: Reduce the number of ACK-Requests sent

From David Howells <dhowells@redhat.com>
Newsgroups linux.kernel
Subject [PATCH net-next 9/9] rxrpc: Reduce the number of ACK-Requests sent
Date 2016-09-22 02:50 +0200
Message-ID <sk0n8-7Ht-17@gated-at.bofh.it> (permalink)
References <sk0dr-7E9-3@gated-at.bofh.it>
Organization Red Hat UK Ltd. Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SI4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 3798903

Show all headers | View raw


Reduce the number of ACK-Requests we set on DATA packets that we're sending
to reduce network traffic.  We set the flag on odd-numbered DATA packets to
start off the RTT cache until we have at least three entries in it and then
probe once per second thereafter to keep it topped up.

This could be made tunable in future.

Note that from this point, the RXRPC_REQUEST_ACK flag is set on DATA
packets as we transmit them and not stored statically in the sk_buff.

Signed-off-by: David Howells <dhowells@redhat.com>
---

 net/rxrpc/ar-internal.h |    1 +
 net/rxrpc/output.c      |   13 +++++++++++--
 net/rxrpc/peer_object.c |    1 +
 net/rxrpc/sendmsg.c     |    2 --
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 1c4597b2c6cd..b13754a6dd7a 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -255,6 +255,7 @@ struct rxrpc_peer {
 
 	/* calculated RTT cache */
 #define RXRPC_RTT_CACHE_SIZE 32
+	ktime_t			rtt_last_req;	/* Time of last RTT request */
 	u64			rtt;		/* Current RTT estimate (in nS) */
 	u64			rtt_sum;	/* Sum of cache contents */
 	u64			rtt_cache[RXRPC_RTT_CACHE_SIZE]; /* Determined RTT cache */
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
index db01fbb70d23..282cb1e36d06 100644
--- a/net/rxrpc/output.c
+++ b/net/rxrpc/output.c
@@ -270,6 +270,12 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb)
 	msg.msg_controllen = 0;
 	msg.msg_flags = 0;
 
+	/* If our RTT cache needs working on, request an ACK. */
+	if ((call->peer->rtt_usage < 3 && sp->hdr.seq & 1) ||
+	    ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
+			 ktime_get_real()))
+		whdr.flags |= RXRPC_REQUEST_ACK;
+
 	if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
 		static int lose;
 		if ((lose++ & 7) == 7) {
@@ -301,11 +307,14 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb)
 
 done:
 	if (ret >= 0) {
-		skb->tstamp = ktime_get_real();
+		ktime_t now = ktime_get_real();
+		skb->tstamp = now;
 		smp_wmb();
 		sp->hdr.serial = serial;
-		if (whdr.flags & RXRPC_REQUEST_ACK)
+		if (whdr.flags & RXRPC_REQUEST_ACK) {
+			call->peer->rtt_last_req = now;
 			trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_data, serial);
+		}
 	}
 	_leave(" = %d [%u]", ret, call->peer->maxdata);
 	return ret;
diff --git a/net/rxrpc/peer_object.c b/net/rxrpc/peer_object.c
index f3e5766910fd..941b724d523b 100644
--- a/net/rxrpc/peer_object.c
+++ b/net/rxrpc/peer_object.c
@@ -244,6 +244,7 @@ static void rxrpc_init_peer(struct rxrpc_peer *peer, unsigned long hash_key)
 	peer->hash_key = hash_key;
 	rxrpc_assess_MTU_size(peer);
 	peer->mtu = peer->if_mtu;
+	peer->rtt_last_req = ktime_get_real();
 
 	switch (peer->srx.transport.family) {
 	case AF_INET:
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
index 607223f4f871..ca7c3be60ad2 100644
--- a/net/rxrpc/sendmsg.c
+++ b/net/rxrpc/sendmsg.c
@@ -299,8 +299,6 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
 			else if (call->tx_top - call->tx_hard_ack <
 				 call->tx_winsize)
 				sp->hdr.flags |= RXRPC_MORE_PACKETS;
-			if (seq & 1)
-				sp->hdr.flags |= RXRPC_REQUEST_ACK;
 
 			ret = conn->security->secure_packet(
 				call, skb, skb->mark, skb->head);

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH net-next 0/9] rxrpc: Preparation for slow-start algorithm David Howells <dhowells@redhat.com> - 2016-09-22 02:40 +0200
  [PATCH net-next 3/9] rxrpc: Add per-peer RTT tracker David Howells <dhowells@redhat.com> - 2016-09-22 02:40 +0200
    Re: [PATCH net-next 3/9] rxrpc: Add per-peer RTT tracker kbuild test robot <lkp@intel.com> - 2016-09-22 06:40 +0200
  [PATCH net-next 2/9] rxrpc: Add re-sent Tx annotation David Howells <dhowells@redhat.com> - 2016-09-22 02:40 +0200
  [PATCH net-next 1/9] rxrpc: Don't store the rxrpc header in the Tx  queue sk_buffs David Howells <dhowells@redhat.com> - 2016-09-22 02:40 +0200
  [PATCH net-next 5/9] rxrpc: Expedite ping response transmission David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
  [PATCH net-next 6/9] rxrpc: Add ktime_sub_ms() David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
  [PATCH net-next 4/9] rxrpc: Send pings to get RTT data David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
  [PATCH net-next 8/9] rxrpc: Reduce the number of PING ACKs sent David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
  [PATCH net-next 7/9] rxrpc: Obtain RTT data by requesting ACKs on  DATA packets David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
  [PATCH net-next 9/9] rxrpc: Reduce the number of ACK-Requests sent David Howells <dhowells@redhat.com> - 2016-09-22 02:50 +0200
    Re: [PATCH net-next 9/9] rxrpc: Reduce the number of ACK-Requests  sent kbuild test robot <lkp@intel.com> - 2016-09-22 07:30 +0200
  Re: [PATCH net-next 0/9] rxrpc: Preparation for slow-start algorithm David Howells <dhowells@redhat.com> - 2016-09-22 10:20 +0200

csiph-web