rxrpc: Reduce the number of ACK-Requests sent
authorDavid Howells <dhowells@redhat.com>
Wed, 21 Sep 2016 23:29:31 +0000 (00:29 +0100)
committerDavid Howells <dhowells@redhat.com>
Thu, 22 Sep 2016 07:49:20 +0000 (08:49 +0100)
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
net/rxrpc/output.c
net/rxrpc/peer_object.c
net/rxrpc/sendmsg.c

index 1c4597b2c6cdbd163aad37bf49df8d105ebd8f14..b13754a6dd7ac0fff530a71154a5677e22479269 100644 (file)
@@ -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 */
index db01fbb70d23cbd7ad4c237336bd31ce002155a5..282cb1e36d061175e64ca09006a17184812cdc05 100644 (file)
@@ -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;
index f3e5766910fd6954052890f0c2b18927d90c64bf..941b724d523bf282e5f8e6901a882c0d12effa0b 100644 (file)
@@ -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:
index 607223f4f871fe724d93d1b51bb379d6e130e71c..ca7c3be60ad279628c5706c3dfb167c62bbdc234 100644 (file)
@@ -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);