mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 00:21:32 +00:00
0b64ffb8db
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: Konrad Wilk <konrad.wilk@oracle.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com> Signed-off-by: Juergen Gross <jgross@suse.com> |
||
---|---|---|
.. | ||
apic.c | ||
debugfs.c | ||
debugfs.h | ||
efi.c | ||
enlighten_hvm.c | ||
enlighten_pv.c | ||
enlighten_pvh.c | ||
enlighten.c | ||
grant-table.c | ||
irq.c | ||
Kconfig | ||
Makefile | ||
mmu_hvm.c | ||
mmu_pv.c | ||
mmu.c | ||
mmu.h | ||
multicalls.c | ||
multicalls.h | ||
p2m.c | ||
pci-swiotlb-xen.c | ||
platform-pci-unplug.c | ||
pmu.c | ||
pmu.h | ||
setup.c | ||
smp_hvm.c | ||
smp_pv.c | ||
smp.c | ||
smp.h | ||
spinlock.c | ||
suspend_hvm.c | ||
suspend_pv.c | ||
suspend.c | ||
time.c | ||
trace.c | ||
vdso.h | ||
vga.c | ||
xen-asm_32.S | ||
xen-asm_64.S | ||
xen-asm.h | ||
xen-asm.S | ||
xen-head.S | ||
xen-ops.h | ||
xen-pvh.S |