|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH for-4.19 2/9] xen/cpu: do not get the CPU map in stop_machine_run()
The current callers of stop_machine_run() outside of init code already have the
CPU maps locked, and hence there's no reason for stop_machine_run() to attempt
to lock again.
Replace the get_cpu_maps() call with a suitable unreachable assert.
Further changes will modify the conditions under which get_cpu_maps() returns
success and without the adjustment proposed here the usage of
stop_machine_run() in cpu_down() would then return an error.
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/common/cpu.c | 5 +++++
xen/common/stop_machine.c | 15 ++++++++-------
xen/include/xen/cpu.h | 2 ++
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/xen/common/cpu.c b/xen/common/cpu.c
index 8709db4d2957..6173220e771b 100644
--- a/xen/common/cpu.c
+++ b/xen/common/cpu.c
@@ -68,6 +68,11 @@ void cpu_hotplug_done(void)
write_unlock(&cpu_add_remove_lock);
}
+bool cpu_map_locked(void)
+{
+ return rw_is_locked(&cpu_add_remove_lock);
+}
+
static NOTIFIER_HEAD(cpu_chain);
void __init register_cpu_notifier(struct notifier_block *nb)
diff --git a/xen/common/stop_machine.c b/xen/common/stop_machine.c
index 398cfd507c10..7face75648e8 100644
--- a/xen/common/stop_machine.c
+++ b/xen/common/stop_machine.c
@@ -82,9 +82,15 @@ int stop_machine_run(int (*fn)(void *data), void *data,
unsigned int cpu)
BUG_ON(!local_irq_is_enabled());
BUG_ON(!is_idle_vcpu(current));
- /* cpu_online_map must not change. */
- if ( !get_cpu_maps() )
+ /*
+ * cpu_online_map must not change. The only two callers of
+ * stop_machine_run() outside of init code already have the CPU map locked.
+ */
+ if ( system_state >= SYS_STATE_active && !cpu_map_locked() )
+ {
+ ASSERT_UNREACHABLE();
return -EBUSY;
+ }
nr_cpus = num_online_cpus();
if ( cpu_online(this) )
@@ -92,10 +98,7 @@ int stop_machine_run(int (*fn)(void *data), void *data,
unsigned int cpu)
/* Must not spin here as the holder will expect us to be descheduled. */
if ( !spin_trylock(&stopmachine_lock) )
- {
- put_cpu_maps();
return -EBUSY;
- }
stopmachine_data.fn = fn;
stopmachine_data.fn_data = data;
@@ -136,8 +139,6 @@ int stop_machine_run(int (*fn)(void *data), void *data,
unsigned int cpu)
spin_unlock(&stopmachine_lock);
- put_cpu_maps();
-
return ret;
}
diff --git a/xen/include/xen/cpu.h b/xen/include/xen/cpu.h
index e1d4eb59675c..d8c8264c58b0 100644
--- a/xen/include/xen/cpu.h
+++ b/xen/include/xen/cpu.h
@@ -13,6 +13,8 @@ void put_cpu_maps(void);
void cpu_hotplug_begin(void);
void cpu_hotplug_done(void);
+bool cpu_map_locked(void);
+
/* Receive notification of CPU hotplug events. */
void register_cpu_notifier(struct notifier_block *nb);
--
2.44.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |