瀏覽代碼

rxrpc: Reduce the number of ACK-Requests sent

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>
David Howells 9 年之前
父節點
當前提交
0d4b103c00
共有 4 個文件被更改,包括 13 次插入4 次删除
  1. 1 0
      net/rxrpc/ar-internal.h
  2. 11 2
      net/rxrpc/output.c
  3. 1 0
      net/rxrpc/peer_object.c
  4. 0 2
      net/rxrpc/sendmsg.c

+ 1 - 0
net/rxrpc/ar-internal.h

@@ -255,6 +255,7 @@ struct rxrpc_peer {
 
 
 	/* calculated RTT cache */
 	/* calculated RTT cache */
 #define RXRPC_RTT_CACHE_SIZE 32
 #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;		/* Current RTT estimate (in nS) */
 	u64			rtt_sum;	/* Sum of cache contents */
 	u64			rtt_sum;	/* Sum of cache contents */
 	u64			rtt_cache[RXRPC_RTT_CACHE_SIZE]; /* Determined RTT cache */
 	u64			rtt_cache[RXRPC_RTT_CACHE_SIZE]; /* Determined RTT cache */

+ 11 - 2
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_controllen = 0;
 	msg.msg_flags = 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)) {
 	if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
 		static int lose;
 		static int lose;
 		if ((lose++ & 7) == 7) {
 		if ((lose++ & 7) == 7) {
@@ -301,11 +307,14 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb)
 
 
 done:
 done:
 	if (ret >= 0) {
 	if (ret >= 0) {
-		skb->tstamp = ktime_get_real();
+		ktime_t now = ktime_get_real();
+		skb->tstamp = now;
 		smp_wmb();
 		smp_wmb();
 		sp->hdr.serial = serial;
 		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);
 			trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_data, serial);
+		}
 	}
 	}
 	_leave(" = %d [%u]", ret, call->peer->maxdata);
 	_leave(" = %d [%u]", ret, call->peer->maxdata);
 	return ret;
 	return ret;

+ 1 - 0
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;
 	peer->hash_key = hash_key;
 	rxrpc_assess_MTU_size(peer);
 	rxrpc_assess_MTU_size(peer);
 	peer->mtu = peer->if_mtu;
 	peer->mtu = peer->if_mtu;
+	peer->rtt_last_req = ktime_get_real();
 
 
 	switch (peer->srx.transport.family) {
 	switch (peer->srx.transport.family) {
 	case AF_INET:
 	case AF_INET:

+ 0 - 2
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 <
 			else if (call->tx_top - call->tx_hard_ack <
 				 call->tx_winsize)
 				 call->tx_winsize)
 				sp->hdr.flags |= RXRPC_MORE_PACKETS;
 				sp->hdr.flags |= RXRPC_MORE_PACKETS;
-			if (seq & 1)
-				sp->hdr.flags |= RXRPC_REQUEST_ACK;
 
 
 			ret = conn->security->secure_packet(
 			ret = conn->security->secure_packet(
 				call, skb, skb->mark, skb->head);
 				call, skb, skb->mark, skb->head);