Commit 21119e2c authored by David S. Miller's avatar David S. Miller

Merge tag 'rxrpc-next-20230208' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs

David Howells says:

====================
rxrpc development

Here are some miscellaneous changes for rxrpc:

 (1) Use consume_skb() rather than kfree_skb_reason().

 (2) Fix unnecessary waking when poking and already-poked call.

 (3) Add ack.rwind to the rxrpc_tx_ack tracepoint as this indicates how
     many incoming DATA packets we're telling the peer that we are
     currently willing to accept on this call.

 (4) Reduce duplicate ACK transmission.  We send ACKs to let the peer know
     that we're increasing the receive window (ack.rwind) as we consume
     packets locally.  Normal ACK transmission is triggered in three places
     and that leads to duplicates being sent.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents dc8c4132 5a2c5a5b
...@@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data, ...@@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data,
TRACE_EVENT(rxrpc_tx_ack, TRACE_EVENT(rxrpc_tx_ack,
TP_PROTO(unsigned int call, rxrpc_serial_t serial, TP_PROTO(unsigned int call, rxrpc_serial_t serial,
rxrpc_seq_t ack_first, rxrpc_serial_t ack_serial, rxrpc_seq_t ack_first, rxrpc_serial_t ack_serial,
u8 reason, u8 n_acks), u8 reason, u8 n_acks, u16 rwind),
TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks), TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks, rwind),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, call) __field(unsigned int, call)
...@@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack, ...@@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack,
__field(rxrpc_serial_t, ack_serial) __field(rxrpc_serial_t, ack_serial)
__field(u8, reason) __field(u8, reason)
__field(u8, n_acks) __field(u8, n_acks)
__field(u16, rwind)
), ),
TP_fast_assign( TP_fast_assign(
...@@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack, ...@@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack,
__entry->ack_serial = ack_serial; __entry->ack_serial = ack_serial;
__entry->reason = reason; __entry->reason = reason;
__entry->n_acks = n_acks; __entry->n_acks = n_acks;
__entry->rwind = rwind;
), ),
TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u", TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u rw=%u",
__entry->call, __entry->call,
__entry->serial, __entry->serial,
__print_symbolic(__entry->reason, rxrpc_ack_names), __print_symbolic(__entry->reason, rxrpc_ack_names),
__entry->ack_first, __entry->ack_first,
__entry->ack_serial, __entry->ack_serial,
__entry->n_acks) __entry->n_acks,
__entry->rwind)
); );
TRACE_EVENT(rxrpc_receive, TRACE_EVENT(rxrpc_receive,
......
...@@ -54,11 +54,13 @@ void rxrpc_poke_call(struct rxrpc_call *call, enum rxrpc_call_poke_trace what) ...@@ -54,11 +54,13 @@ void rxrpc_poke_call(struct rxrpc_call *call, enum rxrpc_call_poke_trace what)
spin_lock_bh(&local->lock); spin_lock_bh(&local->lock);
busy = !list_empty(&call->attend_link); busy = !list_empty(&call->attend_link);
trace_rxrpc_poke_call(call, busy, what); trace_rxrpc_poke_call(call, busy, what);
if (!busy && !rxrpc_try_get_call(call, rxrpc_call_get_poke))
busy = true;
if (!busy) { if (!busy) {
rxrpc_get_call(call, rxrpc_call_get_poke);
list_add_tail(&call->attend_link, &local->call_attend_q); list_add_tail(&call->attend_link, &local->call_attend_q);
} }
spin_unlock_bh(&local->lock); spin_unlock_bh(&local->lock);
if (!busy)
rxrpc_wake_up_io_thread(local); rxrpc_wake_up_io_thread(local);
} }
} }
......
...@@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, ...@@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
trace_rxrpc_tx_ack(chan->call_debug_id, serial, trace_rxrpc_tx_ack(chan->call_debug_id, serial,
ntohl(pkt.ack.firstPacket), ntohl(pkt.ack.firstPacket),
ntohl(pkt.ack.serial), ntohl(pkt.ack.serial),
pkt.ack.reason, 0); pkt.ack.reason, 0, rxrpc_rx_window_size);
break; break;
default: default:
......
...@@ -80,7 +80,8 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call) ...@@ -80,7 +80,8 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call)
*/ */
static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
struct rxrpc_call *call, struct rxrpc_call *call,
struct rxrpc_txbuf *txb) struct rxrpc_txbuf *txb,
u16 *_rwind)
{ {
struct rxrpc_ackinfo ackinfo; struct rxrpc_ackinfo ackinfo;
unsigned int qsize, sack, wrap, to; unsigned int qsize, sack, wrap, to;
...@@ -124,6 +125,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, ...@@ -124,6 +125,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
jmax = rxrpc_rx_jumbo_max; jmax = rxrpc_rx_jumbo_max;
qsize = (window - 1) - call->rx_consumed; qsize = (window - 1) - call->rx_consumed;
rsize = max_t(int, call->rx_winsize - qsize, 0); rsize = max_t(int, call->rx_winsize - qsize, 0);
*_rwind = rsize;
ackinfo.rxMTU = htonl(rxrpc_rx_mtu); ackinfo.rxMTU = htonl(rxrpc_rx_mtu);
ackinfo.maxMTU = htonl(mtu); ackinfo.maxMTU = htonl(mtu);
ackinfo.rwind = htonl(rsize); ackinfo.rwind = htonl(rsize);
...@@ -190,6 +192,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) ...@@ -190,6 +192,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
rxrpc_serial_t serial; rxrpc_serial_t serial;
size_t len, n; size_t len, n;
int ret, rtt_slot = -1; int ret, rtt_slot = -1;
u16 rwind;
if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
return -ECONNRESET; return -ECONNRESET;
...@@ -205,7 +208,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) ...@@ -205,7 +208,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
if (txb->ack.reason == RXRPC_ACK_PING) if (txb->ack.reason == RXRPC_ACK_PING)
txb->wire.flags |= RXRPC_REQUEST_ACK; txb->wire.flags |= RXRPC_REQUEST_ACK;
n = rxrpc_fill_out_ack(conn, call, txb); n = rxrpc_fill_out_ack(conn, call, txb, &rwind);
if (n == 0) if (n == 0)
return 0; return 0;
...@@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) ...@@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
txb->wire.serial = htonl(serial); txb->wire.serial = htonl(serial);
trace_rxrpc_tx_ack(call->debug_id, serial, trace_rxrpc_tx_ack(call->debug_id, serial,
ntohl(txb->ack.firstPacket), ntohl(txb->ack.firstPacket),
ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks); ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks,
rwind);
if (txb->ack.reason == RXRPC_ACK_PING) if (txb->ack.reason == RXRPC_ACK_PING)
rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping); rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);
......
...@@ -137,7 +137,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call) ...@@ -137,7 +137,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
/* Check to see if there's an ACK that needs sending. */ /* Check to see if there's an ACK that needs sending. */
acked = atomic_add_return(call->rx_consumed - old_consumed, acked = atomic_add_return(call->rx_consumed - old_consumed,
&call->ackr_nr_consumed); &call->ackr_nr_consumed);
if (acked > 2 && if (acked > 8 &&
!test_and_set_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags)) !test_and_set_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags))
rxrpc_poke_call(call, rxrpc_call_poke_idle); rxrpc_poke_call(call, rxrpc_call_poke_idle);
} }
......
...@@ -63,7 +63,7 @@ void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace why) ...@@ -63,7 +63,7 @@ void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace why)
if (skb) { if (skb) {
int n = atomic_dec_return(select_skb_count(skb)); int n = atomic_dec_return(select_skb_count(skb));
trace_rxrpc_skb(skb, refcount_read(&skb->users), n, why); trace_rxrpc_skb(skb, refcount_read(&skb->users), n, why);
kfree_skb_reason(skb, SKB_CONSUMED); consume_skb(skb);
} }
} }
...@@ -78,6 +78,6 @@ void rxrpc_purge_queue(struct sk_buff_head *list) ...@@ -78,6 +78,6 @@ void rxrpc_purge_queue(struct sk_buff_head *list)
int n = atomic_dec_return(select_skb_count(skb)); int n = atomic_dec_return(select_skb_count(skb));
trace_rxrpc_skb(skb, refcount_read(&skb->users), n, trace_rxrpc_skb(skb, refcount_read(&skb->users), n,
rxrpc_skb_put_purge); rxrpc_skb_put_purge);
kfree_skb_reason(skb, SKB_CONSUMED); consume_skb(skb);
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment