aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r--kernel/cpu.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 81e2a388a0f6..356450f09c1f 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -79,6 +79,8 @@ static struct {
79 79
80/* Lockdep annotations for get/put_online_cpus() and cpu_hotplug_begin/end() */ 80/* Lockdep annotations for get/put_online_cpus() and cpu_hotplug_begin/end() */
81#define cpuhp_lock_acquire_read() lock_map_acquire_read(&cpu_hotplug.dep_map) 81#define cpuhp_lock_acquire_read() lock_map_acquire_read(&cpu_hotplug.dep_map)
82#define cpuhp_lock_acquire_tryread() \
83 lock_map_acquire_tryread(&cpu_hotplug.dep_map)
82#define cpuhp_lock_acquire() lock_map_acquire(&cpu_hotplug.dep_map) 84#define cpuhp_lock_acquire() lock_map_acquire(&cpu_hotplug.dep_map)
83#define cpuhp_lock_release() lock_map_release(&cpu_hotplug.dep_map) 85#define cpuhp_lock_release() lock_map_release(&cpu_hotplug.dep_map)
84 86
@@ -91,10 +93,22 @@ void get_online_cpus(void)
91 mutex_lock(&cpu_hotplug.lock); 93 mutex_lock(&cpu_hotplug.lock);
92 cpu_hotplug.refcount++; 94 cpu_hotplug.refcount++;
93 mutex_unlock(&cpu_hotplug.lock); 95 mutex_unlock(&cpu_hotplug.lock);
94
95} 96}
96EXPORT_SYMBOL_GPL(get_online_cpus); 97EXPORT_SYMBOL_GPL(get_online_cpus);
97 98
99bool try_get_online_cpus(void)
100{
101 if (cpu_hotplug.active_writer == current)
102 return true;
103 if (!mutex_trylock(&cpu_hotplug.lock))
104 return false;
105 cpuhp_lock_acquire_tryread();
106 cpu_hotplug.refcount++;
107 mutex_unlock(&cpu_hotplug.lock);
108 return true;
109}
110EXPORT_SYMBOL_GPL(try_get_online_cpus);
111
98void put_online_cpus(void) 112void put_online_cpus(void)
99{ 113{
100 if (cpu_hotplug.active_writer == current) 114 if (cpu_hotplug.active_writer == current)