Specify maximum possible APIC ID assigned for current VM session prior to the creation of vCPUs. KVM need set up VM-scoped data structure indexed by the APIC ID, e.g. Posted-Interrupt Descriptor table to support Intel IPI virtualization. It can be achieved by calling KVM_ENABLE_CAP for KVM_CAP_MAX_VCPU_ID capability once KVM has already enabled it. Otherwise, simply prompts that KVM doesn't support this capability yet. Signed-off-by: Zeng Guang <guang.zeng@xxxxxxxxx> --- hw/i386/x86.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hw/i386/x86.c b/hw/i386/x86.c index 4cf107baea..ff74492325 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -106,7 +106,7 @@ out: void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version) { - int i; + int i, ret; const CPUArchIdList *possible_cpus; MachineState *ms = MACHINE(x86ms); MachineClass *mc = MACHINE_GET_CLASS(x86ms); @@ -123,6 +123,13 @@ void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version) */ x86ms->apic_id_limit = x86_cpu_apic_id_from_index(x86ms, ms->smp.max_cpus - 1) + 1; + + ret = kvm_vm_enable_cap(kvm_state, KVM_CAP_MAX_VCPU_ID, + 0, x86ms->apic_id_limit); + if (ret < 0) { + error_report("kvm: Set max vcpu id not supported: %s", strerror(-ret)); + } + possible_cpus = mc->possible_cpu_arch_ids(ms); for (i = 0; i < ms->smp.cpus; i++) { x86_cpu_new(x86ms, possible_cpus->cpus[i].arch_id, &error_fatal); -- 2.27.0