mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-09 08:33:35 +00:00
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 | ||