| From 288de1e1102cd367acd77b7738959ca4acb2a2e3 Mon Sep 17 00:00:00 2001 |
| From: Nicholas Piggin <npiggin@gmail.com> |
| Date: Fri, 12 Apr 2019 14:26:13 +1000 |
| Subject: sched/nohz: Run NOHZ idle load balancer on HK_FLAG_MISC CPUs |
| |
| [ Upstream commit 9b019acb72e4b5741d88e8936d6f200ed44b66b2 ] |
| |
| The NOHZ idle balancer runs on the lowest idle CPU. This can |
| interfere with isolated CPUs, so confine it to HK_FLAG_MISC |
| housekeeping CPUs. |
| |
| HK_FLAG_SCHED is not used for this because it is not set anywhere |
| at the moment. This could be folded into HK_FLAG_SCHED once that |
| option is fixed. |
| |
| The problem was observed with increased jitter on an application |
| running on CPU0, caused by NOHZ idle load balancing being run on |
| CPU1 (an SMT sibling). |
| |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Frederic Weisbecker <fweisbec@gmail.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lkml.kernel.org/r/20190412042613.28930-1-npiggin@gmail.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/sched/fair.c | 16 ++++++++++------ |
| 1 file changed, 10 insertions(+), 6 deletions(-) |
| |
| diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
| index 35f3ea3750844..232491e3ed0db 100644 |
| --- a/kernel/sched/fair.c |
| +++ b/kernel/sched/fair.c |
| @@ -9551,22 +9551,26 @@ static inline int on_null_domain(struct rq *rq) |
| * - When one of the busy CPUs notice that there may be an idle rebalancing |
| * needed, they will kick the idle load balancer, which then does idle |
| * load balancing for all the idle CPUs. |
| + * - HK_FLAG_MISC CPUs are used for this task, because HK_FLAG_SCHED not set |
| + * anywhere yet. |
| */ |
| |
| static inline int find_new_ilb(void) |
| { |
| - int ilb = cpumask_first(nohz.idle_cpus_mask); |
| + int ilb; |
| |
| - if (ilb < nr_cpu_ids && idle_cpu(ilb)) |
| - return ilb; |
| + for_each_cpu_and(ilb, nohz.idle_cpus_mask, |
| + housekeeping_cpumask(HK_FLAG_MISC)) { |
| + if (idle_cpu(ilb)) |
| + return ilb; |
| + } |
| |
| return nr_cpu_ids; |
| } |
| |
| /* |
| - * Kick a CPU to do the nohz balancing, if it is time for it. We pick the |
| - * nohz_load_balancer CPU (if there is one) otherwise fallback to any idle |
| - * CPU (if there is one). |
| + * Kick a CPU to do the nohz balancing, if it is time for it. We pick any |
| + * idle CPU in the HK_FLAG_MISC housekeeping set (if there is one). |
| */ |
| static void kick_ilb(unsigned int flags) |
| { |
| -- |
| 2.20.1 |
| |