Messages in this thread Patch in this message | | | Date | Thu, 4 Jul 2019 22:42:17 +0200 (CEST) | From | Thomas Gleixner <> | Subject | [PATCH] cpu/hotplug: Cache number of online CPUs |
| |
Revaluating the bitmap wheight of the online cpus bitmap in every invocation of num_online_cpus() over and over is a pretty useless exercise. Especially when num_online_cpus() is used in code pathes like the IPI delivery of x86 or the membarrier code.
Cache the number of online CPUs in the core and just return the cached variable.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- include/linux/cpumask.h | 16 +++++++--------- kernel/cpu.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-)
--- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -95,8 +95,13 @@ extern struct cpumask __cpu_active_mask; #define cpu_present_mask ((const struct cpumask *)&__cpu_present_mask) #define cpu_active_mask ((const struct cpumask *)&__cpu_active_mask) +extern unsigned int __num_online_cpus; + #if NR_CPUS > 1 -#define num_online_cpus() cpumask_weight(cpu_online_mask) +static inline unsigned int num_online_cpus(void) +{ + return __num_online_cpus; +} #define num_possible_cpus() cpumask_weight(cpu_possible_mask) #define num_present_cpus() cpumask_weight(cpu_present_mask) #define num_active_cpus() cpumask_weight(cpu_active_mask) @@ -821,14 +826,7 @@ set_cpu_present(unsigned int cpu, bool p cpumask_clear_cpu(cpu, &__cpu_present_mask); } -static inline void -set_cpu_online(unsigned int cpu, bool online) -{ - if (online) - cpumask_set_cpu(cpu, &__cpu_online_mask); - else - cpumask_clear_cpu(cpu, &__cpu_online_mask); -} +void set_cpu_online(unsigned int cpu, bool online); static inline void set_cpu_active(unsigned int cpu, bool active) --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -2291,6 +2291,9 @@ EXPORT_SYMBOL(__cpu_present_mask); struct cpumask __cpu_active_mask __read_mostly; EXPORT_SYMBOL(__cpu_active_mask); +unsigned int __num_online_cpus __read_mostly; +EXPORT_SYMBOL(__num_online_cpus); + void init_cpu_present(const struct cpumask *src) { cpumask_copy(&__cpu_present_mask, src); @@ -2306,6 +2309,19 @@ void init_cpu_online(const struct cpumas cpumask_copy(&__cpu_online_mask, src); } +void set_cpu_online(unsigned int cpu, bool online) +{ + lockdep_assert_cpus_held(); + + if (online) { + if (!cpumask_test_and_set_cpu(cpu, &__cpu_online_mask)) + __num_online_cpus++; + } else { + if (cpumask_test_and_clear_cpu(cpu, &__cpu_online_mask)) + __num_online_cpus--; + } +} + /* * Activate the first processor. */
| |