mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	cpumask: Introduce DYING mask
Introduce a cpumask that indicates (for each CPU) what direction the CPU hotplug is currently going. Notably, it tracks rollbacks. Eg. when an up fails and we do a roll-back down, it will accurately reflect the direction. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Valentin Schneider <valentin.schneider@arm.com> Link: https://lkml.kernel.org/r/20210310150109.151441252@infradead.org
This commit is contained in:
		
							parent
							
								
									b02a4fd814
								
							
						
					
					
						commit
						e40f74c535
					
				
					 2 changed files with 26 additions and 0 deletions
				
			
		|  | @ -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)) | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Peter Zijlstra
						Peter Zijlstra