From: Geliang Tang <tanggeliang@kylinos.cn>
This patch sets .splice_read interface of mptcp struct proto_ops as
tcp_splice_read. And invoke .read_sock in __tcp_splice_read().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/ipv4/tcp.c | 6 ++++++
net/mptcp/protocol.c | 2 ++
2 files changed, 8 insertions(+)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index c18682c3fa33..98ce7a624b33 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -779,6 +779,12 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
.arg.data = tss,
.count = tss->len,
};
+ const struct proto_ops *ops;
+
+ ops = READ_ONCE(sk->sk_socket->ops);
+
+ if (likely(ops->read_sock))
+ return ops->read_sock(sk, &rd_desc, tcp_splice_data_recv);
return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv);
}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 488a673f4da3..45db44700e64 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -4036,6 +4036,7 @@ static const struct proto_ops mptcp_stream_ops = {
.mmap = sock_no_mmap,
.set_rcvlowat = mptcp_set_rcvlowat,
.read_sock = mptcp_read_sock,
+ .splice_read = tcp_splice_read,
};
static struct inet_protosw mptcp_protosw = {
@@ -4141,6 +4142,7 @@ static const struct proto_ops mptcp_v6_stream_ops = {
#endif
.set_rcvlowat = mptcp_set_rcvlowat,
.read_sock = mptcp_read_sock,
+ .splice_read = tcp_splice_read,
};
static struct proto mptcp_v6_prot;
--
2.48.1