diff options
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 | } |