|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v1 1/2] x86/cpu: maintain a parked CPU bitmap
It helps to distinguish parked CPUs from those are really offlined or
hot-added. We need to know the parked CPUs in order to do a special
check against them to ensure that all CPUs, except those are really
offlined or hot-added, have the same ucode version.
Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
---
Note that changes on ARM side are untested.
---
xen/arch/arm/smpboot.c | 1 +
xen/arch/x86/cpu/common.c | 4 ++++
xen/arch/x86/smpboot.c | 1 +
xen/common/cpu.c | 4 ++++
xen/include/asm-arm/smp.h | 1 +
xen/include/asm-x86/smp.h | 1 +
xen/include/xen/cpumask.h | 1 +
7 files changed, 13 insertions(+)
diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
index 00b64c3..1b57ba4 100644
--- a/xen/arch/arm/smpboot.c
+++ b/xen/arch/arm/smpboot.c
@@ -39,6 +39,7 @@
cpumask_t cpu_online_map;
cpumask_t cpu_present_map;
cpumask_t cpu_possible_map;
+cpumask_var_t cpu_parked_map;
struct cpuinfo_arm cpu_data[NR_CPUS];
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index 6c6bd63..fbb961d 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -337,7 +337,11 @@ void __init early_cpu_init(void)
}
if (!(c->x86_vendor & (X86_VENDOR_AMD | X86_VENDOR_HYGON)))
+ {
park_offline_cpus = opt_mce;
+ if (park_offline_cpus && !zalloc_cpumask_var(&cpu_parked_map))
+ panic("No memory for CPU parked map\n");
+ }
initialize_cpu_data(0);
}
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index fa691b6..f66de8d 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -60,6 +60,7 @@ cpumask_t cpu_online_map __read_mostly;
EXPORT_SYMBOL(cpu_online_map);
bool __read_mostly park_offline_cpus;
+cpumask_var_t cpu_parked_map;
unsigned int __read_mostly nr_sockets;
cpumask_t **__read_mostly socket_cpumask;
diff --git a/xen/common/cpu.c b/xen/common/cpu.c
index 66c855c..0090a19 100644
--- a/xen/common/cpu.c
+++ b/xen/common/cpu.c
@@ -117,6 +117,8 @@ int cpu_down(unsigned int cpu)
cpu_notifier_call_chain(cpu, CPU_DEAD, NULL, true);
send_global_virq(VIRQ_PCPU_STATE);
+ if ( park_offline_cpus )
+ cpumask_set_cpu(cpu, cpu_parked_map);
cpu_hotplug_done();
return 0;
@@ -154,6 +156,8 @@ int cpu_up(unsigned int cpu)
cpu_notifier_call_chain(cpu, CPU_ONLINE, NULL, true);
send_global_virq(VIRQ_PCPU_STATE);
+ if ( park_offline_cpus )
+ cpumask_clear_cpu(cpu, cpu_parked_map);
cpu_hotplug_done();
return 0;
diff --git a/xen/include/asm-arm/smp.h b/xen/include/asm-arm/smp.h
index fdbcefa..4b392fa 100644
--- a/xen/include/asm-arm/smp.h
+++ b/xen/include/asm-arm/smp.h
@@ -19,6 +19,7 @@ DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
* would otherwise prefer them to be off?
*/
#define park_offline_cpus false
+extern cpumask_var_t cpu_parked_map;
extern void noreturn stop_cpu(void);
diff --git a/xen/include/asm-x86/smp.h b/xen/include/asm-x86/smp.h
index dbeed2f..886737d 100644
--- a/xen/include/asm-x86/smp.h
+++ b/xen/include/asm-x86/smp.h
@@ -31,6 +31,7 @@ DECLARE_PER_CPU(cpumask_var_t, scratch_cpumask);
* would otherwise prefer them to be off?
*/
extern bool park_offline_cpus;
+extern cpumask_var_t cpu_parked_map;
void smp_send_nmi_allbutself(void);
diff --git a/xen/include/xen/cpumask.h b/xen/include/xen/cpumask.h
index 256b60b..543cec5 100644
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -457,6 +457,7 @@ extern cpumask_t cpu_present_map;
#define for_each_possible_cpu(cpu) for_each_cpu(cpu, &cpu_possible_map)
#define for_each_online_cpu(cpu) for_each_cpu(cpu, &cpu_online_map)
#define for_each_present_cpu(cpu) for_each_cpu(cpu, &cpu_present_map)
+#define for_each_parked_cpu(cpu) for_each_cpu(cpu, cpu_parked_map)
/* Copy to/from cpumap provided by control tools. */
struct xenctl_bitmap;
--
1.8.3.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |