diff options
| author | John Fastabend <john.fastabend@gmail.com> | 2018-03-18 15:57:00 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2018-03-19 16:14:38 -0400 |
| commit | 312fc2b4c82e96a48cb2d0da2bd4816eb253c499 (patch) | |
| tree | 6bcfadb456706b7e326c46f17bff214e56181fcc | |
| parent | ffa35660017161524b7db79b0ce293fa1af16c4d (diff) | |
net: do_tcp_sendpages flag to avoid SKBTX_SHARED_FRAG
When calling do_tcp_sendpages() from in kernel and we know the data
has no references from user side we can omit SKBTX_SHARED_FRAG flag.
This patch adds an internal flag, NO_SKBTX_SHARED_FRAG that can be used
to omit setting SKBTX_SHARED_FRAG.
The flag is not exposed to userspace because the sendpage call from
the splice logic masks out all bits except MSG_MORE.
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
| -rw-r--r-- | include/linux/socket.h | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 4 |
2 files changed, 4 insertions, 1 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h index 1ce1f768a58c..60e01482a9c4 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -287,6 +287,7 @@ struct ucred { | |||
| 287 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | 287 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ |
| 288 | #define MSG_BATCH 0x40000 /* sendmmsg(): more messages coming */ | 288 | #define MSG_BATCH 0x40000 /* sendmmsg(): more messages coming */ |
| 289 | #define MSG_EOF MSG_FIN | 289 | #define MSG_EOF MSG_FIN |
| 290 | #define MSG_NO_SHARED_FRAGS 0x80000 /* sendpage() internal : page frags are not shared */ | ||
| 290 | 291 | ||
| 291 | #define MSG_ZEROCOPY 0x4000000 /* Use user data in kernel path */ | 292 | #define MSG_ZEROCOPY 0x4000000 /* Use user data in kernel path */ |
| 292 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ | 293 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index fb350f740f69..f90ec24c2cc8 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -994,7 +994,9 @@ new_segment: | |||
| 994 | get_page(page); | 994 | get_page(page); |
| 995 | skb_fill_page_desc(skb, i, page, offset, copy); | 995 | skb_fill_page_desc(skb, i, page, offset, copy); |
| 996 | } | 996 | } |
| 997 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 997 | |
| 998 | if (!(flags & MSG_NO_SHARED_FRAGS)) | ||
| 999 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | ||
| 998 | 1000 | ||
| 999 | skb->len += copy; | 1001 | skb->len += copy; |
| 1000 | skb->data_len += copy; | 1002 | skb->data_len += copy; |
