Hi all, Today's linux-next merge of the net-next tree got conflicts in: net/ipv4/tcp_bpf.c net/ipv4/udp_bpf.c include/linux/skmsg.h net/core/skmsg.c between commit: 9f2470fbc4cb ("skmsg: Improve udp_bpf_recvmsg() accuracy") from the bpf tree and commit: c49661aa6f70 ("skmsg: Remove unused parameters of sk_msg_wait_data()") from the net-next tree. I fixed it up (see below) and can carry the fix as necessary. This is now fixed as far as linux-next is concerned, but any non trivial conflicts should be mentioned to your upstream maintainer when your tree is submitted for merging. You may also want to consider cooperating with the maintainer of the conflicting tree to minimise any particularly complex conflicts. -- Cheers, Stephen Rothwell diff --cc include/linux/skmsg.h index e3d080c299f6,fcaa9a7996c8..000000000000 --- a/include/linux/skmsg.h +++ b/include/linux/skmsg.h diff --cc net/core/skmsg.c index 9b6160a191f8,f0b9decdf279..000000000000 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c diff --cc net/ipv4/tcp_bpf.c index bb49b52d7be8,a80de92ea3b6..000000000000 --- a/net/ipv4/tcp_bpf.c +++ b/net/ipv4/tcp_bpf.c @@@ -163,28 -163,6 +163,28 @@@ static bool tcp_bpf_stream_read(const s return !empty; } - static int tcp_msg_wait_data(struct sock *sk, struct sk_psock *psock, int flags, - long timeo, int *err) ++static int tcp_msg_wait_data(struct sock *sk, struct sk_psock *psock, ++ long timeo) +{ + DEFINE_WAIT_FUNC(wait, woken_wake_function); + int ret = 0; + + if (sk->sk_shutdown & RCV_SHUTDOWN) + return 1; + + if (!timeo) + return ret; + + add_wait_queue(sk_sleep(sk), &wait); + sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); + ret = sk_wait_event(sk, &timeo, + !list_empty(&psock->ingress_msg) || + !skb_queue_empty(&sk->sk_receive_queue), &wait); + sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); + remove_wait_queue(sk_sleep(sk), &wait); + return ret; +} + static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_len) { @@@ -206,11 -184,11 +206,11 @@@ msg_bytes_ready: copied = sk_msg_recvmsg(sk, psock, msg, len, flags); if (!copied) { - int data, err = 0; long timeo; + int data; timeo = sock_rcvtimeo(sk, nonblock); - data = tcp_msg_wait_data(sk, psock, flags, timeo, &err); - data = sk_msg_wait_data(sk, psock, timeo); ++ data = tcp_msg_wait_data(sk, psock, timeo); if (data) { if (!sk_psock_queue_empty(psock)) goto msg_bytes_ready; diff --cc net/ipv4/udp_bpf.c index 565a70040c57,b07e4b6dda25..000000000000 --- a/net/ipv4/udp_bpf.c +++ b/net/ipv4/udp_bpf.c @@@ -21,45 -21,6 +21,45 @@@ static int sk_udp_recvmsg(struct sock * return udp_prot.recvmsg(sk, msg, len, noblock, flags, addr_len); } +static bool udp_sk_has_data(struct sock *sk) +{ + return !skb_queue_empty(&udp_sk(sk)->reader_queue) || + !skb_queue_empty(&sk->sk_receive_queue); +} + +static bool psock_has_data(struct sk_psock *psock) +{ + return !skb_queue_empty(&psock->ingress_skb) || + !sk_psock_queue_empty(psock); +} + +#define udp_msg_has_data(__sk, __psock) \ + ({ udp_sk_has_data(__sk) || psock_has_data(__psock); }) + - static int udp_msg_wait_data(struct sock *sk, struct sk_psock *psock, int flags, - long timeo, int *err) ++static int udp_msg_wait_data(struct sock *sk, struct sk_psock *psock, ++ long timeo) +{ + DEFINE_WAIT_FUNC(wait, woken_wake_function); + int ret = 0; + + if (sk->sk_shutdown & RCV_SHUTDOWN) + return 1; + + if (!timeo) + return ret; + + add_wait_queue(sk_sleep(sk), &wait); + sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); + ret = udp_msg_has_data(sk, psock); + if (!ret) { + wait_woken(&wait, TASK_INTERRUPTIBLE, timeo); + ret = udp_msg_has_data(sk, psock); + } + sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); + remove_wait_queue(sk_sleep(sk), &wait); + return ret; +} + static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_len) { @@@ -81,13 -43,13 +81,13 @@@ msg_bytes_ready: copied = sk_msg_recvmsg(sk, psock, msg, len, flags); if (!copied) { - int data, err = 0; long timeo; + int data; timeo = sock_rcvtimeo(sk, nonblock); - data = udp_msg_wait_data(sk, psock, flags, timeo, &err); - data = sk_msg_wait_data(sk, psock, timeo); ++ data = udp_msg_wait_data(sk, psock, timeo); if (data) { - if (!sk_psock_queue_empty(psock)) + if (psock_has_data(psock)) goto msg_bytes_ready; ret = sk_udp_recvmsg(sk, msg, len, nonblock, flags, addr_len); goto out;
Attachment:
pgpLPKOv5_xF9.pgp
Description: OpenPGP digital signature