diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 348239e21e4f..0e0fea073344 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -65,6 +65,12 @@ 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_binder_wakeup_ilocked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_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_sched_show_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_exit); diff --git a/include/trace/hooks/dtask.h b/include/trace/hooks/dtask.h index 9051b2678e2d..8856bdceed06 100644 --- a/include/trace/hooks/dtask.h +++ b/include/trace/hooks/dtask.h @@ -11,6 +11,28 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ +struct mutex; +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)); + +struct rw_semaphore; +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)); + struct task_struct; DECLARE_HOOK(android_vh_sched_show_task, TP_PROTO(struct task_struct *task), diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 5e3585950ec8..97437e69acdd 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -39,6 +39,8 @@ # define MUTEX_WARN_ON(cond) #endif +#include + void __mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key) { @@ -640,6 +642,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); for (;;) { bool first; @@ -689,6 +692,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas raw_spin_lock(&lock->wait_lock); acquired: __set_current_state(TASK_RUNNING); + trace_android_vh_mutex_wait_finish(lock); if (ww_ctx) { /* @@ -717,6 +721,7 @@ skip_wait: err: __set_current_state(TASK_RUNNING); + trace_android_vh_mutex_wait_finish(lock); __mutex_remove_waiter(lock, &waiter); err_early_kill: raw_spin_unlock(&lock->wait_lock); diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 69aba4abe104..9f1c12388f00 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -30,6 +30,7 @@ #ifndef CONFIG_PREEMPT_RT #include "lock_events.h" +#include /* * The least significant 2 bits of the owner value has the following @@ -1015,6 +1016,7 @@ queue: wake_up_q(&wake_q); /* 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)) { @@ -1034,6 +1036,7 @@ queue: } __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_read_wait_finish(sem); lockevent_inc(rwsem_rlock); return sem; @@ -1041,6 +1044,7 @@ out_nolock: rwsem_del_waiter(sem, &waiter); raw_spin_unlock_irq(&sem->wait_lock); __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_read_wait_finish(sem); lockevent_inc(rwsem_rlock_fail); return ERR_PTR(-EINTR); } @@ -1108,6 +1112,7 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state) wait: /* wait until we successfully acquire the lock */ + trace_android_vh_rwsem_write_wait_start(sem); set_current_state(state); for (;;) { if (rwsem_try_write_lock(sem, &waiter)) { @@ -1146,12 +1151,14 @@ 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); return sem; out_nolock: __set_current_state(TASK_RUNNING); + trace_android_vh_rwsem_write_wait_finish(sem); raw_spin_lock_irq(&sem->wait_lock); rwsem_del_waiter(sem, &waiter); if (!list_empty(&sem->wait_list))