From: Paolo Abeni <[email protected]>

Similar to tcp, provide a new tracepoint to better understand
mptcp_rcv_space_adjust() behavior, which presents many artifacts.

Note that the used format string is so long that I preferred
wrap it, contrary to guidance for quoted strings.

Reviewed-by: Mat Martineau <[email protected]>
Signed-off-by: Paolo Abeni <[email protected]>
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
---
To: Steven Rostedt <[email protected]>
To: Masami Hiramatsu <[email protected]>
To: Mathieu Desnoyers <[email protected]>
Cc: [email protected]
---
 include/trace/events/mptcp.h | 80 ++++++++++++++++++++++++++++++++++++++++++++
 net/mptcp/protocol.c         |  3 ++
 2 files changed, 83 insertions(+)

diff --git a/include/trace/events/mptcp.h b/include/trace/events/mptcp.h
index 085b749cdd97..269d949b2025 100644
--- a/include/trace/events/mptcp.h
+++ b/include/trace/events/mptcp.h
@@ -5,7 +5,13 @@
 #if !defined(_TRACE_MPTCP_H) || defined(TRACE_HEADER_MULTI_READ)
 #define _TRACE_MPTCP_H
 
+#include <linux/ipv6.h>
+#include <linux/tcp.h>
 #include <linux/tracepoint.h>
+#include <net/ipv6.h>
+#include <net/tcp.h>
+#include <linux/sock_diag.h>
+#include <net/rstreason.h>
 
 #define show_mapping_status(status)                                    \
        __print_symbolic(status,                                        \
@@ -178,6 +184,80 @@ TRACE_EVENT(subflow_check_data_avail,
                  __entry->skb)
 );
 
+#include <trace/events/net_probe_common.h>
+
+TRACE_EVENT(mptcp_rcvbuf_grow,
+
+       TP_PROTO(struct sock *sk, int time),
+
+       TP_ARGS(sk, time),
+
+       TP_STRUCT__entry(
+               __field(int, time)
+               __field(__u32, rtt_us)
+               __field(__u32, copied)
+               __field(__u32, inq)
+               __field(__u32, space)
+               __field(__u32, ooo_space)
+               __field(__u32, rcvbuf)
+               __field(__u32, rcv_wnd)
+               __field(__u8, scaling_ratio)
+               __field(__u16, sport)
+               __field(__u16, dport)
+               __field(__u16, family)
+               __array(__u8, saddr, 4)
+               __array(__u8, daddr, 4)
+               __array(__u8, saddr_v6, 16)
+               __array(__u8, daddr_v6, 16)
+               __field(const void *, skaddr)
+       ),
+
+       TP_fast_assign(
+               struct mptcp_sock *msk = mptcp_sk(sk);
+               struct inet_sock *inet = inet_sk(sk);
+               bool ofo_empty;
+               __be32 *p32;
+
+               __entry->time = time;
+               __entry->rtt_us = msk->rcvq_space.rtt_us >> 3;
+               __entry->copied = msk->rcvq_space.copied;
+               __entry->inq = mptcp_inq_hint(sk);
+               __entry->space = msk->rcvq_space.space;
+               ofo_empty = RB_EMPTY_ROOT(&msk->out_of_order_queue);
+               __entry->ooo_space = ofo_empty ? 0 :
+                                    MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq -
+                                    msk->ack_seq;
+
+               __entry->rcvbuf = sk->sk_rcvbuf;
+               __entry->rcv_wnd = atomic64_read(&msk->rcv_wnd_sent) -
+                                  msk->ack_seq;
+               __entry->scaling_ratio = msk->scaling_ratio;
+               __entry->sport = ntohs(inet->inet_sport);
+               __entry->dport = ntohs(inet->inet_dport);
+               __entry->family = sk->sk_family;
+
+               p32 = (__be32 *)__entry->saddr;
+               *p32 = inet->inet_saddr;
+
+               p32 = (__be32 *)__entry->daddr;
+               *p32 = inet->inet_daddr;
+
+               TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
+                              sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
+
+               __entry->skaddr = sk;
+       ),
+
+       TP_printk("time=%u rtt_us=%u copied=%u inq=%u space=%u ooo=%u 
scaling_ratio=%u "
+                 "rcvbuf=%u rcv_wnd=%u family=%d sport=%hu dport=%hu 
saddr=%pI4 "
+                 "daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c skaddr=%p",
+                 __entry->time, __entry->rtt_us, __entry->copied,
+                 __entry->inq, __entry->space, __entry->ooo_space,
+                 __entry->scaling_ratio, __entry->rcvbuf, __entry->rcv_wnd,
+                 __entry->family, __entry->sport, __entry->dport,
+                 __entry->saddr, __entry->daddr, __entry->saddr_v6,
+                 __entry->daddr_v6, __entry->skaddr)
+);
 #endif /* _TRACE_MPTCP_H */
 
 /* This part must be outside protection */
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 514272179714..197ee169c0bc 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -28,6 +28,8 @@
 #include "protocol.h"
 #include "mib.h"
 
+static unsigned int mptcp_inq_hint(const struct sock *sk);
+
 #define CREATE_TRACE_POINTS
 #include <trace/events/mptcp.h>
 
@@ -2133,6 +2135,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock 
*msk, int copied)
        if (msk->rcvq_space.copied <= msk->rcvq_space.space)
                goto new_measure;
 
+       trace_mptcp_rcvbuf_grow(sk, time);
        if (mptcp_rcvbuf_grow(sk, msk->rcvq_space.copied)) {
                /* Make subflows follow along.  If we do not do this, we
                 * get drops at subflow level if skbs can't be moved to

-- 
2.51.0


Reply via email to