From 53e8099784435152ed3d2a60190e265ab0e436eb Mon Sep 17 00:00:00 2001 From: xieliujie Date: Thu, 11 Mar 2021 15:29:38 +0800 Subject: [PATCH] ANDROID: vendor_hooks: Add hooks for scheduler Add hooks to support oem's scheduler feature. Bug: 182441701 Signed-off-by: xieliujie Change-Id: I31023844b20923bed1ca216831e7a2431e9ab0c9 --- drivers/android/vendor_hooks.c | 4 ++++ include/linux/sched.h | 2 +- include/trace/hooks/sched.h | 17 +++++++++++++++-- kernel/sched/fair.c | 16 +++++++++++++++- kernel/sched/topology.c | 1 + 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 88b46f8172a5..695fecabefdb 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -181,6 +181,10 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_uclamp_eff_get); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpufreq_transition); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_syscall_prctl_finished); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup_ignore); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_replace_next_task_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_build_sched_domains); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_mutex_list_add); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_unlock_slowpath); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_wake_finish); diff --git a/include/linux/sched.h b/include/linux/sched.h index f40e26b230e0..a4d6cb3c12ca 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1358,7 +1358,7 @@ struct task_struct { struct callback_head mce_kill_me; #endif ANDROID_VENDOR_DATA_ARRAY(1, 64); - ANDROID_OEM_DATA_ARRAY(1, 2); + ANDROID_OEM_DATA_ARRAY(1, 6); /* * New fields for task_struct should be added above here, so that diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index bb53484fb079..bdf8290f33db 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -190,8 +190,8 @@ DECLARE_RESTRICTED_HOOK(android_rvh_account_irq, struct sched_entity; DECLARE_RESTRICTED_HOOK(android_rvh_place_entity, - TP_PROTO(struct sched_entity *se, u64 *vruntime), - TP_ARGS(se, vruntime), 1); + TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial, u64 vruntime), + TP_ARGS(cfs_rq, se, initial, vruntime), 1); DECLARE_RESTRICTED_HOOK(android_rvh_build_perf_domains, TP_PROTO(bool *eas_check), @@ -275,6 +275,19 @@ DECLARE_RESTRICTED_HOOK(android_rvh_uclamp_eff_get, struct uclamp_se *uclamp_max, struct uclamp_se *uclamp_eff, int *ret), TP_ARGS(p, clamp_id, uclamp_max, uclamp_eff, ret), 1); +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); +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); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 17eec77acbfe..8dd160907a78 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4148,11 +4148,11 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) thresh >>= 1; vruntime -= thresh; - trace_android_rvh_place_entity(se, &vruntime); } /* ensure we never gain time by being placed backwards. */ se->vruntime = max_vruntime(se->vruntime, vruntime); + trace_android_rvh_place_entity(cfs_rq, se, initial, vruntime); } static void check_enqueue_throttle(struct cfs_rq *cfs_rq); @@ -4376,9 +4376,13 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) unsigned long ideal_runtime, delta_exec; struct sched_entity *se; s64 delta; + bool skip_preempt = false; 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); + if (skip_preempt) + return; if (delta_exec > ideal_runtime) { resched_curr(rq_of(cfs_rq)); /* @@ -7018,9 +7022,13 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ int scale = cfs_rq->nr_running >= sched_nr_latency; int next_buddy_marked = 0; bool preempt = false; + bool ignore = false; if (unlikely(se == pse)) return; + trace_android_rvh_check_preempt_wakeup_ignore(curr, &ignore); + if (ignore) + return; /* * This is possible from callers such as attach_tasks(), in which we @@ -7104,6 +7112,7 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf struct sched_entity *se; struct task_struct *p; int new_tasks; + bool repick = false; again: if (!sched_fair_runnable(rq)) @@ -7157,6 +7166,7 @@ again: } while (cfs_rq); p = task_of(se); + trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, false); /* * Since we haven't yet done put_prev_entity and if the selected task @@ -7190,6 +7200,10 @@ simple: if (prev) put_prev_task(rq, prev); + trace_android_rvh_replace_next_task_fair(rq, &p, &se, &repick, true); + if (repick) + goto done; + do { se = pick_next_entity(cfs_rq, NULL); set_next_entity(cfs_rq, se); diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index 8e475521f033..b9a654bba1b7 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -2063,6 +2063,7 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n", cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity); } + trace_android_vh_build_sched_domains(has_asym); ret = 0; error: