Re: [PATCH] cpu/hotplug: Allow the CPU in CPU_UP_PREPARE state to be brought up again.

From: Boris Ostrovsky
Date: Mon Dec 06 2021 - 08:40:58 EST



On 12/6/21 6:25 AM, Sebastian Andrzej Siewior wrote:
On 2021-11-24 21:17:34 [-0500], Boris Ostrovsky wrote:
On 11/24/21 5:54 PM, Thomas Gleixner wrote:
Any comment from XEN folks?

If memory allocation in cpu_initialize_context() fails we will not be
able to bring up the VCPU because xen_cpu_initialized_map bit at the
top of that routine will already have been set. We will BUG in
xen_pv_cpu_up() on second (presumably successful) attempt because
nothing for that VCPU would be initialized. This can in principle be
fixed by moving allocation to the top of the routine and freeing
context if the bit in the bitmap is already set.


Having said that, allocation really should not fail: for PV guests we
first bring max number of VCPUs up and then offline them down to
however many need to run. I think if we fail allocation during boot we
are going to have a really bad day anyway.

So can we keep the patch as-is or are some changes needed?


I think for the sake of completeness we could add


diff --git a/arch/x86/xen/smp_pv.c b/arch/x86/xen/smp_pv.c
index 6a8f3b53ab83..86368fcef466 100644
--- a/arch/x86/xen/smp_pv.c
+++ b/arch/x86/xen/smp_pv.c
@@ -277,8 +277,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);


-boris