Skip to content

Commit b2532eb

Browse files
Eric Dumazetdavem330
Eric Dumazet
authored andcommitted
tcp: fix ooo_okay setting vs Small Queues
TCP Small Queues (tcp_tsq_handler()) can hold one reference on sk->sk_wmem_alloc, preventing skb->ooo_okay being set. We should relax test done to set skb->ooo_okay to take care of this extra reference. Minimal truesize of skb containing one byte of payload is SKB_TRUESIZE(1) Without this fix, we have more chance locking flows into the wrong transmit queue. Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 31eff81 commit b2532eb

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

net/ipv4/tcp_output.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -914,9 +914,13 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
914914
tcp_ca_event(sk, CA_EVENT_TX_START);
915915

916916
/* if no packet is in qdisc/device queue, then allow XPS to select
917-
* another queue.
917+
* another queue. We can be called from tcp_tsq_handler()
918+
* which holds one reference to sk_wmem_alloc.
919+
*
920+
* TODO: Ideally, in-flight pure ACK packets should not matter here.
921+
* One way to get this would be to set skb->truesize = 2 on them.
918922
*/
919-
skb->ooo_okay = sk_wmem_alloc_get(sk) == 0;
923+
skb->ooo_okay = sk_wmem_alloc_get(sk) < SKB_TRUESIZE(1);
920924

921925
skb_push(skb, tcp_header_size);
922926
skb_reset_transport_header(skb);

0 commit comments

Comments
 (0)