mirror of https://github.com/proxmox/mirror_qemu
i386: Omit all-zeroes entries from KVM CPUID table
KVM has a 80-entry limit at KVM_SET_CPUID2. With the introduction of CPUID[0x1F], it is now possible to hit this limit with unusual CPU configurations, e.g.: $ ./x86_64-softmmu/qemu-system-x86_64 \ -smp 1,dies=2,maxcpus=2 \ -cpu EPYC,check=off,enforce=off \ -machine accel=kvm qemu-system-x86_64: kvm_init_vcpu failed: Argument list too long This happens because QEMU adds a lot of all-zeroes CPUID entries for unused CPUID leaves. In the example above, we end up creating 48 all-zeroes CPUID entries. KVM already returns all-zeroes when emulating the CPUID instruction if an entry is missing, so the all-zeroes entries are redundant. Skip those entries. This reduces the CPUID table size by half while keeping CPUID output unchanged. Reported-by: Yumei Huang <yuhuang@redhat.com> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1741508 Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Message-Id: <20190822225210.32541-1-ehabkost@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>master
parent
76ecd7a514
commit
af95cafb87
|
@ -1567,6 +1567,13 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||||
c->function = i;
|
c->function = i;
|
||||||
c->flags = 0;
|
c->flags = 0;
|
||||||
cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
|
cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
|
||||||
|
if (!c->eax && !c->ebx && !c->ecx && !c->edx) {
|
||||||
|
/*
|
||||||
|
* KVM already returns all zeroes if a CPUID entry is missing,
|
||||||
|
* so we can omit it and avoid hitting KVM's 80-entry limit.
|
||||||
|
*/
|
||||||
|
cpuid_i--;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1631,6 +1638,13 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||||
c->function = i;
|
c->function = i;
|
||||||
c->flags = 0;
|
c->flags = 0;
|
||||||
cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
|
cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
|
||||||
|
if (!c->eax && !c->ebx && !c->ecx && !c->edx) {
|
||||||
|
/*
|
||||||
|
* KVM already returns all zeroes if a CPUID entry is missing,
|
||||||
|
* so we can omit it and avoid hitting KVM's 80-entry limit.
|
||||||
|
*/
|
||||||
|
cpuid_i--;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue