• Ankur Arora's avatar
    xen/pvh*: Support > 32 VCPUs at domain restore · 0b64ffb8
    Ankur Arora authored
    When Xen restores a PVHVM or PVH guest, its shared_info only holds
    up to 32 CPUs. The hypercall VCPUOP_register_vcpu_info allows
    us to setup per-page areas for VCPUs. This means we can boot
    PVH* guests with more than 32 VCPUs. During restore the per-cpu
    structure is allocated freshly by the hypervisor (vcpu_info_mfn is
    set to INVALID_MFN) so that the newly restored guest can make a
    VCPUOP_register_vcpu_info hypercall.
    
    However, we end up triggering this condition in Xen:
    /* Run this command on yourself or on other offline VCPUS. */
     if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
    
    which means we are unable to setup the per-cpu VCPU structures
    for running VCPUS. The Linux PV code paths makes this work by
    iterating over cpu_possible in xen_vcpu_restore() with:
    
     1) is target CPU up (VCPUOP_is_up hypercall?)
     2) if yes, then VCPUOP_down to pause it
     3) VCPUOP_register_vcpu_info
     4) if it was down, then VCPUOP_up to bring it back up
    
    With Xen commit 192df6f9122d ("xen/x86: allow HVM guests to use
    hypercalls to bring up vCPUs") this is available for non-PV guests.
    As such first check if VCPUOP_is_up is actually possible before
    trying this dance.
    
    As most of this dance code is done already in xen_vcpu_restore()
    let's make it callable on PV, PVH and PVHVM.
    Based-on-patch-by: default avatarKonrad Wilk <konrad.wilk@oracle.com>
    Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: default avatarAnkur Arora <ankur.a.arora@oracle.com>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    0b64ffb8
xen-ops.h 5.25 KB