diff mbox series

[mptcp-next,1/3] mptcp: add last time fields in mptcp_sock

Message ID ddf6d9178e3fa8b2646d8b7b9fb5e091ebf07833.1710748923.git.tanggeliang@kylinos.cn (mailing list archive)
State Superseded, archived
Delegated to: Mat Martineau
Headers show
Series display "last time" actions info | expand

Checks

Context Check Description
matttbe/build success Build and static analysis OK
matttbe/checkpatch success total: 0 errors, 0 warnings, 0 checks, 39 lines checked
matttbe/shellcheck success MPTCP selftests files have not been modified
matttbe/KVM_Validation__normal success Success! ✅
matttbe/KVM_Validation__debug warning Unstable: 2 failed test(s): packetdrill_sockopts selftest_mptcp_join
matttbe/KVM_Validation__btf__only_bpftest_all_ success Success! ✅

Commit Message

Geliang Tang March 18, 2024, 8:03 a.m. UTC
From: Geliang Tang <tanggeliang@kylinos.cn>

This patch adds "last time" fields last_data_sent, last_data_recv and
last_ack_recv in struct mptcp_sock to record the last time data_sent,
data_recv and ack_recv happened. They all are initialized as
tcp_jiffies32 in __mptcp_init_sock(), but updated as tcp_jiffies32 too
when data is sent in __subflow_push_pending(), data is received in
mptcp_recvmsg(), and ack is received in ack_update_msk().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/options.c  | 1 +
 net/mptcp/protocol.c | 5 +++++
 net/mptcp/protocol.h | 3 +++
 3 files changed, 9 insertions(+)

Comments

Mat Martineau March 27, 2024, 1:17 a.m. UTC | #1
On Mon, 18 Mar 2024, Geliang Tang wrote:

> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> This patch adds "last time" fields last_data_sent, last_data_recv and
> last_ack_recv in struct mptcp_sock to record the last time data_sent,
> data_recv and ack_recv happened. They all are initialized as
> tcp_jiffies32 in __mptcp_init_sock(), but updated as tcp_jiffies32 too
> when data is sent in __subflow_push_pending(), data is received in
> mptcp_recvmsg(), and ack is received in ack_update_msk().
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> net/mptcp/options.c  | 1 +
> net/mptcp/protocol.c | 5 +++++
> net/mptcp/protocol.h | 3 +++
> 3 files changed, 9 insertions(+)
>
> diff --git a/net/mptcp/options.c b/net/mptcp/options.c
> index 5926955625cf..c0832df3b0a3 100644
> --- a/net/mptcp/options.c
> +++ b/net/mptcp/options.c
> @@ -1069,6 +1069,7 @@ static void ack_update_msk(struct mptcp_sock *msk,
> 		__mptcp_snd_una_update(msk, new_snd_una);
> 		__mptcp_data_acked(sk);
> 	}
> +	msk->last_ack_recv = tcp_jiffies32;
> 	mptcp_data_unlock(sk);
>
> 	trace_ack_update_msk(mp_opt->data_ack,
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index cdf9ec67795e..a6b5c6492e9b 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1556,6 +1556,7 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
> 	err = copied;
>
> out:
> +	msk->last_data_sent = tcp_jiffies32;

Hi Geliang -

I think msk->last_data_sent should only be updated if err > 0.

> 	return err;
> }
>
> @@ -2262,6 +2263,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
> 		 skb_queue_empty(&msk->receive_queue), copied);
> 	if (!(flags & MSG_PEEK))
> 		mptcp_rcv_space_adjust(msk, copied);
> +	msk->last_data_recv = tcp_jiffies32;

This is too late in the receive process, to be comparable to TCP I think 
this timestamp should be set in __mptcp_move_skbs_from_subflow().

- Mat

>
> 	release_sock(sk);
> 	return copied;
> @@ -2793,6 +2795,9 @@ static void __mptcp_init_sock(struct sock *sk)
> 	WRITE_ONCE(msk->allow_infinite_fallback, true);
> 	msk->recovery = false;
> 	msk->subflow_id = 1;
> +	msk->last_data_sent = tcp_jiffies32;
> +	msk->last_data_recv = tcp_jiffies32;
> +	msk->last_ack_recv = tcp_jiffies32;
>
> 	mptcp_pm_data_init(msk);
>
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 5a4538205fd6..3a3fed3642dd 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -282,6 +282,9 @@ struct mptcp_sock {
> 	u64		bytes_acked;
> 	u64		snd_una;
> 	u64		wnd_end;
> +	u32		last_data_sent;
> +	u32		last_data_recv;
> +	u32		last_ack_recv;
> 	unsigned long	timer_ival;
> 	u32		token;
> 	int		rmem_released;
> -- 
> 2.40.1
>
>
>
diff mbox series

Patch

diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 5926955625cf..c0832df3b0a3 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -1069,6 +1069,7 @@  static void ack_update_msk(struct mptcp_sock *msk,
 		__mptcp_snd_una_update(msk, new_snd_una);
 		__mptcp_data_acked(sk);
 	}
+	msk->last_ack_recv = tcp_jiffies32;
 	mptcp_data_unlock(sk);
 
 	trace_ack_update_msk(mp_opt->data_ack,
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index cdf9ec67795e..a6b5c6492e9b 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1556,6 +1556,7 @@  static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
 	err = copied;
 
 out:
+	msk->last_data_sent = tcp_jiffies32;
 	return err;
 }
 
@@ -2262,6 +2263,7 @@  static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
 		 skb_queue_empty(&msk->receive_queue), copied);
 	if (!(flags & MSG_PEEK))
 		mptcp_rcv_space_adjust(msk, copied);
+	msk->last_data_recv = tcp_jiffies32;
 
 	release_sock(sk);
 	return copied;
@@ -2793,6 +2795,9 @@  static void __mptcp_init_sock(struct sock *sk)
 	WRITE_ONCE(msk->allow_infinite_fallback, true);
 	msk->recovery = false;
 	msk->subflow_id = 1;
+	msk->last_data_sent = tcp_jiffies32;
+	msk->last_data_recv = tcp_jiffies32;
+	msk->last_ack_recv = tcp_jiffies32;
 
 	mptcp_pm_data_init(msk);
 
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 5a4538205fd6..3a3fed3642dd 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -282,6 +282,9 @@  struct mptcp_sock {
 	u64		bytes_acked;
 	u64		snd_una;
 	u64		wnd_end;
+	u32		last_data_sent;
+	u32		last_data_recv;
+	u32		last_ack_recv;
 	unsigned long	timer_ival;
 	u32		token;
 	int		rmem_released;