Skip to content

Commit f11d51e

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: implement .read_sock
nvme_tcp_try_recv() needs to call .read_sock interface of struct proto_ops, but it is not implemented in MPTCP. This patch implements it with reference to __mptcp_recvmsg_mskq(). Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: Geliang Tang <[email protected]>
1 parent b03f13c commit f11d51e

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

net/mptcp/protocol.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3956,6 +3956,58 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,
39563956
return mask;
39573957
}
39583958

3959+
static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
3960+
sk_read_actor_t recv_actor)
3961+
{
3962+
struct mptcp_sock *msk = mptcp_sk(sk);
3963+
struct scm_timestamping_internal tss;
3964+
struct sk_buff *skb, *tmp;
3965+
size_t len = INT_MAX;
3966+
int copied = 0;
3967+
3968+
skb_queue_walk_safe(&sk->sk_receive_queue, skb, tmp) {
3969+
u32 offset = MPTCP_SKB_CB(skb)->offset;
3970+
u32 data_len = skb->len - offset;
3971+
u32 count = min_t(size_t, len - copied, data_len);
3972+
int used;
3973+
3974+
used = recv_actor(desc, skb, offset, count);
3975+
if (used <= 0) {
3976+
if (!copied)
3977+
copied = used;
3978+
break;
3979+
}
3980+
3981+
if (MPTCP_SKB_CB(skb)->has_rxtstamp)
3982+
tcp_update_recv_tstamps(skb, &tss);
3983+
3984+
copied += used;
3985+
3986+
if (used < data_len) {
3987+
MPTCP_SKB_CB(skb)->offset += used;
3988+
MPTCP_SKB_CB(skb)->map_seq += used;
3989+
msk->bytes_consumed += used;
3990+
break;
3991+
}
3992+
3993+
skb->destructor = NULL;
3994+
atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
3995+
sk_mem_uncharge(sk, skb->truesize);
3996+
sk_eat_skb(sk, skb);
3997+
msk->bytes_consumed += used;
3998+
3999+
if (copied >= len)
4000+
break;
4001+
}
4002+
4003+
mptcp_rcv_space_adjust(msk, copied);
4004+
4005+
if (copied > 0)
4006+
mptcp_cleanup_rbuf(msk, copied);
4007+
4008+
return copied;
4009+
}
4010+
39594011
static const struct proto_ops mptcp_stream_ops = {
39604012
.family = PF_INET,
39614013
.owner = THIS_MODULE,
@@ -3976,6 +4028,7 @@ static const struct proto_ops mptcp_stream_ops = {
39764028
.recvmsg = inet_recvmsg,
39774029
.mmap = sock_no_mmap,
39784030
.set_rcvlowat = mptcp_set_rcvlowat,
4031+
.read_sock = mptcp_read_sock,
39794032
};
39804033

39814034
static struct inet_protosw mptcp_protosw = {
@@ -4080,6 +4133,7 @@ static const struct proto_ops mptcp_v6_stream_ops = {
40804133
.compat_ioctl = inet6_compat_ioctl,
40814134
#endif
40824135
.set_rcvlowat = mptcp_set_rcvlowat,
4136+
.read_sock = mptcp_read_sock,
40834137
};
40844138

40854139
static struct proto mptcp_v6_prot;

0 commit comments

Comments
 (0)