ANDROID: sched: Add vendor hooks for sched.

Add vendor hooks in scheduler to support OEM's value adds.

Bug: 183674818
Signed-off-by: lijianzhong <lijianzhong@xiaomi.com>
Change-Id: I8415958749948b3702e411f835c227ad4f8d8e92
Signed-off-by: Shaleen Agrawal <shalagra@codeaurora.org>
This commit is contained in:
lijianzhong
2021-03-24 19:53:17 +08:00
committed by Todd Kjos
parent 3298ae9895
commit bc70904edc
5 changed files with 76 additions and 14 deletions

View File

@@ -166,3 +166,11 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpufreq_transition); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpufreq_transition);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_balance_anon_file_reclaim); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_balance_anon_file_reclaim);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_show_max_freq); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_show_max_freq);
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);

View File

@@ -234,16 +234,22 @@ DECLARE_HOOK(android_vh_em_cpu_energy,
DECLARE_HOOK(android_vh_build_sched_domains, DECLARE_HOOK(android_vh_build_sched_domains,
TP_PROTO(bool has_asym), TP_PROTO(bool has_asym),
TP_ARGS(has_asym)); TP_ARGS(has_asym));
DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_tick, DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_tick,
TP_PROTO(struct task_struct *p, unsigned long *ideal_runtime, bool *skip_preempt), TP_PROTO(struct task_struct *p, unsigned long *ideal_runtime, bool *skip_preempt,
TP_ARGS(p, ideal_runtime, skip_preempt), 1); 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, DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_wakeup_ignore,
TP_PROTO(struct task_struct *p, bool *ignore), TP_PROTO(struct task_struct *p, bool *ignore),
TP_ARGS(p, ignore), 1); TP_ARGS(p, ignore), 1);
DECLARE_RESTRICTED_HOOK(android_rvh_replace_next_task_fair, DECLARE_RESTRICTED_HOOK(android_rvh_replace_next_task_fair,
TP_PROTO(struct rq *rq, struct task_struct **p, struct sched_entity **se, TP_PROTO(struct rq *rq, struct task_struct **p, struct sched_entity **se, bool *repick,
bool *repick, bool simple), bool simple, struct task_struct *prev),
TP_ARGS(rq, p, se, repick, simple), 1); TP_ARGS(rq, p, se, repick, simple, prev), 1);
DECLARE_RESTRICTED_HOOK(android_rvh_sched_balance_rt, DECLARE_RESTRICTED_HOOK(android_rvh_sched_balance_rt,
TP_PROTO(struct rq *rq, struct task_struct *p, int *done), TP_PROTO(struct rq *rq, struct task_struct *p, int *done),
TP_ARGS(rq, p, done), 1); TP_ARGS(rq, p, done), 1);
@@ -255,8 +261,46 @@ DECLARE_RESTRICTED_HOOK(android_rvh_pick_next_entity,
TP_ARGS(cfs_rq, curr, se), 1); TP_ARGS(cfs_rq, curr, se), 1);
DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_wakeup, DECLARE_RESTRICTED_HOOK(android_rvh_check_preempt_wakeup,
TP_PROTO(struct rq *rq, struct task_struct *p, bool *preempt, bool *nopreempt), TP_PROTO(struct rq *rq, struct task_struct *p, bool *preempt, bool *nopreempt,
TP_ARGS(rq, p, preempt, nopreempt), 1); 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_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);
#endif /* _TRACE_HOOK_SCHED_H */ #endif /* _TRACE_HOOK_SCHED_H */
/* This part must be outside protection */ /* This part must be outside protection */

View File

