diff options
| -rw-r--r-- | include/linux/cpumask.h | 20 | ||||
| -rw-r--r-- | kernel/cpu.c | 6 | 
2 files changed, 26 insertions, 0 deletions
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index a58433668bb2..e6b948a6000d 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -91,10 +91,12 @@ extern struct cpumask __cpu_possible_mask;  extern struct cpumask __cpu_online_mask;  extern struct cpumask __cpu_present_mask;  extern struct cpumask __cpu_active_mask; +extern struct cpumask __cpu_dying_mask;  #define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask)  #define cpu_online_mask   ((const struct cpumask *)&__cpu_online_mask)  #define cpu_present_mask  ((const struct cpumask *)&__cpu_present_mask)  #define cpu_active_mask   ((const struct cpumask *)&__cpu_active_mask) +#define cpu_dying_mask    ((const struct cpumask *)&__cpu_dying_mask)  extern atomic_t __num_online_cpus; @@ -826,6 +828,14 @@ set_cpu_active(unsigned int cpu, bool active)  		cpumask_clear_cpu(cpu, &__cpu_active_mask);  } +static inline void +set_cpu_dying(unsigned int cpu, bool dying) +{ +	if (dying) +		cpumask_set_cpu(cpu, &__cpu_dying_mask); +	else +		cpumask_clear_cpu(cpu, &__cpu_dying_mask); +}  /**   * to_cpumask - convert an NR_CPUS bitmap to a struct cpumask * @@ -900,6 +910,11 @@ static inline bool cpu_active(unsigned int cpu)  	return cpumask_test_cpu(cpu, cpu_active_mask);  } +static inline bool cpu_dying(unsigned int cpu) +{ +	return cpumask_test_cpu(cpu, cpu_dying_mask); +} +  #else  #define num_online_cpus()	1U @@ -927,6 +942,11 @@ static inline bool cpu_active(unsigned int cpu)  	return cpu == 0;  } +static inline bool cpu_dying(unsigned int cpu) +{ +	return false; +} +  #endif /* NR_CPUS > 1 */  #define cpu_is_offline(cpu)	unlikely(!cpu_online(cpu)) diff --git a/kernel/cpu.c b/kernel/cpu.c index 23505d6abd45..838dcf238f92 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -160,6 +160,9 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,  	int (*cb)(unsigned int cpu);  	int ret, cnt; +	if (cpu_dying(cpu) != !bringup) +		set_cpu_dying(cpu, !bringup); +  	if (st->fail == state) {  		st->fail = CPUHP_INVALID;  		return -EAGAIN; @@ -2512,6 +2515,9 @@ EXPORT_SYMBOL(__cpu_present_mask);  struct cpumask __cpu_active_mask __read_mostly;  EXPORT_SYMBOL(__cpu_active_mask); +struct cpumask __cpu_dying_mask __read_mostly; +EXPORT_SYMBOL(__cpu_dying_mask); +  atomic_t __num_online_cpus __read_mostly;  EXPORT_SYMBOL(__num_online_cpus);  |