mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
rxrpc development
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEqG5UsNXhtOCrfGQP+7dXa6fLC2sFAmPjdqgACgkQ+7dXa6fL C2tbWw/9F6e5SAUKDMTk0LafoGweg/4/cUqAyVXib379RO3XesYPrtcSJ4qhd7P+ F+VA5xCHA8uGRpLVgkDtsgJuuEqcHbxHFN2dBiVLWnH+xnDXc9qAORG9P+M3QLsX ev5zTOXFVkcSFo7ZZjwuC2aTLdR3+z2/apFwtqoxIOOs9SCg+JonZDXDod2nf4Qn B8SB03kz+qQTYslaaYiCnffK25V0fPQDfAQy+WpOw+klPGHLuYMjZnTh3l++Qs7J A1RlZ5t15MpSP73KhKLV3uvmulnXhCi4AwLlLrTcv/ET8+xb78umht6Mz8oxx4Dq lDko3TWeGIrKkNKYmStFo8tYp2PCZgam78F+pC2NtrW1IIKBUYI2Vw3+qAn3XKFi 4UVN7ClRam0ROgRmwZwSt81Abbf2+qioBBSksXlDywbfaX/1HYVha2Ep/gI/YTcB QVs3acc3rtOsplLjHDdHK1p7l8tDEjPJPiW36L8Gwi7JhcC8YAP/n8oQm/fNi0eK nnK9VCbEoIpKi/8psdC4/BRI4LlGJ/KgLrj3uR5sx/Zbs3lIw2gqJOVltwEKjkBt YlnsH+gStbQ1I+tq8icSLNw45f/+WCgf3A4/eNjGHZnGJsmo4lXPGq8+5ZxboAhe CJ1/vSSuKA8jsgJNDlBhwFJenILJBUvw4FlP9JfFi3qqhOUO5/I= =1nmF -----END PGP SIGNATURE----- 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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
21119e2c6e
6 changed files with 22 additions and 13 deletions
|
@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data,
|
|||
TRACE_EVENT(rxrpc_tx_ack,
|
||||
TP_PROTO(unsigned int call, rxrpc_serial_t 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(
|
||||
__field(unsigned int, call)
|
||||
|
@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack,
|
|||
__field(rxrpc_serial_t, ack_serial)
|
||||
__field(u8, reason)
|
||||
__field(u8, n_acks)
|
||||
__field(u16, rwind)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack,
|
|||
__entry->ack_serial = ack_serial;
|
||||
__entry->reason = reason;
|
||||
__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->serial,
|
||||
__print_symbolic(__entry->reason, rxrpc_ack_names),
|
||||
__entry->ack_first,
|
||||
__entry->ack_serial,
|
||||
__entry->n_acks)
|
||||
__entry->n_acks,
|
||||
__entry->rwind)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rxrpc_receive,
|
||||
|
|
|
@ -54,12 +54,14 @@ void rxrpc_poke_call(struct rxrpc_call *call, enum rxrpc_call_poke_trace what)
|
|||
spin_lock_bh(&local->lock);
|
||||
busy = !list_empty(&call->attend_link);
|
||||
trace_rxrpc_poke_call(call, busy, what);
|
||||
if (!busy && !rxrpc_try_get_call(call, rxrpc_call_get_poke))
|
||||
busy = true;
|
||||
if (!busy) {
|
||||
rxrpc_get_call(call, rxrpc_call_get_poke);
|
||||
list_add_tail(&call->attend_link, &local->call_attend_q);
|
||||
}
|
||||
spin_unlock_bh(&local->lock);
|
||||
rxrpc_wake_up_io_thread(local);
|
||||
if (!busy)
|
||||
rxrpc_wake_up_io_thread(local);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
|
|||
trace_rxrpc_tx_ack(chan->call_debug_id, serial,
|
||||
ntohl(pkt.ack.firstPacket),
|
||||
ntohl(pkt.ack.serial),
|
||||
pkt.ack.reason, 0);
|
||||
pkt.ack.reason, 0, rxrpc_rx_window_size);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -80,7 +80,8 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call)
|
|||
*/
|
||||
static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
|
||||
struct rxrpc_call *call,
|
||||
struct rxrpc_txbuf *txb)
|
||||
struct rxrpc_txbuf *txb,
|
||||
u16 *_rwind)
|
||||
{
|
||||
struct rxrpc_ackinfo ackinfo;
|
||||
unsigned int qsize, sack, wrap, to;
|
||||
|
@ -124,6 +125,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
|
|||
jmax = rxrpc_rx_jumbo_max;
|
||||
qsize = (window - 1) - call->rx_consumed;
|
||||
rsize = max_t(int, call->rx_winsize - qsize, 0);
|
||||
*_rwind = rsize;
|
||||
ackinfo.rxMTU = htonl(rxrpc_rx_mtu);
|
||||
ackinfo.maxMTU = htonl(mtu);
|
||||
ackinfo.rwind = htonl(rsize);
|
||||
|
@ -190,6 +192,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
|
|||
rxrpc_serial_t serial;
|
||||
size_t len, n;
|
||||
int ret, rtt_slot = -1;
|
||||
u16 rwind;
|
||||
|
||||
if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
|
||||
return -ECONNRESET;
|
||||
|
@ -205,7 +208,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
|
|||
if (txb->ack.reason == RXRPC_ACK_PING)
|
||||
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)
|
||||
return 0;
|
||||
|
||||
|
@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
|
|||
txb->wire.serial = htonl(serial);
|
||||
trace_rxrpc_tx_ack(call->debug_id, serial,
|
||||
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)
|
||||
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)
|
|||
/* Check to see if there's an ACK that needs sending. */
|
||||
acked = atomic_add_return(call->rx_consumed - old_consumed,
|
||||
&call->ackr_nr_consumed);
|
||||
if (acked > 2 &&
|
||||
if (acked > 8 &&
|
||||
!test_and_set_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags))
|
||||
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)
|
|||
if (skb) {
|
||||
int n = atomic_dec_return(select_skb_count(skb));
|
||||
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)
|
|||
int n = atomic_dec_return(select_skb_count(skb));
|
||||
trace_rxrpc_skb(skb, refcount_read(&skb->users), n,
|
||||
rxrpc_skb_put_purge);
|
||||
kfree_skb_reason(skb, SKB_CONSUMED);
|
||||
consume_skb(skb);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue