Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'tcp-tx-side-cleanups'

Eric Dumazet says:

====================
tcp: tx side cleanups

We no longer need to set skb->reserved_tailroom because
TCP sendmsg() do not put payload in skb->head anymore.

Also do some cleanups around skb->ip_summed/csum,
and CP_SKB_CB(skb)->sacked for fresh skbs.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+14 -47
+1 -1
include/net/tcp.h
··· 311 311 int tcp_v4_early_demux(struct sk_buff *skb); 312 312 int tcp_v4_rcv(struct sk_buff *skb); 313 313 314 - void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb); 314 + void tcp_remove_empty_skb(struct sock *sk); 315 315 int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw); 316 316 int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); 317 317 int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size);
+7 -22
net/ipv4/tcp.c
··· 658 658 struct tcp_sock *tp = tcp_sk(sk); 659 659 struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); 660 660 661 - skb->csum = 0; 662 661 tcb->seq = tcb->end_seq = tp->write_seq; 663 662 tcb->tcp_flags = TCPHDR_ACK; 664 - tcb->sacked = 0; 665 663 __skb_header_release(skb); 666 664 tcp_add_write_queue_tail(sk, skb); 667 665 sk_wmem_queued_add(sk, skb->truesize); ··· 874 876 } 875 877 if (likely(mem_scheduled)) { 876 878 skb_reserve(skb, MAX_TCP_HEADER); 877 - /* 878 - * Make sure that we have exactly size bytes 879 - * available to the caller, no more, no less. 880 - */ 881 - skb->reserved_tailroom = skb->end - skb->tail - size; 879 + skb->ip_summed = CHECKSUM_PARTIAL; 882 880 INIT_LIST_HEAD(&skb->tcp_tsorted_anchor); 883 881 return skb; 884 882 } ··· 927 933 * importantly be able to generate EPOLLOUT for Edge Trigger epoll() 928 934 * users. 929 935 */ 930 - void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb) 936 + void tcp_remove_empty_skb(struct sock *sk) 931 937 { 938 + struct sk_buff *skb = tcp_write_queue_tail(sk); 939 + 932 940 if (skb && TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { 933 941 tcp_unlink_write_queue(skb, sk); 934 942 if (tcp_write_queue_empty(sk)) ··· 992 996 skb->truesize += copy; 993 997 sk_wmem_queued_add(sk, copy); 994 998 sk_mem_charge(sk, copy); 995 - skb->ip_summed = CHECKSUM_PARTIAL; 996 999 WRITE_ONCE(tp->write_seq, tp->write_seq + copy); 997 1000 TCP_SKB_CB(skb)->end_seq += copy; 998 1001 tcp_skb_pcount_set(skb, 0); ··· 1082 1087 return copied; 1083 1088 1084 1089 do_error: 1085 - tcp_remove_empty_skb(sk, tcp_write_queue_tail(sk)); 1090 + tcp_remove_empty_skb(sk); 1086 1091 if (copied) 1087 1092 goto out; 1088 1093 out_err: ··· 1287 1292 goto wait_for_space; 1288 1293 1289 1294 process_backlog++; 1290 - skb->ip_summed = CHECKSUM_PARTIAL; 1291 1295 1292 1296 tcp_skb_entail(sk, skb); 1293 1297 copy = size_goal; ··· 1303 1309 if (copy > msg_data_left(msg)) 1304 1310 copy = msg_data_left(msg); 1305 1311 1306 - /* Where to copy to? */ 1307 - if (skb_availroom(skb) > 0 && !zc) { 1308 - /* We have some space in skb head. Superb! */ 1309 - copy = min_t(int, copy, skb_availroom(skb)); 1310 - err = skb_add_data_nocache(sk, skb, &msg->msg_iter, copy); 1311 - if (err) 1312 - goto do_fault; 1313 - } else if (!zc) { 1312 + if (!zc) { 1314 1313 bool merge = true; 1315 1314 int i = skb_shinfo(skb)->nr_frags; 1316 1315 struct page_frag *pfrag = sk_page_frag(sk); ··· 1402 1415 return copied + copied_syn; 1403 1416 1404 1417 do_error: 1405 - skb = tcp_write_queue_tail(sk); 1406 - do_fault: 1407 - tcp_remove_empty_skb(sk, skb); 1418 + tcp_remove_empty_skb(sk); 1408 1419 1409 1420 if (copied + copied_syn) 1410 1421 goto out;
+3 -19
net/ipv4/tcp_output.c
··· 394 394 skb->ip_summed = CHECKSUM_PARTIAL; 395 395 396 396 TCP_SKB_CB(skb)->tcp_flags = flags; 397 - TCP_SKB_CB(skb)->sacked = 0; 398 397 399 398 tcp_skb_pcount_set(skb, 1); 400 399 ··· 1589 1590 1590 1591 skb_split(skb, buff, len); 1591 1592 1592 - buff->ip_summed = CHECKSUM_PARTIAL; 1593 - 1594 1593 buff->tstamp = skb->tstamp; 1595 1594 tcp_fragment_tstamp(skb, buff); 1596 1595 ··· 1673 1676 delta_truesize = __pskb_trim_head(skb, len); 1674 1677 1675 1678 TCP_SKB_CB(skb)->seq += len; 1676 - skb->ip_summed = CHECKSUM_PARTIAL; 1677 1679 1678 1680 if (delta_truesize) { 1679 1681 skb->truesize -= delta_truesize; ··· 2138 2142 TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH); 2139 2143 TCP_SKB_CB(buff)->tcp_flags = flags; 2140 2144 2141 - /* This packet was never sent out yet, so no SACK bits. */ 2142 - TCP_SKB_CB(buff)->sacked = 0; 2143 - 2144 2145 tcp_skb_fragment_eor(skb, buff); 2145 2146 2146 - buff->ip_summed = CHECKSUM_PARTIAL; 2147 2147 skb_split(skb, buff, len); 2148 2148 tcp_fragment_tstamp(skb, buff); 2149 2149 ··· 2393 2401 TCP_SKB_CB(nskb)->seq = TCP_SKB_CB(skb)->seq; 2394 2402 TCP_SKB_CB(nskb)->end_seq = TCP_SKB_CB(skb)->seq + probe_size; 2395 2403 TCP_SKB_CB(nskb)->tcp_flags = TCPHDR_ACK; 2396 - TCP_SKB_CB(nskb)->sacked = 0; 2397 - nskb->csum = 0; 2398 - nskb->ip_summed = CHECKSUM_PARTIAL; 2399 2404 2400 2405 tcp_insert_write_queue_before(nskb, skb, sk); 2401 2406 tcp_highest_sack_replace(sk, skb, nskb); ··· 3034 3045 3035 3046 BUG_ON(tcp_skb_pcount(skb) != 1 || tcp_skb_pcount(next_skb) != 1); 3036 3047 3037 - if (next_skb_size) { 3038 - if (next_skb_size <= skb_availroom(skb)) 3039 - skb_copy_bits(next_skb, 0, skb_put(skb, next_skb_size), 3040 - next_skb_size); 3041 - else if (!tcp_skb_shift(skb, next_skb, 1, next_skb_size)) 3042 - return false; 3043 - } 3048 + if (next_skb_size && !tcp_skb_shift(skb, next_skb, 1, next_skb_size)) 3049 + return false; 3050 + 3044 3051 tcp_highest_sack_replace(sk, next_skb, skb); 3045 3052 3046 3053 /* Update sequence range on original skb. */ ··· 3742 3757 syn_data = tcp_stream_alloc_skb(sk, space, sk->sk_allocation, false); 3743 3758 if (!syn_data) 3744 3759 goto fallback; 3745 - syn_data->ip_summed = CHECKSUM_PARTIAL; 3746 3760 memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); 3747 3761 if (space) { 3748 3762 int copied = copy_from_iter(skb_put(syn_data, space), space,
-1
net/ipv6/tcp_ipv6.c
··· 969 969 fl6.flowlabel = label; 970 970 971 971 buff->ip_summed = CHECKSUM_PARTIAL; 972 - buff->csum = 0; 973 972 974 973 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr); 975 974
+3 -4
net/mptcp/protocol.c
··· 1174 1174 if (likely(skb)) { 1175 1175 if (likely(__mptcp_add_ext(skb, gfp))) { 1176 1176 skb_reserve(skb, MAX_TCP_HEADER); 1177 - skb->reserved_tailroom = skb->end - skb->tail; 1177 + skb->ip_summed = CHECKSUM_PARTIAL; 1178 1178 INIT_LIST_HEAD(&skb->tcp_tsorted_anchor); 1179 1179 return skb; 1180 1180 } ··· 1291 1291 u64 snd_una = READ_ONCE(msk->snd_una); 1292 1292 1293 1293 if (snd_una != msk->snd_nxt) { 1294 - tcp_remove_empty_skb(ssk, tcp_write_queue_tail(ssk)); 1294 + tcp_remove_empty_skb(ssk); 1295 1295 return 0; 1296 1296 } 1297 1297 ··· 1307 1307 1308 1308 copy = min_t(size_t, copy, info->limit - info->sent); 1309 1309 if (!sk_wmem_schedule(ssk, copy)) { 1310 - tcp_remove_empty_skb(ssk, tcp_write_queue_tail(ssk)); 1310 + tcp_remove_empty_skb(ssk); 1311 1311 return -ENOMEM; 1312 1312 } 1313 1313 ··· 1323 1323 skb->truesize += copy; 1324 1324 sk_wmem_queued_add(ssk, copy); 1325 1325 sk_mem_charge(ssk, copy); 1326 - skb->ip_summed = CHECKSUM_PARTIAL; 1327 1326 WRITE_ONCE(tcp_sk(ssk)->write_seq, tcp_sk(ssk)->write_seq + copy); 1328 1327 TCP_SKB_CB(skb)->end_seq += copy; 1329 1328 tcp_skb_pcount_set(skb, 0);