
these hooks are required by the following features: 1.For rwsem readers, currently only the latest reader will be recorded in sem->owner. We add hooks to record all readers which have acquired the lock, once there are UX threads blocked in the rwsem waiting list, these read_owners will be given high priority in scheduling. 2.For rwsem writer, when a writer acquires the lock, we check whether there are UX threads blocked in the rwsem wait list. If so, we give this writer a high priority in scheduling so that it can release the lock as soon as possible. Both of these features can optimize the priority inversion problem caused by rwsem and improve system responsiveness and performance. There is already a hook android_vh_rwsem_set_owner in rwsem_set_owner() to record writer owned, so the hook android_vh_record_rwsem_writer_owned in cherry pick is removed. Bug: 335408185 Change-Id: I82a6fbb6acd2ce05d049e686b61e34e4d3b39a5e Signed-off-by: zhujingpeng <zhujingpeng@vivo.com> [jstultz: Rebased and resolved minor conflict] Signed-off-by: John Stultz <jstultz@google.com> (cherry picked from commit 188c41744ddcccef6daf6dcd4d6a444dabdc2f94) (cherry picked from commit 869fc79d3abf1a1bcd97925fa3e0ee7188bb737c)
66 lines
2.1 KiB
C
Executable file
66 lines
2.1 KiB
C
Executable file
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM rwsem
|
|
#define TRACE_INCLUDE_PATH trace/hooks
|
|
#if !defined(_TRACE_HOOK_RWSEM_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_HOOK_RWSEM_H
|
|
#include <linux/tracepoint.h>
|
|
#include <trace/hooks/vendor_hooks.h>
|
|
/*
|
|
* Following tracepoints are not exported in tracefs and provide a
|
|
* mechanism for vendor modules to hook and extend functionality
|
|
*/
|
|
#ifdef __GENKSYMS__
|
|
struct rw_semaphore;
|
|
struct rwsem_waiter;
|
|
#else
|
|
/* struct rw_semaphore, struct rwsem_waiter */
|
|
#include <linux/rwsem.h>
|
|
#endif /* __GENKSYMS__ */
|
|
DECLARE_HOOK(android_vh_rwsem_init,
|
|
TP_PROTO(struct rw_semaphore *sem),
|
|
TP_ARGS(sem));
|
|
DECLARE_HOOK(android_vh_rwsem_wake,
|
|
TP_PROTO(struct rw_semaphore *sem),
|
|
TP_ARGS(sem));
|
|
DECLARE_HOOK(android_vh_rwsem_write_finished,
|
|
TP_PROTO(struct rw_semaphore *sem),
|
|
TP_ARGS(sem));
|
|
DECLARE_HOOK(android_vh_alter_rwsem_list_add,
|
|
TP_PROTO(struct rwsem_waiter *waiter,
|
|
struct rw_semaphore *sem,
|
|
bool *already_on_list),
|
|
TP_ARGS(waiter, sem, already_on_list));
|
|
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));
|
|
DECLARE_HOOK(android_vh_record_rwsem_reader_owned,
|
|
TP_PROTO(struct rw_semaphore *sem,
|
|
struct list_head *wlist),
|
|
TP_ARGS(sem, wlist));
|
|
DECLARE_HOOK(android_vh_clear_rwsem_reader_owned,
|
|
TP_PROTO(struct rw_semaphore *sem),
|
|
TP_ARGS(sem));
|
|
DECLARE_HOOK(android_vh_clear_rwsem_writer_owned,
|
|
TP_PROTO(struct rw_semaphore *sem),
|
|
TP_ARGS(sem));
|
|
/* macro versions of hooks are no longer required */
|
|
|
|
#endif /* _TRACE_HOOK_RWSEM_H */
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|