diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c1b8f6a5c0b7..c46ef08d2dd8 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -52,6 +52,14 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_set_priority); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_restore_priority); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_wait_finish); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rtmutex_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rtmutex_wait_finish); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_wait_finish); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mpam_set); diff --git a/include/trace/hooks/dtask.h b/include/trace/hooks/dtask.h index 02a18e203f9e..67f294c0cef5 100644 --- a/include/trace/hooks/dtask.h +++ b/include/trace/hooks/dtask.h @@ -8,7 +8,43 @@ #include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ + +struct mutex; +struct rt_mutex_base; +struct rw_semaphore; struct task_struct; + +DECLARE_HOOK(android_vh_mutex_wait_start, + TP_PROTO(struct mutex *lock), + TP_ARGS(lock)); +DECLARE_HOOK(android_vh_mutex_wait_finish, + TP_PROTO(struct mutex *lock), + TP_ARGS(lock)); + +DECLARE_HOOK(android_vh_rtmutex_wait_start, + TP_PROTO(struct rt_mutex_base *lock), + TP_ARGS(lock)); +DECLARE_HOOK(android_vh_rtmutex_wait_finish, + TP_PROTO(struct rt_mutex_base *lock), + TP_ARGS(lock)); + +DECLARE_HOOK(android_vh_rwsem_read_wait_start, + TP_PROTO(struct rw_semaphore *sem), + TP_ARGS(sem)); +DECLARE_HOOK(android_vh_rwsem_read_wait_finish, + TP_PROTO(struct rw_semaphore *sem), + TP_ARGS(sem)); +DECLARE_HOOK(android_vh_rwsem_write_wait_start, + TP_PROTO(struct rw_semaphore *sem), + TP_ARGS(sem)); +DECLARE_HOOK(android_vh_rwsem_write_wait_finish, + TP_PROTO(struct rw_semaphore *sem), + TP_ARGS(sem)); + DECLARE_HOOK(android_vh_sched_show_task, TP_PROTO(struct task_struct *task), TP_ARGS(task)); diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 3302e52f0c96..4abf0b96cf92 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -33,6 +33,9 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include + #ifndef CONFIG_PREEMPT_RT #include "mutex.h" @@ -627,6 +630,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas goto err_early_kill; } + trace_android_vh_mutex_wait_start(lock); set_current_state(state); trace_contention_begin(lock, LCB_F_MUTEX); for (;;) { @@ -687,6 +691,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas raw_spin_lock_irqsave(&lock->wait_lock, flags); acquired: __set_current_state(TASK_RUNNING); + trace_android_vh_mutex_wait_finish(lock); if (ww_ctx) { /* @@ -717,6 +722,7 @@ skip_wait: err: __set_current_state(TASK_RUNNING); + trace_android_vh_mutex_wait_finish(lock); __mutex_remove_waiter(lock, &waiter); err_early_kill: trace_contention_end(lock, ret); diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index c7de80ee1f9d..10acd1963daa 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -25,6 +25,7 @@ #include #include +#include #include "rtmutex_common.h" @@ -1612,6 +1613,7 @@ static int __sched rt_mutex_slowlock_block(struct rt_mutex_base *lock, struct task_struct *owner; int ret = 0; + trace_android_vh_rtmutex_wait_start(lock); for (;;) { /* Try to acquire the lock: */ if (try_to_take_rt_mutex(lock, current, waiter)) @@ -1645,6 +1647,7 @@ static int __sched rt_mutex_slowlock_block(struct rt_mutex_base *lock, set_current_state(state); } + trace_android_vh_rtmutex_wait_finish(lock); __set_current_state(TASK_RUNNING); return ret; } diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 2ddb827e3bea..38847be89725 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -31,6 +31,7 @@ #ifndef CONFIG_PREEMPT_RT #include "lock_events.h" +#include /* * The least significant 2 bits of the owner value has the following @@ -1067,6 +1068,7 @@ queue: trace_contention_begin(sem, LCB_F_READ); /* wait to be given the lock */ + trace_android_vh_rwsem_read_wait_start(sem); for (;;) { set_current_state(state); if (!smp_load_acquire(&waiter.task)) { @@ -1086,6 +1088,7 @@ queue: } __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_read_wait_finish(sem); lockevent_inc(rwsem_rlock); trace_contention_end(sem, 0); return sem; @@ -1093,6 +1096,7 @@ queue: out_nolock: rwsem_del_wake_waiter(sem, &waiter, &wake_q); __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_read_wait_finish(sem); lockevent_inc(rwsem_rlock_fail); trace_contention_end(sem, -EINTR); return ERR_PTR(-EINTR); @@ -1143,6 +1147,7 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state) } /* wait until we successfully acquire the lock */ + trace_android_vh_rwsem_write_wait_start(sem); set_current_state(state); trace_contention_begin(sem, LCB_F_WRITE); @@ -1180,6 +1185,7 @@ trylock_again: raw_spin_lock_irq(&sem->wait_lock); } __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_write_wait_finish(sem); raw_spin_unlock_irq(&sem->wait_lock); lockevent_inc(rwsem_wlock); trace_contention_end(sem, 0); @@ -1187,6 +1193,7 @@ trylock_again: out_nolock: __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_write_wait_finish(sem); raw_spin_lock_irq(&sem->wait_lock); rwsem_del_wake_waiter(sem, &waiter, &wake_q); lockevent_inc(rwsem_wlock_fail);