diff mbox series

tcp: Add tracepoint for tcp_set_ca_state

Message ID 20220330130128.10256-1-jacky_gam_2001@163.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series tcp: Add tracepoint for tcp_set_ca_state | expand

Checks

Context Check Description
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1106 this patch: 1106
netdev/cc_maintainers success CCed 9 of 9 maintainers
netdev/build_clang success Errors and warnings before: 133 this patch: 133
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 1111 this patch: 1111
netdev/checkpatch warning CHECK: Alignment should match open parenthesis CHECK: Lines should not end with a '(' CHECK: No space is necessary after a cast
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/tree_selection success Guessing tree name failed - patch did not apply, async

Commit Message

jackygam2001 March 30, 2022, 1:01 p.m. UTC
The congestion status of a tcp flow may be updated since there
is congestion between tcp sender and receiver. It makes sense for
adding tracepoint for congestion status update function to evaluate
the performance of network and congestion algorithm.

Link: https://github.com/iovisor/bcc/pull/3899

Signed-off-by: jackygam2001 <jacky_gam_2001@163.com>
---
 include/net/tcp.h          | 12 +++---------
 include/trace/events/tcp.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
 net/ipv4/tcp_cong.c        | 12 ++++++++++++
 3 files changed, 60 insertions(+), 9 deletions(-)

Comments

Denis Kirjanov March 30, 2022, 1:33 p.m. UTC | #1
3/30/22 16:01, jackygam2001 пишет:
> The congestion status of a tcp flow may be updated since there
> is congestion between tcp sender and receiver. It makes sense for
> adding tracepoint for congestion status update function to evaluate
> the performance of network and congestion algorithm.
> 
> Link: https://github.com/iovisor/bcc/pull/3899
> 
> Signed-off-by: jackygam2001 <jacky_gam_2001@163.com>
Please use net-next prefix and use your real name in SOB

> ---
>   include/net/tcp.h          | 12 +++---------
>   include/trace/events/tcp.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
>   net/ipv4/tcp_cong.c        | 12 ++++++++++++
>   3 files changed, 60 insertions(+), 9 deletions(-)
> 
> diff --git a/include/net/tcp.h b/include/net/tcp.h
> index 70ca4a5e330a..9a3786f33798 100644
> --- a/include/net/tcp.h
> +++ b/include/net/tcp.h
> @@ -1139,15 +1139,6 @@ static inline bool tcp_ca_needs_ecn(const struct sock *sk)
>   	return icsk->icsk_ca_ops->flags & TCP_CONG_NEEDS_ECN;
>   }
>   
> -static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
> -{
> -	struct inet_connection_sock *icsk = inet_csk(sk);
> -
> -	if (icsk->icsk_ca_ops->set_state)
> -		icsk->icsk_ca_ops->set_state(sk, ca_state);
> -	icsk->icsk_ca_state = ca_state;
> -}
> -
>   static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
>   {
>   	const struct inet_connection_sock *icsk = inet_csk(sk);
> @@ -1156,6 +1147,9 @@ static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
>   		icsk->icsk_ca_ops->cwnd_event(sk, event);
>   }
>   
> +/* From tcp_cong.c */
> +void tcp_set_ca_state(struct sock *sk, const u8 ca_state);
> +
>   /* From tcp_rate.c */
>   void tcp_rate_skb_sent(struct sock *sk, struct sk_buff *skb);
>   void tcp_rate_skb_delivered(struct sock *sk, struct sk_buff *skb,
> diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h
> index 521059d8dc0a..69a68b01c1de 100644
> --- a/include/trace/events/tcp.h
> +++ b/include/trace/events/tcp.h
> @@ -371,6 +371,51 @@ DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
>   	TP_ARGS(skb)
>   );
>   
> +TRACE_EVENT(tcp_cong_state_set,
> +
> +	TP_PROTO(struct sock *sk, const u8 ca_state),
> +
> +	TP_ARGS(sk, ca_state),
> +
> +	TP_STRUCT__entry(
> +		__field(const void *, skaddr)
> +		__field(__u16, sport)
> +		__field(__u16, dport)
> +		__array(__u8, saddr, 4)
> +		__array(__u8, daddr, 4)
> +		__array(__u8, saddr_v6, 16)
> +		__array(__u8, daddr_v6, 16)
> +		__field(__u8, cong_state)
> +	),
> +
> +	TP_fast_assign(
> +		struct inet_sock *inet = inet_sk(sk);
> +		__be32 *p32;
> +
> +		__entry->skaddr = sk;
> +
> +		__entry->sport = ntohs(inet->inet_sport);
> +		__entry->dport = ntohs(inet->inet_dport);
> +
> +		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->cong_state = ca_state;
> +	),
> +
> +	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
> +		  __entry->sport, __entry->dport,
> +		  __entry->saddr, __entry->daddr,
> +		  __entry->saddr_v6, __entry->daddr_v6,
> +		  __entry->cong_state)
> +);
> +
>   #endif /* _TRACE_TCP_H */
>   
>   /* This part must be outside protection */
> diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
> index dc95572163df..98b48bdb8be7 100644
> --- a/net/ipv4/tcp_cong.c
> +++ b/net/ipv4/tcp_cong.c
> @@ -16,6 +16,7 @@
>   #include <linux/gfp.h>
>   #include <linux/jhash.h>
>   #include <net/tcp.h>
> +#include <trace/events/tcp.h>
>   
>   static DEFINE_SPINLOCK(tcp_cong_list_lock);
>   static LIST_HEAD(tcp_cong_list);
> @@ -33,6 +34,17 @@ struct tcp_congestion_ops *tcp_ca_find(const char *name)
>   	return NULL;
>   }
>   
> +void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
> +{
> +	struct inet_connection_sock *icsk = inet_csk(sk);
> +
> +	trace_tcp_cong_state_set(sk, ca_state);
> +
> +	if (icsk->icsk_ca_ops->set_state)
> +		icsk->icsk_ca_ops->set_state(sk, ca_state);
> +	icsk->icsk_ca_state = ca_state;
> +}
> +
>   /* Must be called with rcu lock held */
>   static struct tcp_congestion_ops *tcp_ca_find_autoload(struct net *net,
>   						       const char *name)
diff mbox series

Patch

diff --git a/include/net/tcp.h b/include/net/tcp.h
index 70ca4a5e330a..9a3786f33798 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1139,15 +1139,6 @@  static inline bool tcp_ca_needs_ecn(const struct sock *sk)
 	return icsk->icsk_ca_ops->flags & TCP_CONG_NEEDS_ECN;
 }
 
-static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
-{
-	struct inet_connection_sock *icsk = inet_csk(sk);
-
-	if (icsk->icsk_ca_ops->set_state)
-		icsk->icsk_ca_ops->set_state(sk, ca_state);
-	icsk->icsk_ca_state = ca_state;
-}
-
 static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
 {
 	const struct inet_connection_sock *icsk = inet_csk(sk);
@@ -1156,6 +1147,9 @@  static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
 		icsk->icsk_ca_ops->cwnd_event(sk, event);
 }
 
+/* From tcp_cong.c */
+void tcp_set_ca_state(struct sock *sk, const u8 ca_state);
+
 /* From tcp_rate.c */
 void tcp_rate_skb_sent(struct sock *sk, struct sk_buff *skb);
 void tcp_rate_skb_delivered(struct sock *sk, struct sk_buff *skb,
diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h
index 521059d8dc0a..69a68b01c1de 100644
--- a/include/trace/events/tcp.h
+++ b/include/trace/events/tcp.h
@@ -371,6 +371,51 @@  DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
 	TP_ARGS(skb)
 );
 
+TRACE_EVENT(tcp_cong_state_set,
+
+	TP_PROTO(struct sock *sk, const u8 ca_state),
+
+	TP_ARGS(sk, ca_state),
+
+	TP_STRUCT__entry(
+		__field(const void *, skaddr)
+		__field(__u16, sport)
+		__field(__u16, dport)
+		__array(__u8, saddr, 4)
+		__array(__u8, daddr, 4)
+		__array(__u8, saddr_v6, 16)
+		__array(__u8, daddr_v6, 16)
+		__field(__u8, cong_state)
+	),
+
+	TP_fast_assign(
+		struct inet_sock *inet = inet_sk(sk);
+		__be32 *p32;
+
+		__entry->skaddr = sk;
+
+		__entry->sport = ntohs(inet->inet_sport);
+		__entry->dport = ntohs(inet->inet_dport);
+
+		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->cong_state = ca_state;
+	),
+
+	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
+		  __entry->sport, __entry->dport,
+		  __entry->saddr, __entry->daddr,
+		  __entry->saddr_v6, __entry->daddr_v6,
+		  __entry->cong_state)
+);
+
 #endif /* _TRACE_TCP_H */
 
 /* This part must be outside protection */
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
index dc95572163df..98b48bdb8be7 100644
--- a/net/ipv4/tcp_cong.c
+++ b/net/ipv4/tcp_cong.c
@@ -16,6 +16,7 @@ 
 #include <linux/gfp.h>
 #include <linux/jhash.h>
 #include <net/tcp.h>
+#include <trace/events/tcp.h>
 
 static DEFINE_SPINLOCK(tcp_cong_list_lock);
 static LIST_HEAD(tcp_cong_list);
@@ -33,6 +34,17 @@  struct tcp_congestion_ops *tcp_ca_find(const char *name)
 	return NULL;
 }
 
+void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
+{
+	struct inet_connection_sock *icsk = inet_csk(sk);
+
+	trace_tcp_cong_state_set(sk, ca_state);
+
+	if (icsk->icsk_ca_ops->set_state)
+		icsk->icsk_ca_ops->set_state(sk, ca_state);
+	icsk->icsk_ca_state = ca_state;
+}
+
 /* Must be called with rcu lock held */
 static struct tcp_congestion_ops *tcp_ca_find_autoload(struct net *net,
 						       const char *name)