ANDROID: vendor_hooks: Add hooks for rwsem

we want to record tasks who will own sem, so we need to add some hook
in rwsem.c

Bug: 230829284
Change-Id: Ide66540aa38d6058d8aad5f94f4403be991078a4
Signed-off-by: Peifeng Li <lipeifeng@oppo.com>
This commit is contained in:
Peifeng LI 2022-04-29 16:32:33 +08:00 committed by Peifeng Li
parent 5558db2674
commit eb80a7e84f
3 changed files with 25 additions and 1 deletions

View File

@ -113,6 +113,11 @@ 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_rwsem_set_owner);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_set_reader_owned);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_mark_wake_readers);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_up_read_end);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_up_write_end);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_show_task);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shmem_alloc_page);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter);

View File

@ -29,7 +29,21 @@ DECLARE_HOOK(android_vh_alter_rwsem_list_add,
DECLARE_HOOK(android_vh_rwsem_wake_finish,
TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(sem));
DECLARE_HOOK(android_vh_rwsem_set_owner,
TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(sem));
DECLARE_HOOK(android_vh_rwsem_set_reader_owned,
TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(sem));
DECLARE_HOOK(android_vh_rwsem_up_write_end,
TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(sem));
DECLARE_HOOK(android_vh_rwsem_up_read_end,
TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(sem));
DECLARE_HOOK(android_vh_rwsem_mark_wake_readers,
TP_PROTO(struct rw_semaphore *sem, struct rwsem_waiter *waiter),
TP_ARGS(sem, waiter));
/* macro versions of hooks are no longer required */
#endif /* _TRACE_HOOK_RWSEM_H */

View File

@ -176,6 +176,7 @@
static inline void rwsem_set_owner(struct rw_semaphore *sem)
{
atomic_long_set(&sem->owner, (long)current);
trace_android_vh_rwsem_set_owner(sem);
}
static inline void rwsem_clear_owner(struct rw_semaphore *sem)
@ -213,6 +214,7 @@ static inline void __rwsem_set_reader_owned(struct rw_semaphore *sem,
static inline void rwsem_set_reader_owned(struct rw_semaphore *sem)
{
__rwsem_set_reader_owned(sem, current);
trace_android_vh_rwsem_set_reader_owned(sem);
}
/*
@ -496,6 +498,7 @@ static void rwsem_mark_wake(struct rw_semaphore *sem,
woken++;
list_move_tail(&waiter->list, &wlist);
trace_android_vh_rwsem_mark_wake_readers(sem, waiter);
/*
* Limit # of readers that can be woken up per wakeup call.
*/
@ -1460,6 +1463,7 @@ static inline void __up_read(struct rw_semaphore *sem)
clear_wr_nonspinnable(sem);
rwsem_wake(sem, tmp);
}
trace_android_vh_rwsem_up_read_end(sem);
}
/*
@ -1481,6 +1485,7 @@ static inline void __up_write(struct rw_semaphore *sem)
tmp = atomic_long_fetch_add_release(-RWSEM_WRITER_LOCKED, &sem->count);
if (unlikely(tmp & RWSEM_FLAG_WAITERS))
rwsem_wake(sem, tmp);
trace_android_vh_rwsem_up_write_end(sem);
}
/*