diff options
author | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2022-02-09 11:02:13 +0300 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2022-04-12 15:13:01 +0300 |
commit | e8a69f12f01f487c6a0e704eb14ccf2dd015277d (patch) | |
tree | 3419591d9a14133613d3fecaf007728fc58944e3 /arch/x86/xen/smp_pv.c | |
parent | ce522ba9ef7e2d9fb22a39eb3371c0c64e2a433e (diff) | |
download | linux-e8a69f12f01f487c6a0e704eb14ccf2dd015277d.tar.xz |
x86/xen: Allow to retry if cpu_initialize_context() failed.
If memory allocation in cpu_initialize_context() fails then it will
bring up the VCPU and leave with the corresponding CPU bit set in
xen_cpu_initialized_map.
The following (presumably successful) CPU bring up will BUG in
xen_pv_cpu_up() because nothing for that VCPU would be initialized.
Clear the CPU bits, that were set in cpu_initialize_context() in case
the memory allocation fails.
[ bigeasy: Creating a patch from Boris' email. ]
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20220209080214.1439408-2-bigeasy@linutronix.de
Diffstat (limited to 'arch/x86/xen/smp_pv.c')
-rw-r--r-- | arch/x86/xen/smp_pv.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/xen/smp_pv.c b/arch/x86/xen/smp_pv.c index 688aa8b6ae29..ba7af2eca755 100644 --- a/arch/x86/xen/smp_pv.c +++ b/arch/x86/xen/smp_pv.c @@ -260,8 +260,11 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) return 0; ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL); - if (ctxt == NULL) + if (ctxt == NULL) { + cpumask_clear_cpu(cpu, xen_cpu_initialized_map); + cpumask_clear_cpu(cpu, cpu_callout_mask); return -ENOMEM; + } gdt = get_cpu_gdt_rw(cpu); |