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

bpf, tcp: Make tcp_bpf_recvmsg static

After commit f747632b608f ("bpf: sockmap: Move generic sockmap
hooks from BPF TCP"), tcp_bpf_recvmsg() is not used out of
tcp_bpf.c, so make it static and remove it from tcp.h. Also move
it to BPF_STREAM_PARSER #ifdef to fix unused function warnings.

Fixes: f747632b608f ("bpf: sockmap: Move generic sockmap hooks from BPF TCP")
Signed-off-by: YueHaibing <yuehaibing@huawei.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20200320023426.60684-3-yuehaibing@huawei.com

authored by

YueHaibing and committed by
Daniel Borkmann
c0fd336e a2652798

+62 -64
-2
include/net/tcp.h
··· 2207 2207 #ifdef CONFIG_NET_SOCK_MSG 2208 2208 int tcp_bpf_sendmsg_redir(struct sock *sk, struct sk_msg *msg, u32 bytes, 2209 2209 int flags); 2210 - int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, 2211 - int nonblock, int flags, int *addr_len); 2212 2210 int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock, 2213 2211 struct msghdr *msg, int len, int flags); 2214 2212 #endif /* CONFIG_NET_SOCK_MSG */
+62 -62
net/ipv4/tcp_bpf.c
··· 10 10 #include <net/inet_common.h> 11 11 #include <net/tls.h> 12 12 13 - static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock, 14 - int flags, long timeo, int *err) 15 - { 16 - DEFINE_WAIT_FUNC(wait, woken_wake_function); 17 - int ret = 0; 18 - 19 - if (!timeo) 20 - return ret; 21 - 22 - add_wait_queue(sk_sleep(sk), &wait); 23 - sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); 24 - ret = sk_wait_event(sk, &timeo, 25 - !list_empty(&psock->ingress_msg) || 26 - !skb_queue_empty(&sk->sk_receive_queue), &wait); 27 - sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); 28 - remove_wait_queue(sk_sleep(sk), &wait); 29 - return ret; 30 - } 31 - 32 13 int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock, 33 14 struct msghdr *msg, int len, int flags) 34 15 { ··· 82 101 return copied; 83 102 } 84 103 EXPORT_SYMBOL_GPL(__tcp_bpf_recvmsg); 85 - 86 - int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, 87 - int nonblock, int flags, int *addr_len) 88 - { 89 - struct sk_psock *psock; 90 - int copied, ret; 91 - 92 - psock = sk_psock_get(sk); 93 - if (unlikely(!psock)) 94 - return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 95 - if (unlikely(flags & MSG_ERRQUEUE)) 96 - return inet_recv_error(sk, msg, len, addr_len); 97 - if (!skb_queue_empty(&sk->sk_receive_queue) && 98 - sk_psock_queue_empty(psock)) 99 - return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 100 - lock_sock(sk); 101 - msg_bytes_ready: 102 - copied = __tcp_bpf_recvmsg(sk, psock, msg, len, flags); 103 - if (!copied) { 104 - int data, err = 0; 105 - long timeo; 106 - 107 - timeo = sock_rcvtimeo(sk, nonblock); 108 - data = tcp_bpf_wait_data(sk, psock, flags, timeo, &err); 109 - if (data) { 110 - if (!sk_psock_queue_empty(psock)) 111 - goto msg_bytes_ready; 112 - release_sock(sk); 113 - sk_psock_put(sk, psock); 114 - return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 115 - } 116 - if (err) { 117 - ret = err; 118 - goto out; 119 - } 120 - copied = -EAGAIN; 121 - } 122 - ret = copied; 123 - out: 124 - release_sock(sk); 125 - sk_psock_put(sk, psock); 126 - return ret; 127 - } 128 104 129 105 static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock, 130 106 struct sk_msg *msg, u32 apply_bytes, int flags) ··· 235 297 empty = list_empty(&psock->ingress_msg); 236 298 rcu_read_unlock(); 237 299 return !empty; 300 + } 301 + 302 + static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock, 303 + int flags, long timeo, int *err) 304 + { 305 + DEFINE_WAIT_FUNC(wait, woken_wake_function); 306 + int ret = 0; 307 + 308 + if (!timeo) 309 + return ret; 310 + 311 + add_wait_queue(sk_sleep(sk), &wait); 312 + sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); 313 + ret = sk_wait_event(sk, &timeo, 314 + !list_empty(&psock->ingress_msg) || 315 + !skb_queue_empty(&sk->sk_receive_queue), &wait); 316 + sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); 317 + remove_wait_queue(sk_sleep(sk), &wait); 318 + return ret; 319 + } 320 + 321 + static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, 322 + int nonblock, int flags, int *addr_len) 323 + { 324 + struct sk_psock *psock; 325 + int copied, ret; 326 + 327 + psock = sk_psock_get(sk); 328 + if (unlikely(!psock)) 329 + return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 330 + if (unlikely(flags & MSG_ERRQUEUE)) 331 + return inet_recv_error(sk, msg, len, addr_len); 332 + if (!skb_queue_empty(&sk->sk_receive_queue) && 333 + sk_psock_queue_empty(psock)) 334 + return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 335 + lock_sock(sk); 336 + msg_bytes_ready: 337 + copied = __tcp_bpf_recvmsg(sk, psock, msg, len, flags); 338 + if (!copied) { 339 + int data, err = 0; 340 + long timeo; 341 + 342 + timeo = sock_rcvtimeo(sk, nonblock); 343 + data = tcp_bpf_wait_data(sk, psock, flags, timeo, &err); 344 + if (data) { 345 + if (!sk_psock_queue_empty(psock)) 346 + goto msg_bytes_ready; 347 + release_sock(sk); 348 + sk_psock_put(sk, psock); 349 + return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len); 350 + } 351 + if (err) { 352 + ret = err; 353 + goto out; 354 + } 355 + copied = -EAGAIN; 356 + } 357 + ret = copied; 358 + out: 359 + release_sock(sk); 360 + sk_psock_put(sk, psock); 361 + return ret; 238 362 } 239 363 240 364 static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,