From 58f9c9a064edfc4562cac598668f7ab306ed9632 Mon Sep 17 00:00:00 2001 From: JianMin Liu Date: Tue, 11 Aug 2020 15:24:06 +0800 Subject: [PATCH] ANDROID: futex: Add vendor hook for wait queue Add the hook for the waiter list of futex to allow vendor perform wait queue enhancement Bug: 381487678 Signed-off-by: JianMin Liu Signed-off-by: Guan-Wun Chen Change-Id: I68218b89c35b23aa5529099bb0bbbd031bdeafef --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/futex.h | 22 ++++++++++++++++++++++ kernel/futex/core.c | 6 +++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 include/trace/hooks/futex.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 524fe476546b..29ecd67341c3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -46,6 +46,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -164,3 +165,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_unlock_slowpath); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_hibernation_swap); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_cpu_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_hib_resume_bdev); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_futex_plist_add); diff --git a/include/trace/hooks/futex.h b/include/trace/hooks/futex.h new file mode 100644 index 000000000000..01d3e5bac02a --- /dev/null +++ b/include/trace/hooks/futex.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM futex +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH trace/hooks +#if !defined(_TRACE_HOOK_FUTEX_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_FUTEX_H +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ +struct plist_node; +struct plist_head; +DECLARE_HOOK(android_vh_alter_futex_plist_add, + TP_PROTO(struct plist_node *node, + struct plist_head *head, + bool *already_on_hb), + TP_ARGS(node, head, already_on_hb)); +#endif /* _TRACE_HOOK_FUTEX_H */ +/* This part must be outside protection */ +#include diff --git a/kernel/futex/core.c b/kernel/futex/core.c index 136768ae2637..dcdbcb13437c 100644 --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -42,6 +42,7 @@ #include "futex.h" #include "../locking/rtmutex_common.h" +#include /* * The base of the bucket array and its size are always used together @@ -557,6 +558,7 @@ void futex_q_unlock(struct futex_hash_bucket *hb) void __futex_queue(struct futex_q *q, struct futex_hash_bucket *hb) { int prio; + bool already_on_hb = false; /* * The priority used to register this element is @@ -569,7 +571,9 @@ void __futex_queue(struct futex_q *q, struct futex_hash_bucket *hb) prio = min(current->normal_prio, MAX_RT_PRIO); plist_node_init(&q->list, prio); - plist_add(&q->list, &hb->chain); + trace_android_vh_alter_futex_plist_add(&q->list, &hb->chain, &already_on_hb); + if (!already_on_hb) + plist_add(&q->list, &hb->chain); q->task = current; }