From a56f081c5b2ec8b053f7ad5b98f592f3eac005e0 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Fri, 19 Feb 2021 12:18:11 +0530 Subject: [PATCH] ANDROID: sched: Add restricted vendor hooks in CFS scheduler Add restricted vendor hooks in CFS scheduler class to allow customizations in vendor modules. Bug: 180668820 Change-Id: I69bd90e11220d7607b075a3aa687059deaa60439 Signed-off-by: Pavankumar Kondeti --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/sched.h | 10 ++++++++++ kernel/sched/fair.c | 11 ++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 6d0212039c10..6f84d10fc9c8 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -152,3 +152,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_mem_abort); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sp_pc_abort); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_setup_dma_ops); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pick_next_entity); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 5e954dc84ee1..b06a408b4722 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -242,6 +242,16 @@ DECLARE_RESTRICTED_HOOK(android_rvh_dequeue_task_idle, TP_PROTO(struct task_struct *p), TP_ARGS(p), 1); +struct cfs_rq; +DECLARE_RESTRICTED_HOOK(android_rvh_pick_next_entity, + TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *curr, + struct sched_entity **se), + 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), + TP_ARGS(rq, p, preempt), 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 f6aa8091f9f5..20d407a434de 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4443,7 +4443,11 @@ static struct sched_entity * pick_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *curr) { struct sched_entity *left = __pick_first_entity(cfs_rq); - struct sched_entity *se; + struct sched_entity *se = NULL; + + trace_android_rvh_pick_next_entity(cfs_rq, curr, &se); + if (se) + goto done; /* * If curr is set we have to see if its left of the leftmost entity @@ -4485,6 +4489,7 @@ pick_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *curr) se = cfs_rq->last; } +done: clear_buddies(cfs_rq, se); return se; @@ -6993,6 +6998,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ struct cfs_rq *cfs_rq = task_cfs_rq(curr); int scale = cfs_rq->nr_running >= sched_nr_latency; int next_buddy_marked = 0; + bool preempt = false; if (unlikely(se == pse)) return; @@ -7036,6 +7042,9 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ if (unlikely(p->policy != SCHED_NORMAL) || !sched_feat(WAKEUP_PREEMPTION)) return; + trace_android_rvh_check_preempt_wakeup(rq, p, &preempt); + if (preempt) + goto preempt; find_matching_se(&se, &pse); update_curr(cfs_rq_of(se)); BUG_ON(!pse);