From 81c8161bed77ae0da88c78ff822220ba1a2a7a8a Mon Sep 17 00:00:00 2001 From: Liangliang Li Date: Wed, 9 Jun 2021 20:45:29 +0800 Subject: [PATCH] ANDROID: vendor_hooks: Add hooks to tcp/udp send/recv msg functions. Add hook to tcp/udp to collect network info and do performance tuning. Bug: 190523684 Change-Id: Id790a381d5ce6c35a747697510f14678ccf3ff2f Signed-off-by: Liangliang Li --- drivers/android/vendor_hooks.c | 6 ++++++ include/trace/hooks/ipv4.h | 34 ++++++++++++++++++++++++++++++++++ net/ipv4/tcp.c | 4 ++++ net/ipv4/udp.c | 3 +++ 4 files changed, 47 insertions(+) create mode 100644 include/trace/hooks/ipv4.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 79212c880142..70dcac4b81ee 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -72,6 +72,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -371,3 +372,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_snd_compr_use_pause_in_drain); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_show_max_freq); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_sendmsg_locked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_recvmsg); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_udp_sendmsg); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_udp_recvmsg); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_recvmsg_stat); diff --git a/include/trace/hooks/ipv4.h b/include/trace/hooks/ipv4.h new file mode 100644 index 000000000000..06fe06d675a4 --- /dev/null +++ b/include/trace/hooks/ipv4.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM ipv4 +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_IPV4_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_IPV4_H +#include +#include + +DECLARE_RESTRICTED_HOOK(android_rvh_tcp_sendmsg_locked, + TP_PROTO(struct sock *sk, int size), + TP_ARGS(sk, size), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_tcp_recvmsg, + TP_PROTO(struct sock *sk), + TP_ARGS(sk), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_udp_sendmsg, + TP_PROTO(struct sock *sk), + TP_ARGS(sk), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_udp_recvmsg, + TP_PROTO(struct sock *sk), + TP_ARGS(sk), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_tcp_recvmsg_stat, + TP_PROTO(struct sock *sk, int size), + TP_ARGS(sk, size), 1); + +#endif /* _TRACE_HOOK_IPV4_H */ +/* This part must be outside protection */ +#include diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 2384ac048bea..6cb60f7c916e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -280,6 +280,7 @@ #include #include +#include struct percpu_counter tcp_orphan_count; EXPORT_SYMBOL_GPL(tcp_orphan_count); @@ -1198,6 +1199,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) bool zc = false; long timeo; + trace_android_rvh_tcp_sendmsg_locked(sk, size); flags = msg->msg_flags; if (flags & MSG_ZEROCOPY && size && sock_flag(sk, SOCK_ZEROCOPY)) { @@ -2031,6 +2033,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, if (unlikely(flags & MSG_ERRQUEUE)) return inet_recv_error(sk, msg, len, addr_len); + trace_android_rvh_tcp_recvmsg(sk); if (sk_can_busy_loop(sk) && skb_queue_empty_lockless(&sk->sk_receive_queue) && (sk->sk_state == TCP_ESTABLISHED)) @@ -2243,6 +2246,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, break; } while (len > 0); + trace_android_rvh_tcp_recvmsg_stat(sk, copied); /* According to UNIX98, msg_name/msg_namelen are ignored * on connected socket. I was just happy when found this 8) --ANK */ diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 9d28b2778e8f..d8dbe8045c0a 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -116,6 +116,7 @@ #if IS_ENABLED(CONFIG_IPV6) #include #endif +#include struct udp_table udp_table __read_mostly; EXPORT_SYMBOL(udp_table); @@ -1049,6 +1050,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (msg->msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */ return -EOPNOTSUPP; + trace_android_rvh_udp_sendmsg(sk); getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; @@ -1801,6 +1803,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, skb = __skb_recv_udp(sk, flags, noblock, &off, &err); if (!skb) return err; + trace_android_rvh_udp_recvmsg(sk); ulen = udp_skb_len(skb); copied = len;