diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 31d3dca9b0ce..2a8543131fdf 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -249,3 +249,11 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_group); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_cpus_allowed_comm); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_setaffinity_early); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_task); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_enqueue_task); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_dequeue_task); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_enqueue_entity); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dequeue_entity); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_entity_tick); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_enqueue_task_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dequeue_task_fair); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index a7c72bc13858..1e9a0044bafb 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -254,8 +254,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_pick_next_entity, TP_ARGS(cfs_rq, curr, se), 1); DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_wakeup, - TP_PROTO(struct rq *rq, struct task_struct *p, bool *preempt, bool *nopreempt), - TP_ARGS(rq, p, preempt, nopreempt), 1); + TP_PROTO(struct rq *rq, struct task_struct *p, bool *preempt, bool *nopreempt, + int wake_flags, struct sched_entity *se, struct sched_entity *pse, + int next_buddy_marked, unsigned int granularity), + TP_ARGS(rq, p, preempt, nopreempt, wake_flags, se, pse, next_buddy_marked, + granularity), 1); DECLARE_HOOK(android_vh_do_wake_up_sync, TP_PROTO(struct wait_queue_head *wq_head, int *done), @@ -276,14 +279,17 @@ DECLARE_HOOK(android_vh_build_sched_domains, TP_PROTO(bool has_asym), TP_ARGS(has_asym)); DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_tick, - TP_PROTO(struct task_struct *p, unsigned long *ideal_runtime, bool *skip_preempt), - TP_ARGS(p, ideal_runtime, skip_preempt), 1); + TP_PROTO(struct task_struct *p, unsigned long *ideal_runtime, bool *skip_preempt, + unsigned long delta_exec, struct cfs_rq *cfs_rq, struct sched_entity *curr, + unsigned int granularity), + TP_ARGS(p, ideal_runtime, skip_preempt, delta_exec, cfs_rq, curr, granularity), 1); DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_wakeup_ignore, TP_PROTO(struct task_struct *p, bool *ignore), TP_ARGS(p, ignore), 1); DECLARE_RESTRICTED_HOOK(android_rvh_replace_next_task_fair, - TP_PROTO(struct rq *rq, struct task_struct **p, struct sched_entity **se, bool *repick, bool simple), - TP_ARGS(rq, p, se, repick, simple), 1); + TP_PROTO(struct rq *rq, struct task_struct **p, struct sched_entity **se, bool *repick, + bool simple, struct task_struct *prev), + TP_ARGS(rq, p, se, repick, simple, prev), 1); DECLARE_RESTRICTED_HOOK(android_rvh_util_est_update, TP_PROTO(struct cfs_rq *cfs_rq, struct task_struct *p, bool task_sleep, int *ret), @@ -304,6 +310,42 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_cpus_allowed_comm, DECLARE_HOOK(android_vh_sched_setaffinity_early, TP_PROTO(struct task_struct *p, const struct cpumask *new_mask, int *retval), TP_ARGS(p, new_mask, retval)); + +DECLARE_HOOK(android_vh_free_task, + TP_PROTO(struct task_struct *p), + TP_ARGS(p)); + +DECLARE_RESTRICTED_HOOK(android_rvh_after_enqueue_task, + TP_PROTO(struct rq *rq, struct task_struct *p), + TP_ARGS(rq, p), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_after_dequeue_task, + TP_PROTO(struct rq *rq, struct task_struct *p), + TP_ARGS(rq, p), 1); + +struct cfs_rq; +struct sched_entity; +struct rq_flags; +DECLARE_RESTRICTED_HOOK(android_rvh_enqueue_entity, + TP_PROTO(struct cfs_rq *cfs, struct sched_entity *se), + TP_ARGS(cfs, se), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_dequeue_entity, + TP_PROTO(struct cfs_rq *cfs, struct sched_entity *se), + TP_ARGS(cfs, se), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_entity_tick, + TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se), + TP_ARGS(cfs_rq, se), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_enqueue_task_fair, + TP_PROTO(struct rq *rq, struct task_struct *p, int flags), + TP_ARGS(rq, p, flags), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_dequeue_task_fair, + TP_PROTO(struct rq *rq, struct task_struct *p, int flags), + TP_ARGS(rq, p, flags), 1); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/fork.c b/kernel/fork.c index f6ad53d349a5..f2cdce8af2fd 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -109,6 +109,8 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include /* * Minimum number of threads to boot the kernel */ @@ -446,6 +448,7 @@ void free_task(struct task_struct *tsk) cpufreq_task_times_exit(tsk); scs_release(tsk); + trace_android_vh_free_task(tsk); #ifndef CONFIG_THREAD_INFO_IN_TASK /* * The task is finally done with both the stack and thread_info, diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 82504cd4e343..81382fd102d4 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1607,6 +1607,7 @@ static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags) uclamp_rq_inc(rq, p); trace_android_rvh_enqueue_task(rq, p, flags); p->sched_class->enqueue_task(rq, p, flags); + trace_android_rvh_after_enqueue_task(rq, p); } static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) @@ -1622,6 +1623,7 @@ static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) uclamp_rq_dec(rq, p); trace_android_rvh_dequeue_task(rq, p, flags); p->sched_class->dequeue_task(rq, p, flags); + trace_android_rvh_after_dequeue_task(rq, p); } void activate_task(struct rq *rq, struct task_struct *p, int flags) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2bfabde1cc06..a9721b74afe3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -582,6 +582,7 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) struct sched_entity *entry; bool leftmost = true; + trace_android_rvh_enqueue_entity(cfs_rq, se); /* * Find the right place in the rbtree: */ @@ -607,6 +608,7 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) { + trace_android_rvh_dequeue_entity(cfs_rq, se); rb_erase_cached(&se->run_node, &cfs_rq->tasks_timeline); } @@ -4387,7 +4389,8 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) ideal_runtime = sched_slice(cfs_rq, curr); delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; - trace_android_rvh_check_preempt_tick(current, &ideal_runtime, &skip_preempt); + trace_android_rvh_check_preempt_tick(current, &ideal_runtime, &skip_preempt, + delta_exec, cfs_rq, curr, sysctl_sched_min_granularity); if (skip_preempt) return; if (delta_exec > ideal_runtime) { @@ -4418,8 +4421,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) resched_curr(rq_of(cfs_rq)); } -static void -set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) +void set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) { /* 'current' is not kept within the tree. */ if (se->on_rq) { @@ -4450,6 +4452,8 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) se->prev_sum_exec_runtime = se->sum_exec_runtime; } +EXPORT_SYMBOL_GPL(set_next_entity); + static int wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); @@ -4576,6 +4580,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) if (cfs_rq->nr_running > 1) check_preempt_tick(cfs_rq, curr); + trace_android_rvh_entity_tick(cfs_rq, curr); } @@ -5555,6 +5560,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) flags = ENQUEUE_WAKEUP; } + trace_android_rvh_enqueue_task_fair(rq, p, flags); for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); @@ -5661,6 +5667,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) flags |= DEQUEUE_SLEEP; } + trace_android_rvh_dequeue_task_fair(rq, p, flags); for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); @@ -7079,7 +7086,8 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ find_matching_se(&se, &pse); update_curr(cfs_rq_of(se)); - trace_android_rvh_check_preempt_wakeup(rq, p, &preempt, &nopreempt); + trace_android_rvh_check_preempt_wakeup(rq, p, &preempt, &nopreempt, + wake_flags, se, pse, next_buddy_marked, sysctl_sched_wakeup_granularity); if (preempt) goto preempt; if (nopreempt) @@ -7176,8 +7184,7 @@ again: } while (cfs_rq); p = task_of(se); - trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, false); - + trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, false, prev); /* * Since we haven't yet done put_prev_entity and if the selected task * is a different task than we started out with, try and touch the @@ -7210,7 +7217,7 @@ simple: if (prev) put_prev_task(rq, prev); - trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, true); + trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, true, prev); if (repick) { for_each_sched_entity(se) set_next_entity(cfs_rq_of(se), se);