diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 33e8b34f7cdc..d508cc353fc3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -193,3 +193,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_modify_src_caps); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_log); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_gfp_zone_flags); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_readahead_gfp_mask); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_mutex_list_add); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_unlock_slowpath); diff --git a/include/trace/hooks/dtask.h b/include/trace/hooks/dtask.h index a6b8ac34f281..f92996271a1f 100644 --- a/include/trace/hooks/dtask.h +++ b/include/trace/hooks/dtask.h @@ -59,6 +59,18 @@ DECLARE_HOOK(android_vh_record_rwsem_lock_starttime, DECLARE_HOOK(android_vh_record_pcpu_rwsem_starttime, TP_PROTO(struct task_struct *tsk, unsigned long settime_jiffies), TP_ARGS(tsk, settime_jiffies)); + +struct mutex_waiter; +DECLARE_HOOK(android_vh_alter_mutex_list_add, + TP_PROTO(struct mutex *lock, + struct mutex_waiter *waiter, + struct list_head *list, + bool *already_on_list), + TP_ARGS(lock, waiter, list, already_on_list)); +DECLARE_HOOK(android_vh_mutex_unlock_slowpath, + TP_PROTO(struct mutex *lock), + TP_ARGS(lock)); + #endif /* _TRACE_HOOK_DTASK_H */ /* This part must be outside protection */ diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 52f66448cdac..622dcf7a26b0 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -210,9 +210,12 @@ static void __mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter, struct list_head *list) { + bool already_on_list = false; debug_mutex_add_waiter(lock, waiter, current); - list_add_tail(&waiter->list, list); + trace_android_vh_alter_mutex_list_add(lock, waiter, list, &already_on_list); + if (!already_on_list) + list_add_tail(&waiter->list, list); if (__mutex_waiter_is_first(lock, waiter)) __mutex_set_flag(lock, MUTEX_FLAG_WAITERS); } @@ -957,6 +960,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne if (owner & MUTEX_FLAG_HANDOFF) __mutex_handoff(lock, next); + trace_android_vh_mutex_unlock_slowpath(lock); raw_spin_unlock(&lock->wait_lock); wake_up_q(&wake_q);