ANDROID: Add vendor_hooks to workaround CONFIG_TASK_DELAY_ACCT

CONFIG_TASK_DELAY_ACCT cannot be enabled since `struct task_struct`
is KMI frozen. Instead, use vendor hooks to allow delay accounting
to be implemented in a vendor module.

Bug: 310129610
Bug: 314931189

Change-Id: If814d7834889fe162aba3dd97e935289127ca3ae
Signed-off-by: Dongyun Liu <dongyun.liu@transsion.com>
(cherry picked from commit bb57557246d39dba8a66df7f43983fe1ec71bff6)
This commit is contained in:
Dongyun Liu
2023-12-06 14:12:07 +08:00
committed by Treehugger Robot
parent 3d3f9377b2
commit 896cff8734
5 changed files with 261 additions and 17 deletions

View File

@@ -76,7 +76,7 @@
#include <trace/hooks/typec.h>
#include <trace/hooks/sound.h>
#include <trace/hooks/user.h>
#include <trace/hooks/delayacct.h>
/*
* Export tracepoints that act as a bare tracehook (ie: have no trace event
* associated with them) to allow external modules to probe them.
@@ -375,3 +375,17 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_free_buf);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_isolate_freepages);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_thermal_stats);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ptep_clear_flush_young);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_set_flag);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_clear_flag);
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_is_task_waiting_on_io);
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);

View File

@@ -170,35 +170,109 @@ static inline void delayacct_thrashing_end(void)
}
#else
extern void _trace_android_vh_delayacct_set_flag(struct task_struct *p, int flag);
extern void _trace_android_vh_delayacct_clear_flag(struct task_struct *p, int flag);
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_is_task_waiting_on_io(struct task_struct *p, int *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(void);
extern void _trace_android_vh_delayacct_thrashing_end(void);
extern void set_delayacct_enabled(bool enabled);
extern bool get_delayacct_enabled(void);
static inline void delayacct_set_flag(struct task_struct *p, int flag)
{}
{
if (get_delayacct_enabled())
_trace_android_vh_delayacct_set_flag(p, flag);
}
static inline void delayacct_clear_flag(struct task_struct *p, int flag)
{}
{
if (get_delayacct_enabled())
_trace_android_vh_delayacct_clear_flag(p, flag);
}
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; }
{
int ret = 0;
if (get_delayacct_enabled())
_trace_android_vh_delayacct_is_task_waiting_on_io(p, &ret);
return ret;
}
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(void)
{}
{
if (get_delayacct_enabled())
_trace_android_vh_delayacct_thrashing_start();
}
static inline void delayacct_thrashing_end(void)
{}
{
if (get_delayacct_enabled())
_trace_android_vh_delayacct_thrashing_end();
}
#endif /* CONFIG_TASK_DELAY_ACCT */

View File

@@ -0,0 +1,67 @@
/* 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 <trace/hooks/vendor_hooks.h>
struct task_struct;
struct taskstats;
DECLARE_HOOK(android_vh_delayacct_set_flag,
TP_PROTO(struct task_struct *p, int flag),
TP_ARGS(p, flag));
DECLARE_HOOK(android_vh_delayacct_clear_flag,
TP_PROTO(struct task_struct *p, int flag),
TP_ARGS(p, flag));
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_is_task_waiting_on_io,
TP_PROTO(struct task_struct *tsk, int *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(void *unused),
TP_ARGS(unused));
DECLARE_HOOK(android_vh_delayacct_thrashing_end,
TP_PROTO(void *unused),
TP_ARGS(unused));
#endif /* _TRACE_HOOK_DELAYACCT_H */
/* This part must be outside protection */
#include <trace/define_trace.h>
#endif /* PROTECT_TRACE_INCLUDE_PATH */

View File

@@ -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
@@ -97,7 +97,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

View File

@@ -14,6 +14,8 @@
#include <linux/delayacct.h>
#include <linux/module.h>
#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;
@@ -210,3 +212,91 @@ void __delayacct_thrashing_end(void)
&current->delays->thrashing_delay,
&current->delays->thrashing_count);
}
#else
#include <trace/hooks/delayacct.h>
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_vh_delayacct_set_flag(struct task_struct *p, int flag)
{
trace_android_vh_delayacct_set_flag(p, flag);
}
void _trace_android_vh_delayacct_clear_flag(struct task_struct *p, int flag)
{
trace_android_vh_delayacct_clear_flag(p, flag);
}
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_is_task_waiting_on_io(struct task_struct *p, int *ret)
{
trace_android_vh_delayacct_is_task_waiting_on_io(p, 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(void)
{
trace_android_vh_delayacct_thrashing_start(NULL);
}
void _trace_android_vh_delayacct_thrashing_end(void)
{
trace_android_vh_delayacct_thrashing_end(NULL);
}
#endif