rxrpc: Clean up Tx header flags generation handling
authorDavid Howells <dhowells@redhat.com>
Wed, 4 Dec 2024 07:46:32 +0000 (07:46 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 9 Dec 2024 21:48:24 +0000 (13:48 -0800)
Clean up the generation of the header flags when building packet headers
for transmission:

 (1) Assemble the flags in a local variable rather than in the txb->flags.

 (2) Do the flags masking and JUMBO-PACKET setting in one bit of code for
     both the main header and the jumbo headers.

 (3) Generate the REQUEST-ACK flag afresh each time.  There's a possibility
     we might want to do jumbo retransmission packets in future.

 (4) Pass the local flags variable to the rxrpc_tx_data tracepoint rather
     than the combination of the txb flags and the wire header flags (the
     latter belong only to the first subpacket).

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Link: https://patch.msgid.link/20241204074710.990092-5-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/trace/events/rxrpc.h
net/rxrpc/ar-internal.h
net/rxrpc/output.c
net/rxrpc/proc.c

index 27c23873c8811517495166c8fe8213494815d4a4..62064f63d6eb8af1fb72237f2f89d208d592384f 100644 (file)
 
 #define rxrpc_req_ack_traces \
        EM(rxrpc_reqack_ack_lost,               "ACK-LOST  ")   \
-       EM(rxrpc_reqack_already_on,             "ALREADY-ON")   \
        EM(rxrpc_reqack_more_rtt,               "MORE-RTT  ")   \
        EM(rxrpc_reqack_no_srv_last,            "NO-SRVLAST")   \
        EM(rxrpc_reqack_old_rtt,                "OLD-RTT   ")   \
index d0fd37bdcfe9c8653192b8c7d9f07a55e938fb90..fcdfbc1d5aafa9b40a6c08b60e8294dbcafab1d1 100644 (file)
@@ -110,7 +110,7 @@ struct rxrpc_net {
        atomic_t                stat_tx_acks[256];
        atomic_t                stat_rx_acks[256];
 
-       atomic_t                stat_why_req_ack[8];
+       atomic_t                stat_why_req_ack[7];
 
        atomic_t                stat_io_loop;
 };
index 85112ea31a39c284ba8958dd02921c05257a0ef9..50d5f2a02458a81febdaebc925d1035d48327c6b 100644 (file)
@@ -330,6 +330,8 @@ static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_t
        struct rxrpc_wire_header *whdr = txb->kvec[0].iov_base;
        enum rxrpc_req_ack_trace why;
        struct rxrpc_connection *conn = call->conn;
+       bool last;
+       u8 flags;
 
        _enter("%x,{%d}", txb->seq, txb->len);
 
@@ -339,6 +341,10 @@ static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_t
            txb->seq == 1)
                whdr->userStatus = RXRPC_USERSTATUS_SERVICE_UPGRADE;
 
+       txb->flags &= ~RXRPC_REQUEST_ACK;
+       flags = txb->flags & RXRPC_TXBUF_WIRE_FLAGS;
+       last = txb->flags & RXRPC_LAST_PACKET;
+
        /* If our RTT cache needs working on, request an ACK.  Also request
         * ACKs if a DATA packet appears to have been lost.
         *
@@ -346,9 +352,7 @@ static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_t
         * service call, lest OpenAFS incorrectly send us an ACK with some
         * soft-ACKs in it and then never follow up with a proper hard ACK.
         */
-       if (txb->flags & RXRPC_REQUEST_ACK)
-               why = rxrpc_reqack_already_on;
-       else if ((txb->flags & RXRPC_LAST_PACKET) && rxrpc_sending_to_client(txb))
+       if (last && rxrpc_sending_to_client(txb))
                why = rxrpc_reqack_no_srv_last;
        else if (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events))
                why = rxrpc_reqack_ack_lost;
@@ -367,15 +371,17 @@ static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_t
 
        rxrpc_inc_stat(call->rxnet, stat_why_req_ack[why]);
        trace_rxrpc_req_ack(call->debug_id, txb->seq, why);
-       if (why != rxrpc_reqack_no_srv_last)
+       if (why != rxrpc_reqack_no_srv_last) {
                txb->flags |= RXRPC_REQUEST_ACK;
+               flags |= RXRPC_REQUEST_ACK;
+       }
 dont_set_request_ack:
 
-       whdr->flags = txb->flags & RXRPC_TXBUF_WIRE_FLAGS;
+       whdr->flags     = flags;
        whdr->serial    = htonl(txb->serial);
        whdr->cksum     = txb->cksum;
 
-       trace_rxrpc_tx_data(call, txb->seq, txb->serial, txb->flags, false);
+       trace_rxrpc_tx_data(call, txb->seq, txb->serial, flags, false);
 }
 
 /*
index 263a2251e3d249bff4f23993130443e915980402..3b7e34dd4385ef330ed83def66563c7f126f6f70 100644 (file)
@@ -519,9 +519,8 @@ int rxrpc_stats_show(struct seq_file *seq, void *v)
                   atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_DELAY]),
                   atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_IDLE]));
        seq_printf(seq,
-                  "Why-Req-A: acklost=%u already=%u mrtt=%u ortt=%u\n",
+                  "Why-Req-A: acklost=%u mrtt=%u ortt=%u\n",
                   atomic_read(&rxnet->stat_why_req_ack[rxrpc_reqack_ack_lost]),
-                  atomic_read(&rxnet->stat_why_req_ack[rxrpc_reqack_already_on]),
                   atomic_read(&rxnet->stat_why_req_ack[rxrpc_reqack_more_rtt]),
                   atomic_read(&rxnet->stat_why_req_ack[rxrpc_reqack_old_rtt]));
        seq_printf(seq,