diff options
author | Frederic Weisbecker <frederic@kernel.org> | 2017-10-26 22:42:32 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-10-27 03:55:27 -0400 |
commit | e179f5a04ba46ee5c5439480c2bfd68c358168b7 (patch) | |
tree | be51371dfbe99861087f3a911b66f7dc8c7e9d6e /kernel/sched/isolation.c | |
parent | 7e56a1cf4b28f5739526877b8dbad623fae2e4e7 (diff) |
sched/isolation: Use its own static key
Housekeeping code still depends on the nohz_full static key. Since we want
to decouple housekeeping from NOHZ, let's create a housekeeping specific
static key.
It's mostly relevant for calls to is_housekeeping_cpu() from the scheduler.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Wanpeng Li <kernellwp@gmail.com>
Link: http://lkml.kernel.org/r/1509072159-31808-6-git-send-email-frederic@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/sched/isolation.c')
-rw-r--r-- | kernel/sched/isolation.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c index 16445097eb25..bb8ba19a0235 100644 --- a/kernel/sched/isolation.c +++ b/kernel/sched/isolation.c | |||
@@ -10,12 +10,15 @@ | |||
10 | #include <linux/tick.h> | 10 | #include <linux/tick.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/static_key.h> | ||
13 | 14 | ||
15 | DEFINE_STATIC_KEY_FALSE(housekeeping_overriden); | ||
16 | EXPORT_SYMBOL_GPL(housekeeping_overriden); | ||
14 | static cpumask_var_t housekeeping_mask; | 17 | static cpumask_var_t housekeeping_mask; |
15 | 18 | ||
16 | int housekeeping_any_cpu(void) | 19 | int housekeeping_any_cpu(void) |
17 | { | 20 | { |
18 | if (tick_nohz_full_enabled()) | 21 | if (static_branch_unlikely(&housekeeping_overriden)) |
19 | return cpumask_any_and(housekeeping_mask, cpu_online_mask); | 22 | return cpumask_any_and(housekeeping_mask, cpu_online_mask); |
20 | 23 | ||
21 | return smp_processor_id(); | 24 | return smp_processor_id(); |
@@ -24,7 +27,7 @@ EXPORT_SYMBOL_GPL(housekeeping_any_cpu); | |||
24 | 27 | ||
25 | const struct cpumask *housekeeping_cpumask(void) | 28 | const struct cpumask *housekeeping_cpumask(void) |
26 | { | 29 | { |
27 | if (tick_nohz_full_enabled()) | 30 | if (static_branch_unlikely(&housekeeping_overriden)) |
28 | return housekeeping_mask; | 31 | return housekeeping_mask; |
29 | 32 | ||
30 | return cpu_possible_mask; | 33 | return cpu_possible_mask; |
@@ -33,14 +36,14 @@ EXPORT_SYMBOL_GPL(housekeeping_cpumask); | |||
33 | 36 | ||
34 | void housekeeping_affine(struct task_struct *t) | 37 | void housekeeping_affine(struct task_struct *t) |
35 | { | 38 | { |
36 | if (tick_nohz_full_enabled()) | 39 | if (static_branch_unlikely(&housekeeping_overriden)) |
37 | set_cpus_allowed_ptr(t, housekeeping_mask); | 40 | set_cpus_allowed_ptr(t, housekeeping_mask); |
38 | } | 41 | } |
39 | EXPORT_SYMBOL_GPL(housekeeping_affine); | 42 | EXPORT_SYMBOL_GPL(housekeeping_affine); |
40 | 43 | ||
41 | bool housekeeping_test_cpu(int cpu) | 44 | bool housekeeping_test_cpu(int cpu) |
42 | { | 45 | { |
43 | if (tick_nohz_full_enabled()) | 46 | if (static_branch_unlikely(&housekeeping_overriden)) |
44 | return cpumask_test_cpu(cpu, housekeeping_mask); | 47 | return cpumask_test_cpu(cpu, housekeeping_mask); |
45 | 48 | ||
46 | return true; | 49 | return true; |
@@ -62,6 +65,8 @@ void __init housekeeping_init(void) | |||
62 | cpumask_andnot(housekeeping_mask, | 65 | cpumask_andnot(housekeeping_mask, |
63 | cpu_possible_mask, tick_nohz_full_mask); | 66 | cpu_possible_mask, tick_nohz_full_mask); |
64 | 67 | ||
68 | static_branch_enable(&housekeeping_overriden); | ||
69 | |||
65 | /* We need at least one CPU to handle housekeeping work */ | 70 | /* We need at least one CPU to handle housekeeping work */ |
66 | WARN_ON_ONCE(cpumask_empty(housekeeping_mask)); | 71 | WARN_ON_ONCE(cpumask_empty(housekeeping_mask)); |
67 | } | 72 | } |