diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index a11e37bcfb88..3d5f85393bd3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -70,6 +70,8 @@ #include #include #include +#include + /* * Export tracepoints that act as a bare tracehook (ie: have no trace event * associated with them) to allow external modules to probe them. @@ -380,3 +382,21 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_looper_exited); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_spawn_new_thread); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_has_special_work_ilocked); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_detect_low_async_space_locked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_init); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_tsk_init); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_delayacct_tsk_free); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_add_tsk); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_blkio_ticks); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_freepages_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_freepages_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_thrashing_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_thrashing_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_swapin_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_swapin_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_end); + diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 0da97dba9ef8..36a162940211 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h @@ -216,43 +216,141 @@ static inline void delayacct_wpcopy_end(void) } #else +extern void _trace_android_rvh_delayacct_init(void); +extern void _trace_android_rvh_delayacct_tsk_init(struct task_struct *tsk); +extern void _trace_android_rvh_delayacct_tsk_free(struct task_struct *tsk); +extern void _trace_android_vh_delayacct_blkio_start(void); +extern void _trace_android_vh_delayacct_blkio_end(struct task_struct *p); +extern void _trace_android_vh_delayacct_add_tsk(struct taskstats *d, + struct task_struct *tsk, + int *ret); +extern void _trace_android_vh_delayacct_blkio_ticks(struct task_struct *tsk, __u64 *ret); +extern void _trace_android_vh_delayacct_freepages_start(void); +extern void _trace_android_vh_delayacct_freepages_end(void); +extern void _trace_android_vh_delayacct_thrashing_start(bool *in_thrashing); +extern void _trace_android_vh_delayacct_thrashing_end(bool *in_thrashing); +extern void _trace_android_vh_delayacct_swapin_start(void); +extern void _trace_android_vh_delayacct_swapin_end(void); +extern void _trace_android_vh_delayacct_compact_start(void); +extern void _trace_android_vh_delayacct_compact_end(void); +extern void _trace_android_vh_delayacct_wpcopy_start(void); +extern void _trace_android_vh_delayacct_wpcopy_end(void); +extern void set_delayacct_enabled(bool enabled); +extern bool get_delayacct_enabled(void); + static inline void delayacct_init(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_init(); +} + static inline void delayacct_tsk_init(struct task_struct *tsk) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_tsk_init(tsk); +} + static inline void delayacct_tsk_free(struct task_struct *tsk) -{} +{ + if (get_delayacct_enabled()) + _trace_android_rvh_delayacct_tsk_free(tsk); +} + static inline void delayacct_blkio_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_start(); +} + static inline void delayacct_blkio_end(struct task_struct *p) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_end(p); +} + static inline int delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) -{ return 0; } +{ + int ret = 0; + + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_add_tsk(d, tsk, &ret); + + return ret; +} + static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk) -{ return 0; } +{ + __u64 ret = 0; + + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_blkio_ticks(tsk, &ret); + + return ret; +} + static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) { return 0; } + static inline void delayacct_freepages_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_freepages_start(); +} + static inline void delayacct_freepages_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_freepages_end(); +} + static inline void delayacct_thrashing_start(bool *in_thrashing) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_thrashing_start(in_thrashing); +} + static inline void delayacct_thrashing_end(bool *in_thrashing) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_thrashing_end(in_thrashing); +} + static inline void delayacct_swapin_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_swapin_start(); +} + static inline void delayacct_swapin_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_swapin_end(); +} + static inline void delayacct_compact_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_compact_start(); +} + static inline void delayacct_compact_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_compact_end(); +} + static inline void delayacct_wpcopy_start(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_wpcopy_start(); +} + static inline void delayacct_wpcopy_end(void) -{} +{ + if (get_delayacct_enabled()) + _trace_android_vh_delayacct_wpcopy_end(); +} #endif /* CONFIG_TASK_DELAY_ACCT */ diff --git a/include/trace/hooks/delayacct.h b/include/trace/hooks/delayacct.h new file mode 100644 index 000000000000..794bbc7e0e74 --- /dev/null +++ b/include/trace/hooks/delayacct.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifdef PROTECT_TRACE_INCLUDE_PATH +#undef PROTECT_TRACE_INCLUDE_PATH + + +#else /* PROTECT_TRACE_INCLUDE_PATH */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM delayacct + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_DELAYACCT_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_DELAYACCT_H + +#include + +struct task_struct; +struct taskstats; +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_init, + TP_PROTO(void *unused), + TP_ARGS(unused), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_tsk_init, + TP_PROTO(struct task_struct *tsk), + TP_ARGS(tsk), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_delayacct_tsk_free, + TP_PROTO(struct task_struct *tsk), + TP_ARGS(tsk), 1); +DECLARE_HOOK(android_vh_delayacct_blkio_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_blkio_end, + TP_PROTO(struct task_struct *p), + TP_ARGS(p)); +DECLARE_HOOK(android_vh_delayacct_add_tsk, + TP_PROTO(struct taskstats *d, struct task_struct *tsk, int *ret), + TP_ARGS(d, tsk, ret)); +DECLARE_HOOK(android_vh_delayacct_blkio_ticks, + TP_PROTO(struct task_struct *tsk, __u64 *ret), + TP_ARGS(tsk, ret)); +DECLARE_HOOK(android_vh_delayacct_freepages_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_freepages_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_thrashing_start, + TP_PROTO(bool *in_thrashing), + TP_ARGS(in_thrashing)); +DECLARE_HOOK(android_vh_delayacct_thrashing_end, + TP_PROTO(bool *in_thrashing), + TP_ARGS(in_thrashing)); +DECLARE_HOOK(android_vh_delayacct_swapin_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_swapin_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_compact_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_compact_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_wpcopy_start, + TP_PROTO(void *unused), + TP_ARGS(unused)); +DECLARE_HOOK(android_vh_delayacct_wpcopy_end, + TP_PROTO(void *unused), + TP_ARGS(unused)); + +#endif /* _TRACE_HOOK_DELAYACCT_H */ +/* This part must be outside protection */ +#include + +#endif /* PROTECT_TRACE_INCLUDE_PATH */ diff --git a/kernel/Makefile b/kernel/Makefile index ebc692242b68..df8d43045263 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -10,7 +10,7 @@ obj-y = fork.o exec_domain.o panic.o \ extable.o params.o \ kthread.o sys_ni.o nsproxy.o \ notifier.o ksysfs.o cred.o reboot.o \ - async.o range.o smpboot.o ucount.o regset.o + async.o range.o smpboot.o ucount.o regset.o delayacct.o obj-$(CONFIG_USERMODE_DRIVER) += usermode_driver.o obj-$(CONFIG_MODULES) += kmod.o @@ -94,7 +94,6 @@ obj-$(CONFIG_HARDLOCKUP_DETECTOR_PERF) += watchdog_hld.o obj-$(CONFIG_SECCOMP) += seccomp.o obj-$(CONFIG_RELAY) += relay.o obj-$(CONFIG_SYSCTL) += utsname_sysctl.o -obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o obj-$(CONFIG_TRACEPOINTS) += tracepoint.o obj-$(CONFIG_LATENCYTOP) += latencytop.o diff --git a/kernel/delayacct.c b/kernel/delayacct.c index e39cb696cfbd..9136f70c45ea 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c @@ -14,6 +14,8 @@ #include #include +#ifdef CONFIG_TASK_DELAY_ACCT + DEFINE_STATIC_KEY_FALSE(delayacct_key); int delayacct_on __read_mostly; /* Delay accounting turned on/off */ struct kmem_cache *delayacct_cache; @@ -274,3 +276,105 @@ void __delayacct_wpcopy_end(void) ¤t->delays->wpcopy_delay, ¤t->delays->wpcopy_count); } +#else +#include + +int delayacct_enabled __read_mostly; /* Delay accounting turned on/off */ +bool get_delayacct_enabled(void) +{ + return delayacct_enabled; +} + +void set_delayacct_enabled(bool enabled) +{ + delayacct_enabled = enabled; +} +EXPORT_SYMBOL_GPL(set_delayacct_enabled); + +void _trace_android_rvh_delayacct_init(void) +{ + trace_android_rvh_delayacct_init(NULL); +} + +void _trace_android_rvh_delayacct_tsk_init(struct task_struct *tsk) +{ + trace_android_rvh_delayacct_tsk_init(tsk); +} + +void _trace_android_rvh_delayacct_tsk_free(struct task_struct *tsk) +{ + trace_android_rvh_delayacct_tsk_free(tsk); +} + +void _trace_android_vh_delayacct_blkio_start(void) +{ + trace_android_vh_delayacct_blkio_start(NULL); +} + +void _trace_android_vh_delayacct_blkio_end(struct task_struct *p) +{ + trace_android_vh_delayacct_blkio_end(p); +} + +void _trace_android_vh_delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk, int *ret) +{ + trace_android_vh_delayacct_add_tsk(d, tsk, ret); +} + +void _trace_android_vh_delayacct_blkio_ticks(struct task_struct *tsk, __u64 *ret) +{ + trace_android_vh_delayacct_blkio_ticks(tsk, ret); +} + +void _trace_android_vh_delayacct_freepages_start(void) +{ + trace_android_vh_delayacct_freepages_start(NULL); +} + +void _trace_android_vh_delayacct_freepages_end(void) +{ + trace_android_vh_delayacct_freepages_end(NULL); +} + +void _trace_android_vh_delayacct_thrashing_start(bool *in_thrashing) +{ + trace_android_vh_delayacct_thrashing_start(in_thrashing); +} + +void _trace_android_vh_delayacct_thrashing_end(bool *in_thrashing) +{ + trace_android_vh_delayacct_thrashing_end(in_thrashing); +} + +void _trace_android_vh_delayacct_swapin_start(void) +{ + trace_android_vh_delayacct_swapin_start(NULL); +} + +void _trace_android_vh_delayacct_swapin_end(void) +{ + trace_android_vh_delayacct_swapin_end(NULL); +} + +void _trace_android_vh_delayacct_compact_start(void) +{ + trace_android_vh_delayacct_compact_start(NULL); +} + +void _trace_android_vh_delayacct_compact_end(void) +{ + trace_android_vh_delayacct_compact_end(NULL); +} + +void _trace_android_vh_delayacct_wpcopy_start(void) +{ + trace_android_vh_delayacct_wpcopy_start(NULL); +} + +void _trace_android_vh_delayacct_wpcopy_end(void) +{ + trace_android_vh_delayacct_wpcopy_end(NULL); +} + +#endif +