From 0ed7424fa0cc7253718f29972af0a7362bc4a961 Mon Sep 17 00:00:00 2001 From: Vignesh Saravanaperumal Date: Thu, 8 Jul 2021 12:09:18 -0700 Subject: [PATCH] ANDROID: GKI: net: add vendor hooks for 'struct sock' lifecycle Some vendors want to add a field when a 'sruct sock' is added so give a hook to handle this. Any memory allocated when trace_android_rvh_sk_alloc() is called needs to be freed when trace_android_rvh_sk_free() is called. Note, if trace_android_rvh_sk_alloc() fails, be sure to be able to handle this in trace_android_rvh_sk_free(), but that should not be an issue as that needs to be addressed in vendor code that runs for 'struct sock' objects that have been created before the vendor code is loaded no matter what. Bug: 171013716 Signed-off-by: Vignesh Saravanaperumal Change-Id: I108a2f31d2dcc228f46159816deee6235afafbbd --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/net.h | 5 +++++ net/core/sock.c | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 794b556cfd7f..6ebc82a0ff43 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -91,6 +91,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_alloc); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale); diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h index b2f68a1d8987..6715aa4eb668 100644 --- a/include/trace/hooks/net.h +++ b/include/trace/hooks/net.h @@ -19,10 +19,15 @@ DECLARE_HOOK(android_vh_kfree_skb, TP_PROTO(struct sk_buff *skb), TP_ARGS(skb)); struct nf_conn; +struct sock; DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_alloc, TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_free, TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_sk_alloc, + TP_PROTO(struct sock *sock), TP_ARGS(sock), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_sk_free, + TP_PROTO(struct sock *sock), TP_ARGS(sock), 1); /* macro versions of hooks are no longer required */ diff --git a/net/core/sock.c b/net/core/sock.c index e640a68f34ba..ffc1e1e8ec73 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -136,6 +136,7 @@ #include #include +#include #include #include @@ -1678,6 +1679,8 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority, if (security_sk_alloc(sk, family, priority)) goto out_free; + trace_android_rvh_sk_alloc(sk); + if (!try_module_get(prot->owner)) goto out_free_sec; sk_tx_queue_clear(sk); @@ -1687,6 +1690,7 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority, out_free_sec: security_sk_free(sk); + trace_android_rvh_sk_free(sk); out_free: if (slab != NULL) kmem_cache_free(slab, sk); @@ -1706,6 +1710,7 @@ static void sk_prot_free(struct proto *prot, struct sock *sk) cgroup_sk_free(&sk->sk_cgrp_data); mem_cgroup_sk_free(sk); security_sk_free(sk); + trace_android_rvh_sk_free(sk); if (slab != NULL) kmem_cache_free(slab, sk); else