1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * include/linux/cpuhplock.h - CPU hotplug locking
4  *
5  * Locking functions for CPU hotplug.
6  */
7 #ifndef _LINUX_CPUHPLOCK_H_
8 #define _LINUX_CPUHPLOCK_H_
9 
10 #include <linux/cleanup.h>
11 #include <linux/errno.h>
12 
13 struct device;
14 
15 extern int lockdep_is_cpus_held(void);
16 
17 #ifdef CONFIG_HOTPLUG_CPU
18 void cpus_write_lock(void);
19 void cpus_write_unlock(void);
20 void cpus_read_lock(void);
21 void cpus_read_unlock(void);
22 int  cpus_read_trylock(void);
23 void lockdep_assert_cpus_held(void);
24 void cpu_hotplug_disable_offlining(void);
25 void cpu_hotplug_disable(void);
26 void cpu_hotplug_enable(void);
27 void clear_tasks_mm_cpumask(int cpu);
28 int remove_cpu(unsigned int cpu);
29 int cpu_device_down(struct device *dev);
30 void smp_shutdown_nonboot_cpus(unsigned int primary_cpu);
31 
32 #else /* CONFIG_HOTPLUG_CPU */
33 
cpus_write_lock(void)34 static inline void cpus_write_lock(void) { }
cpus_write_unlock(void)35 static inline void cpus_write_unlock(void) { }
cpus_read_lock(void)36 static inline void cpus_read_lock(void) { }
cpus_read_unlock(void)37 static inline void cpus_read_unlock(void) { }
cpus_read_trylock(void)38 static inline int  cpus_read_trylock(void) { return true; }
lockdep_assert_cpus_held(void)39 static inline void lockdep_assert_cpus_held(void) { }
cpu_hotplug_disable_offlining(void)40 static inline void cpu_hotplug_disable_offlining(void) { }
cpu_hotplug_disable(void)41 static inline void cpu_hotplug_disable(void) { }
cpu_hotplug_enable(void)42 static inline void cpu_hotplug_enable(void) { }
remove_cpu(unsigned int cpu)43 static inline int remove_cpu(unsigned int cpu) { return -EPERM; }
smp_shutdown_nonboot_cpus(unsigned int primary_cpu)44 static inline void smp_shutdown_nonboot_cpus(unsigned int primary_cpu) { }
45 #endif	/* !CONFIG_HOTPLUG_CPU */
46 
47 DEFINE_LOCK_GUARD_0(cpus_read_lock, cpus_read_lock(), cpus_read_unlock())
48 
49 #endif /* _LINUX_CPUHPLOCK_H_ */
50