tmp = atomic_xchg(&call->ackr_nr_unacked, 0);
        tmp |= atomic_xchg(&call->ackr_nr_consumed, 0);
        if (!tmp && (reason == RXRPC_ACK_DELAY ||
-                    reason == RXRPC_ACK_IDLE))
+                    reason == RXRPC_ACK_IDLE)) {
+               rxrpc_inc_stat(call->rxnet, stat_tx_ack_skip);
                return 0;
+       }
+
+       rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill);
 
        /* Barrier against rxrpc_input_data(). */
        serial = call->ackr_serial;
        if (ping)
                rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);
 
+       rxrpc_inc_stat(call->rxnet, stat_tx_ack_send);
        ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
        conn->params.peer->last_tx_at = ktime_get_seconds();
        if (ret < 0)
 
                   atomic_read(&rxnet->stat_rx_data),
                   atomic_read(&rxnet->stat_rx_data_reqack),
                   atomic_read(&rxnet->stat_rx_data_jumbo));
+       seq_printf(seq,
+                  "Ack      : fill=%u send=%u skip=%u\n",
+                  atomic_read(&rxnet->stat_tx_ack_fill),
+                  atomic_read(&rxnet->stat_tx_ack_send),
+                  atomic_read(&rxnet->stat_tx_ack_skip));
+       seq_printf(seq,
+                  "Ack-Tx   : req=%u dup=%u oos=%u exw=%u nos=%u png=%u prs=%u dly=%u idl=%u\n",
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_REQUESTED]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_DUPLICATE]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_OUT_OF_SEQUENCE]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_EXCEEDS_WINDOW]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_NOSPACE]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_PING]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_PING_RESPONSE]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_DELAY]),
+                  atomic_read(&rxnet->stat_tx_acks[RXRPC_ACK_IDLE]));
+       seq_printf(seq,
+                  "Ack-Rx   : req=%u dup=%u oos=%u exw=%u nos=%u png=%u prs=%u dly=%u idl=%u\n",
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_REQUESTED]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_DUPLICATE]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_OUT_OF_SEQUENCE]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_EXCEEDS_WINDOW]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_NOSPACE]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_PING]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_PING_RESPONSE]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_DELAY]),
+                  atomic_read(&rxnet->stat_rx_acks[RXRPC_ACK_IDLE]));
        seq_printf(seq,
                   "Buffers  : txb=%u rxb=%u\n",
                   atomic_read(&rxrpc_n_tx_skbs),
        atomic_set(&rxnet->stat_rx_data, 0);
        atomic_set(&rxnet->stat_rx_data_reqack, 0);
        atomic_set(&rxnet->stat_rx_data_jumbo, 0);
+
+       atomic_set(&rxnet->stat_tx_ack_fill, 0);
+       atomic_set(&rxnet->stat_tx_ack_send, 0);
+       atomic_set(&rxnet->stat_tx_ack_skip, 0);
+       memset(&rxnet->stat_tx_acks, 0, sizeof(rxnet->stat_tx_acks));
+       memset(&rxnet->stat_rx_acks, 0, sizeof(rxnet->stat_rx_acks));
        return size;
 }