From 6c7d9537fe7003667472b83424ea3895fd77c41c Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Wed, 18 Dec 2019 08:38:28 +0530 Subject: [PATCH] sched/fair: Improve the scheduler This change is for general scheduler improvement. Change-Id: I7c3a073fa68d715dd3bdbed11e4f83e82046a3c0 Signed-off-by: Pavankumar Kondeti --- kernel/sched/core.c | 14 ++++++++------ kernel/sched/sched.h | 1 + kernel/sched/walt.h | 6 +++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a1993537ea8e..8817bd9eb428 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8444,7 +8444,7 @@ void sched_account_irqtime(int cpu, struct task_struct *curr, u64 delta, u64 wallclock) { struct rq *rq = cpu_rq(cpu); - unsigned long flags, nr_windows; + unsigned long flags, nr_ticks; u64 cur_jiffies_ts; raw_spin_lock_irqsave(&rq->lock, flags); @@ -8460,18 +8460,20 @@ void sched_account_irqtime(int cpu, struct task_struct *curr, walt_update_task_ravg(curr, rq, IRQ_UPDATE, sched_ktime_clock(), delta); - nr_windows = cur_jiffies_ts - rq->irqload_ts; + nr_ticks = cur_jiffies_ts - rq->irqload_ts; - if (nr_windows) { - if (nr_windows < 10) { + if (nr_ticks) { + if (nr_ticks < 10) { /* Decay CPU's irqload by 3/4 for each window. */ - rq->avg_irqload *= (3 * nr_windows); + rq->avg_irqload *= (3 * nr_ticks); rq->avg_irqload = div64_u64(rq->avg_irqload, - 4 * nr_windows); + 4 * nr_ticks); } else { rq->avg_irqload = 0; } rq->avg_irqload += rq->cur_irqload; + rq->high_irqload = (rq->avg_irqload >= + sysctl_sched_cpu_high_irqload); rq->cur_irqload = 0; } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index f4e0790c4b42..837360af7ba7 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1076,6 +1076,7 @@ struct rq { u64 cur_irqload; u64 avg_irqload; u64 irqload_ts; + bool high_irqload; struct task_struct *ed_task; struct cpu_cycle cc; u64 old_busy_time, old_busy_time_group; diff --git a/kernel/sched/walt.h b/kernel/sched/walt.h index 6b91d365ac60..d670cd053e6b 100644 --- a/kernel/sched/walt.h +++ b/kernel/sched/walt.h @@ -85,6 +85,10 @@ extern void __weak mark_task_starting(struct task_struct *p); extern void __weak set_window_start(struct rq *rq); extern bool __weak do_pl_notif(struct rq *rq); +/* + * This is only for tracepoints to print the avg irq load. For + * task placment considerations, use sched_cpu_high_irqload(). + */ #define SCHED_HIGH_IRQ_TIMEOUT 3 static inline u64 sched_irqload(int cpu) { @@ -107,7 +111,7 @@ static inline u64 sched_irqload(int cpu) static inline int sched_cpu_high_irqload(int cpu) { - return sched_irqload(cpu) >= sysctl_sched_cpu_high_irqload; + return cpu_rq(cpu)->high_irqload; } static inline int exiting_task(struct task_struct *p)