From nobody Mon Sep 16 19:29:05 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98926206A8 for ; Tue, 23 May 2023 17:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684863457; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5+n8a0gW1YSwwoJ5y5dBvmTDHpHzCS15tpofGCQ7+u8=; b=b/n6EOaT8Zu3ICnGnsw7LmS0ERiPSCAhXIOv93N/JZXTraEtJy5zOHYXcBoIQwarTr6nlk LkWXiWK33HREC700xSM+Tx1z+se+ZdmNUkrvC+7AzE9XBzNw5QvvtaGfbRW5GccpDs7WDY KpkQa0r2O/cVQ7R17u+19yVcMqNs73Y= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-253-EMmJBIZRMhO0E5U-N25Mvw-1; Tue, 23 May 2023 13:37:36 -0400 X-MC-Unique: EMmJBIZRMhO0E5U-N25Mvw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DE582800B35 for ; Tue, 23 May 2023 17:37:35 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.193.138]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6E323140EBB8 for ; Tue, 23 May 2023 17:37:35 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v3 mptcp-next 4/6] mptcp: track some aggregate data counters. Date: Tue, 23 May 2023 19:37:27 +0200 Message-Id: <6c8b8ab79ee6526dff0cd3240e35e2e82c300a5d.1684863309.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" Currently there are no data transfer counters accounting for all the subflows used by a given MPTCP socket. The user-space can compute such figures aggregating the subflow info, but that is inaccurate if any subflow is closed before the MPTCP socket itself. Add the new counters in the MPTCP socket itself and expose them via the existing diag and sockopt. While touching mptcp_diag_fill_info(), acquire the relevant locks before fetching the msk data, to ensure better data consistency Signed-off-by: Paolo Abeni --- include/uapi/linux/mptcp.h | 5 +++++ net/mptcp/options.c | 10 ++++++++-- net/mptcp/protocol.c | 12 +++++++++++- net/mptcp/protocol.h | 4 ++++ net/mptcp/sockopt.c | 22 +++++++++++++++++----- 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index f4f42d88e58b..ac469625affd 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -124,6 +124,11 @@ struct mptcp_info { __u8 mptcpi_local_addr_used; __u8 mptcpi_local_addr_max; __u8 mptcpi_csum_enabled; + __u32 mptcpi_retransmits; + __u64 mptcpi_bytes_retrans; + __u64 mptcpi_bytes_sent; + __u64 mptcpi_bytes_received; + __u64 mptcpi_bytes_acked; }; =20 /* diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 4bdcd2b326bd..c254accb14de 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1026,6 +1026,12 @@ u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq) return cur_seq; } =20 +static void __mptcp_snd_una_update(struct mptcp_sock *msk, u64 new_snd_una) +{ + msk->bytes_acked +=3D new_snd_una - msk->snd_una; + msk->snd_una =3D new_snd_una; +} + static void ack_update_msk(struct mptcp_sock *msk, struct sock *ssk, struct mptcp_options_received *mp_opt) @@ -1057,7 +1063,7 @@ static void ack_update_msk(struct mptcp_sock *msk, __mptcp_check_push(sk, ssk); =20 if (after64(new_snd_una, old_snd_una)) { - msk->snd_una =3D new_snd_una; + __mptcp_snd_una_update(msk, new_snd_una); __mptcp_data_acked(sk); } mptcp_data_unlock(sk); @@ -1123,7 +1129,7 @@ bool mptcp_incoming_options(struct sock *sk, struct s= k_buff *skb) /* on fallback we just need to ignore the msk-level snd_una, as * this is really plain TCP */ - msk->snd_una =3D READ_ONCE(msk->snd_nxt); + __mptcp_snd_una_update(msk, READ_ONCE(msk->snd_nxt)); =20 __mptcp_data_acked(subflow->conn); mptcp_data_unlock(subflow->conn); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 89fee2ac84e2..adf26b991c1e 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -378,6 +378,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, st= ruct sock *ssk, =20 if (MPTCP_SKB_CB(skb)->map_seq =3D=3D msk->ack_seq) { /* in sequence */ + msk->bytes_received +=3D copy_len; WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len); tail =3D skb_peek_tail(&sk->sk_receive_queue); if (tail && mptcp_try_coalesce(sk, tail, skb)) @@ -761,6 +762,7 @@ static bool __mptcp_ofo_queue(struct mptcp_sock *msk) MPTCP_SKB_CB(skb)->map_seq +=3D delta; __skb_queue_tail(&sk->sk_receive_queue, skb); } + msk->bytes_received +=3D end_seq - msk->ack_seq; msk->ack_seq =3D end_seq; moved =3D true; } @@ -1513,8 +1515,10 @@ static void mptcp_update_post_push(struct mptcp_sock= *msk, * that has been handed to the subflow for transmission * and skip update in case it was old dfrag. */ - if (likely(after64(snd_nxt_new, msk->snd_nxt))) + if (likely(after64(snd_nxt_new, msk->snd_nxt))) { + msk->bytes_sent +=3D snd_nxt_new - msk->snd_nxt; msk->snd_nxt =3D snd_nxt_new; + } } =20 void mptcp_check_and_set_pending(struct sock *sk) @@ -2639,6 +2643,8 @@ static void __mptcp_retrans(struct sock *sk) msk->last_snd =3D ssk; } } + + msk->bytes_retrans +=3D len; dfrag->already_sent =3D max(dfrag->already_sent, len); =20 reset_timer: @@ -3153,6 +3159,10 @@ static int mptcp_disconnect(struct sock *sk, int fla= gs) WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk))); mptcp_pm_data_reset(msk); mptcp_ca_reset(sk); + msk->bytes_acked =3D 0; + msk->bytes_received =3D 0; + msk->bytes_sent =3D 0; + msk->bytes_retrans =3D 0; =20 WRITE_ONCE(sk->sk_shutdown, 0); sk_error_report(sk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f9180ecce5e4..0283383a09f4 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -261,10 +261,13 @@ struct mptcp_sock { u64 local_key; u64 remote_key; u64 write_seq; + u64 bytes_sent; u64 snd_nxt; + u64 bytes_received; u64 ack_seq; atomic64_t rcv_wnd_sent; u64 rcv_data_fin_seq; + u64 bytes_retrans; int rmem_fwd_alloc; struct sock *last_snd; int snd_burst; @@ -273,6 +276,7 @@ struct mptcp_sock { * recovery related fields are under data_lock * protection */ + u64 bytes_acked; u64 snd_una; u64 wnd_end; unsigned long timer_ival; diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index b4d04d5dc1f7..2464100ef820 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -888,7 +888,9 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int =20 void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info) { + struct sock *sk =3D (struct sock *)msk; u32 flags =3D 0; + bool slow; =20 memset(info, 0, sizeof(*info)); =20 @@ -914,11 +916,21 @@ void mptcp_diag_fill_info(struct mptcp_sock *msk, str= uct mptcp_info *info) if (READ_ONCE(msk->can_ack)) flags |=3D MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED; info->mptcpi_flags =3D flags; - info->mptcpi_token =3D READ_ONCE(msk->token); - info->mptcpi_write_seq =3D READ_ONCE(msk->write_seq); - info->mptcpi_snd_una =3D READ_ONCE(msk->snd_una); - info->mptcpi_rcv_nxt =3D READ_ONCE(msk->ack_seq); - info->mptcpi_csum_enabled =3D READ_ONCE(msk->csum_enabled); + mptcp_data_lock(sk); + info->mptcpi_snd_una =3D msk->snd_una; + info->mptcpi_rcv_nxt =3D msk->ack_seq; + info->mptcpi_bytes_acked =3D msk->bytes_acked; + mptcp_data_unlock(sk); + + slow =3D lock_sock_fast(sk); + info->mptcpi_csum_enabled =3D msk->csum_enabled; + info->mptcpi_token =3D msk->token; + info->mptcpi_write_seq =3D msk->write_seq; + info->mptcpi_retransmits =3D inet_csk(sk)->icsk_retransmits; + info->mptcpi_bytes_sent =3D msk->bytes_sent; + info->mptcpi_bytes_received =3D msk->bytes_received; + info->mptcpi_bytes_retrans =3D msk->bytes_retrans; + unlock_sock_fast(sk, slow); } EXPORT_SYMBOL_GPL(mptcp_diag_fill_info); =20 --=20 2.40.1