Thread (4 messages) flat view 4 messages, 3 authors, 2021-10-19
STALE1768d

[PATCH] bpf, sockmap: Do not read sk_receive_queue in tcp_bpf_recvmsg if strparser enabled

From: Liu Jian <hidden>
Date: 2021-10-15 07:58:36
Also in: bpf
Subsystem: bpf [l7 framework] (sockmap), networking [general], networking [tcp], the rest · Maintainers: John Fastabend, Jakub Sitnicki, Jiayuan Chen, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Neal Cardwell, Linus Torvalds

If the strparser function of sk is turned on, all received data needs to
be processed by strparser first.

Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
Signed-off-by: Liu Jian <redacted>
---
 include/linux/skmsg.h | 6 ++++++
 net/core/skmsg.c      | 5 +++++
 net/ipv4/tcp_bpf.c    | 9 ++++++---
 3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/include/linux/skmsg.h b/include/linux/skmsg.h
index 94e2a1f6e58d..25e92dff04aa 100644
--- a/include/linux/skmsg.h
+++ b/include/linux/skmsg.h
@@ -390,6 +390,7 @@ void sk_psock_stop(struct sk_psock *psock, bool wait);
 int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock);
 void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock);
 void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock);
+bool sk_psock_strparser_started(struct sock *sk);
 #else
 static inline int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
 {
@@ -403,6 +404,11 @@ static inline void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
 static inline void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
 {
 }
+
+static inline bool sk_psock_strparser_started(struct sock *sk)
+{
+	return false;
+}
 #endif
 
 void sk_psock_start_verdict(struct sock *sk, struct sk_psock *psock);
diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index e85b7f8491b9..dd64ef854f3e 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -1105,6 +1105,11 @@ void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
 	sk->sk_write_space = sk_psock_write_space;
 }
 
+bool sk_psock_strparser_started(struct sock *sk)
+{
+	return sk->sk_data_ready == sk_psock_strp_data_ready;
+}
+
 void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
 {
 	if (!psock->saved_data_ready)
diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index 9d068153c316..17129b343966 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -198,6 +198,7 @@ static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
 	if (unlikely(!psock))
 		return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
 	if (!skb_queue_empty(&sk->sk_receive_queue) &&
+	    !sk_psock_strparser_started(sk) &&
 	    sk_psock_queue_empty(psock)) {
 		sk_psock_put(sk, psock);
 		return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
@@ -214,9 +215,11 @@ static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
 		if (data) {
 			if (!sk_psock_queue_empty(psock))
 				goto msg_bytes_ready;
-			release_sock(sk);
-			sk_psock_put(sk, psock);
-			return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
+			if (!sk_psock_strparser_started(sk)) {
+				release_sock(sk);
+				sk_psock_put(sk, psock);
+				return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
+			}
 		}
 		copied = -EAGAIN;
 	}
-- 
2.17.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help