@@ -110,6 +110,8 @@
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <trace/events/task.h> #include <trace/events/task.h>
#undef CREATE_TRACE_POINTS
#include <trace/hooks/sched.h>
/* /*
* Minimum number of threads to boot the kernel * Minimum number of threads to boot the kernel
*/ */
@@ -454,6 +456,7 @@ void free_task(struct task_struct *tsk)
release_user_cpus_ptr(tsk); release_user_cpus_ptr(tsk);
scs_release(tsk); scs_release(tsk);
trace_android_vh_free_task(tsk);
#ifndef CONFIG_THREAD_INFO_IN_TASK #ifndef CONFIG_THREAD_INFO_IN_TASK
/* /*
* The task is finally done with both the stack and thread_info, * The task is finally done with both the stack and thread_info,

View File

@@ -1987,6 +1987,7 @@ static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags)
uclamp_rq_inc(rq, p); uclamp_rq_inc(rq, p);
trace_android_rvh_enqueue_task(rq, p, flags); trace_android_rvh_enqueue_task(rq, p, flags);
p->sched_class->enqueue_task(rq, p, flags); p->sched_class->enqueue_task(rq, p, flags);
trace_android_rvh_after_enqueue_task(rq, p);
if (sched_core_enabled(rq)) if (sched_core_enabled(rq))
sched_core_enqueue(rq, p); sched_core_enqueue(rq, p);
@@ -2008,6 +2009,7 @@ static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags)
uclamp_rq_dec(rq, p); uclamp_rq_dec(rq, p);
trace_android_rvh_dequeue_task(rq, p, flags); trace_android_rvh_dequeue_task(rq, p, flags);
p->sched_class->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) void activate_task(struct rq *rq, struct task_struct *p, int flags)

View File

@@ -579,11 +579,13 @@ static inline bool __entity_less(struct rb_node *a, const struct rb_node *b)
*/ */
static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
{ {
trace_android_rvh_enqueue_entity(cfs_rq, se);
rb_add_cached(&se->run_node, &cfs_rq->tasks_timeline, __entity_less); rb_add_cached(&se->run_node, &cfs_rq->tasks_timeline, __entity_less);
} }
static void __dequeue_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); rb_erase_cached(&se->run_node, &cfs_rq->tasks_timeline);
} }
@@ -4455,7 +4457,8 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
ideal_runtime = sched_slice(cfs_rq, curr); ideal_runtime = sched_slice(cfs_rq, curr);
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; 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) if (skip_preempt)
return; return;
if (delta_exec > ideal_runtime) { if (delta_exec > ideal_runtime) {
@@ -4486,8 +4489,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
resched_curr(rq_of(cfs_rq)); resched_curr(rq_of(cfs_rq));
} }
static void static void set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
{ {
clear_buddies(cfs_rq, se); clear_buddies(cfs_rq, se);
@@ -4644,6 +4646,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued)
if (cfs_rq->nr_running > 1) if (cfs_rq->nr_running > 1)
check_preempt_tick(cfs_rq, curr); check_preempt_tick(cfs_rq, curr);
trace_android_rvh_entity_tick(cfs_rq, curr);
} }
@@ -5651,6 +5654,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
flags = ENQUEUE_WAKEUP; flags = ENQUEUE_WAKEUP;
} }
trace_android_rvh_enqueue_task_fair(rq, p, flags);
for_each_sched_entity(se) { for_each_sched_entity(se) {
cfs_rq = cfs_rq_of(se); cfs_rq = cfs_rq_of(se);
@@ -5763,6 +5767,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
flags |= DEQUEUE_SLEEP; flags |= DEQUEUE_SLEEP;
} }
trace_android_rvh_dequeue_task_fair(rq, p, flags);
for_each_sched_entity(se) { for_each_sched_entity(se) {
cfs_rq = cfs_rq_of(se); cfs_rq = cfs_rq_of(se);
@@ -7281,7 +7286,8 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_
return; return;
update_curr(cfs_rq_of(se)); update_curr(cfs_rq_of(se));
trace_android_rvh_check_preempt_wakeup(rq, p, &preempt, &ignore); trace_android_rvh_check_preempt_wakeup(rq, p, &preempt, &ignore,
wake_flags, se, pse, next_buddy_marked, sysctl_sched_wakeup_granularity);
if (preempt) if (preempt)
goto preempt; goto preempt;
if (ignore) if (ignore)
@@ -7411,8 +7417,7 @@ again:
} while (cfs_rq); } while (cfs_rq);
p = task_of(se); 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 * 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 * is a different task than we started out with, try and touch the
@@ -7445,7 +7450,7 @@ simple:
if (prev) if (prev)
put_prev_task(rq, 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) if (repick)
goto done; goto done;