Skip to content

Commit 76851d1

Browse files
wdebruijdavem330
authored andcommitted
sock: add SOCK_ZEROCOPY sockopt
The send call ignores unknown flags. Legacy applications may already unwittingly pass MSG_ZEROCOPY. Continue to ignore this flag unless a socket opts in to zerocopy. Introduce socket option SO_ZEROCOPY to enable MSG_ZEROCOPY processing. Processes can also query this socket option to detect kernel support for the feature. Older kernels will return ENOPROTOOPT. Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5226779 commit 76851d1

File tree

13 files changed

+43
-0
lines changed

13 files changed

+43
-0
lines changed

arch/alpha/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,6 @@
109109

110110
#define SO_PEERGROUPS 59
111111

112+
#define SO_ZEROCOPY 60
113+
112114
#endif /* _UAPI_ASM_SOCKET_H */

arch/frv/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,7 @@
102102

103103
#define SO_PEERGROUPS 59
104104

105+
#define SO_ZEROCOPY 60
106+
105107
#endif /* _ASM_SOCKET_H */
106108

arch/ia64/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,6 @@
111111

112112
#define SO_PEERGROUPS 59
113113

114+
#define SO_ZEROCOPY 60
115+
114116
#endif /* _ASM_IA64_SOCKET_H */

arch/m32r/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,6 @@
102102

103103
#define SO_PEERGROUPS 59
104104

105+
#define SO_ZEROCOPY 60
106+
105107
#endif /* _ASM_M32R_SOCKET_H */

arch/mips/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,6 @@
120120

121121
#define SO_PEERGROUPS 59
122122

123+
#define SO_ZEROCOPY 60
124+
123125
#endif /* _UAPI_ASM_SOCKET_H */

arch/mn10300/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,6 @@
102102

103103
#define SO_PEERGROUPS 59
104104

105+
#define SO_ZEROCOPY 60
106+
105107
#endif /* _ASM_SOCKET_H */

arch/parisc/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,6 @@
101101

102102
#define SO_PEERGROUPS 0x4034
103103

104+
#define SO_ZEROCOPY 0x4035
105+
104106
#endif /* _UAPI_ASM_SOCKET_H */

arch/s390/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,6 @@
108108

109109
#define SO_PEERGROUPS 59
110110

111+
#define SO_ZEROCOPY 60
112+
111113
#endif /* _ASM_SOCKET_H */

arch/sparc/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@
9898

9999
#define SO_PEERGROUPS 0x003d
100100

101+
#define SO_ZEROCOPY 0x003e
102+
101103
/* Security levels - as per NRL IPv6 - don't actually do anything */
102104
#define SO_SECURITY_AUTHENTICATION 0x5001
103105
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002

arch/xtensa/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,6 @@
113113

114114
#define SO_PEERGROUPS 59
115115

116+
#define SO_ZEROCOPY 60
117+
116118
#endif /* _XTENSA_SOCKET_H */

include/uapi/asm-generic/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,6 @@
104104

105105
#define SO_PEERGROUPS 59
106106

107+
#define SO_ZEROCOPY 60
108+
107109
#endif /* __ASM_GENERIC_SOCKET_H */

net/core/skbuff.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,9 @@ struct ubuf_info *sock_zerocopy_alloc(struct sock *sk, size_t size)
922922

923923
WARN_ON_ONCE(!in_task());
924924

925+
if (!sock_flag(sk, SOCK_ZEROCOPY))
926+
return NULL;
927+
925928
skb = sock_omalloc(sk, 0, GFP_KERNEL);
926929
if (!skb)
927930
return NULL;

net/core/sock.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,6 +1055,20 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
10551055
if (val == 1)
10561056
dst_negative_advice(sk);
10571057
break;
1058+
1059+
case SO_ZEROCOPY:
1060+
if (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)
1061+
ret = -ENOTSUPP;
1062+
else if (sk->sk_protocol != IPPROTO_TCP)
1063+
ret = -ENOTSUPP;
1064+
else if (sk->sk_state != TCP_CLOSE)
1065+
ret = -EBUSY;
1066+
else if (val < 0 || val > 1)
1067+
ret = -EINVAL;
1068+
else
1069+
sock_valbool_flag(sk, SOCK_ZEROCOPY, valbool);
1070+
break;
1071+
10581072
default:
10591073
ret = -ENOPROTOOPT;
10601074
break;
@@ -1383,6 +1397,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
13831397
v.val64 = sock_gen_cookie(sk);
13841398
break;
13851399

1400+
case SO_ZEROCOPY:
1401+
v.val = sock_flag(sk, SOCK_ZEROCOPY);
1402+
break;
1403+
13861404
default:
13871405
/* We implement the SO_SNDLOWAT etc to not be settable
13881406
* (1003.1g 7).

0 commit comments

Comments
 (0)