From: Jakub Kicinski Date: Tue, 29 Jun 2021 22:45:27 +0000 (-0700) Subject: Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=b6df00789e2831fff7a2c65aa7164b2a4dcbe599;p=linux.git Merge git://git./linux/kernel/git/netdev/net Trivial conflict in net/netfilter/nf_tables_api.c. Duplicate fix in tools/testing/selftests/net/devlink_port_split.py - take the net-next version. skmsg, and L4 bpf - keep the bpf code but remove the flags and err params. Signed-off-by: Jakub Kicinski --- b6df00789e2831fff7a2c65aa7164b2a4dcbe599 diff --cc include/net/sch_generic.h index c99ffe9cc88f8,57710303908c6..9ed33e6840bd6 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@@ -171,8 -161,14 +171,14 @@@ static inline bool qdisc_run_begin(stru { if (qdisc->flags & TCQ_F_NOLOCK) { if (spin_trylock(&qdisc->seqlock)) - goto nolock_empty; + return true; + /* Paired with smp_mb__after_atomic() to make sure + * STATE_MISSED checking is synchronized with clearing + * in pfifo_fast_dequeue(). + */ + smp_mb__before_atomic(); + /* If the MISSED flag is set, it means other thread has * set the MISSED flag before second spin_trylock(), so * we can return false here to avoid multi cpus doing diff --cc net/ipv4/tcp_bpf.c index a80de92ea3b61,bb49b52d7be84..f26916a62f256 --- a/net/ipv4/tcp_bpf.c +++ b/net/ipv4/tcp_bpf.c @@@ -163,6 -163,28 +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) { @@@ -184,11 -206,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 = sk_msg_wait_data(sk, psock, timeo); - data = tcp_msg_wait_data(sk, psock, flags, timeo, &err); ++ 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 b07e4b6dda257,565a70040c573..45b8782aec0cc --- a/net/ipv4/udp_bpf.c +++ b/net/ipv4/udp_bpf.c @@@ -21,6 -21,45 +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) { @@@ -43,13 -81,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 = sk_msg_wait_data(sk, psock, timeo); - data = udp_msg_wait_data(sk, psock, flags, timeo, &err); ++ 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; diff --cc net/netfilter/nf_tables_api.c index d6214242fe7f6,fcb15b8904e87..390d4466567f7 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@@ -3236,9 -3249,9 +3242,9 @@@ static int nf_tables_newrule(struct sk_ u8 genmask = nft_genmask_next(info->net); struct nft_rule *rule, *old_rule = NULL; struct nft_expr_info *expr_info = NULL; + u8 family = info->nfmsg->nfgen_family; + struct nft_flow_rule *flow = NULL; - int family = nfmsg->nfgen_family; struct net *net = info->net; - struct nft_flow_rule *flow; struct nft_userdata *udata; struct nft_table *table; struct nft_chain *chain;