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

skbuff: Add MSG_MORE flag to optimize tcp large packet transmission

When using sockmap for forwarding, the average latency for different packet sizes
after sending 10,000 packets is as follows:
size old(us) new(us)
512 56 55
1472 58 58
1600 106 81
3000 145 105
5000 182 125

Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Feng Yang <yangfeng@kylinos.cn>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250708054053.39551-1-yangfeng59949@163.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Feng Yang and committed by
Jakub Kicinski
76d727ae fb604576

+5
+5
net/core/skbuff.c
··· 3230 3230 static int __skb_send_sock(struct sock *sk, struct sk_buff *skb, int offset, 3231 3231 int len, sendmsg_func sendmsg, int flags) 3232 3232 { 3233 + int more_hint = sk_is_tcp(sk) ? MSG_MORE : 0; 3233 3234 unsigned int orig_len = len; 3234 3235 struct sk_buff *head = skb; 3235 3236 unsigned short fragidx; ··· 3248 3247 kv.iov_len = slen; 3249 3248 memset(&msg, 0, sizeof(msg)); 3250 3249 msg.msg_flags = MSG_DONTWAIT | flags; 3250 + if (slen < len) 3251 + msg.msg_flags |= more_hint; 3251 3252 3252 3253 iov_iter_kvec(&msg.msg_iter, ITER_SOURCE, &kv, 1, slen); 3253 3254 ret = INDIRECT_CALL_2(sendmsg, sendmsg_locked, ··· 3290 3287 flags, 3291 3288 }; 3292 3289 3290 + if (slen < len) 3291 + msg.msg_flags |= more_hint; 3293 3292 bvec_set_page(&bvec, skb_frag_page(frag), slen, 3294 3293 skb_frag_off(frag) + offset); 3295 3294 iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1,