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_read_wait_finish);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_start); 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_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_sched_show_task);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shmem_alloc_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shmem_alloc_page);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter); 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, DECLARE_HOOK(android_vh_rwsem_wake_finish,
TP_PROTO(struct rw_semaphore *sem), TP_PROTO(struct rw_semaphore *sem),
TP_ARGS(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 */ /* macro versions of hooks are no longer required */
#endif /* _TRACE_HOOK_RWSEM_H */ #endif /* _TRACE_HOOK_RWSEM_H */

View File

@@ -176,6 +176,7 @@
static inline void rwsem_set_owner(struct rw_semaphore *sem) static inline void rwsem_set_owner(struct rw_semaphore *sem)
{ {
atomic_long_set(&sem->owner, (long)current); atomic_long_set(&sem->owner, (long)current);
trace_android_vh_rwsem_set_owner(sem);
} }
static inline void rwsem_clear_owner(struct rw_semaphore *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) static inline void rwsem_set_reader_owned(struct rw_semaphore *sem)
{ {
__rwsem_set_reader_owned(sem, current); __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++; woken++;
list_move_tail(&waiter->list, &wlist); 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. * 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); clear_wr_nonspinnable(sem);
rwsem_wake(sem, tmp); 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); tmp = atomic_long_fetch_add_release(-RWSEM_WRITER_LOCKED, &sem->count);
if (unlikely(tmp & RWSEM_FLAG_WAITERS)) if (unlikely(tmp & RWSEM_FLAG_WAITERS))
rwsem_wake(sem, tmp); rwsem_wake(sem, tmp);
trace_android_vh_rwsem_up_write_end(sem);
} }
/* /*