why x2apic's set by default without host support(on Nehalem CPU).
Hi, Everyone
I have been encountered a problem recently.
My box uses Nehalem E5520 CPU, and this model doesn't support x2apic feature. I created a VM on KVM, and uses cpu mode=pass-through, I can get the right cpu model from the VM, but I can also see that the CPU in the vm supports x2apic.
This seems werid.
Quoted 1 line
From QEMU's CPU model definition, Nehalem also doesn't support x2apic.
Can anyone explain it?
Thanks to you all!
Below is the cpuinfo from host and guest:
host:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tscarch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dtherm tpr_shadow vnmi flexpriority ept vpid
vm:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon rep_good
nopl pni ssse3 cx16 sse4_1 sse4_2 *x2apic *popcnt hypervisor lahf_lm
I traced the qemu process, and find out that host cpuid doesn't support x2apic, but VM interception seems enabled x2apic.
with function=1(bit 21 indicates x2apic)
host_cpuid:ecx=0x009ce3bd
guest_cpuid:ecx=0x00b82201
Quoted 26 lines · Peter Huang(Peng)
Hi, Everyone
I have been encountered a problem recently.
My box uses Nehalem E5520 CPU, and this model doesn't support x2apic feature. I created a VM on KVM, and uses cpu mode=pass-through, I can get the right cpu model from the VM, but I can also see that the CPU in the vm supports x2apic.This seems werid.
From QEMU's CPU model definition, Nehalem also doesn't support x2apic.Can anyone explain it?
Thanks to you all!
Below is the cpuinfo from host and guest:
host:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lmconstant_tscarch_perfmonpebs btsrep_goodnopl xtopologynonstop_tscaperfmperf pni dtes64 monitords_cplvmx est tm2 ssse3 cx16 xtpr pdcm dcasse4_1sse4_2popcntlahf_lmdthermtpr_shadowvnmi flexpriority ept vpidvm:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx rdtscp lmconstant_tscarch_perfmonrep_good
nopl pni ssse3 cx16sse4_1sse4_2*x2apic *popcnt hypervisorlahf_lm
Peter,
Because x2apic support is emulated in software.
Quoted 34 lines · Peter Huang(Peng)
I traced the qemu process, and find out that host cpuid doesn't support x2apic, but VM interception seems enabled x2apic.
with function=1(bit 21 indicates x2apic)
host_cpuid:ecx=0x009ce3bd
guest_cpuid:ecx=0x00b82201Quoted 26 lines · Peter Huang(Peng)
Hi, Everyone
I have been encountered a problem recently.
My box uses Nehalem E5520 CPU, and this model doesn't support x2apic feature. I created a VM on KVM, and uses cpu mode=pass-through, I can get the right cpu model from the VM, but I can also see that the CPU in the vm supports x2apic.This seems werid.
From QEMU's CPU model definition, Nehalem also doesn't support x2apic.Can anyone explain it?
Thanks to you all!
Below is the cpuinfo from host and guest:
host:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lmconstant_tscarch_perfmonpebs btsrep_goodnopl xtopologynonstop_tscaperfmperf pni dtes64 monitords_cplvmx est tm2 ssse3 cx16 xtpr pdcm dcasse4_1sse4_2popcntlahf_lmdthermtpr_shadowvnmi flexpriority ept vpidvm:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx rdtscp lmconstant_tscarch_perfmonrep_good
nopl pni ssse3 cx16sse4_1sse4_2*x2apic *popcnt hypervisorlahf_lm
Hi, Marcelo
Thanks for replying.
I noticed that, kvm has emulated x2apic, but I can't find where the code exits. Could you give me some hint?
Thanks again.
Quoted 39 lines · Marcelo Tosatti
Peter,
Because x2apic support is emulated in software.
Quoted 34 lines · Peter Huang(Peng)
I traced the qemu process, and find out that host cpuid doesn't support x2apic, but VM interception seems enabled x2apic.
with function=1(bit 21 indicates x2apic)
host_cpuid:ecx=0x009ce3bd
guest_cpuid:ecx=0x00b82201Quoted 26 lines · Peter Huang(Peng)
Hi, Everyone
I have been encountered a problem recently.
My box uses Nehalem E5520 CPU, and this model doesn't support x2apic feature. I created a VM on KVM, and uses cpu mode=pass-through, I can get the right cpu model from the VM, but I can also see that the CPU in the vm supports x2apic.This seems werid.
From QEMU's CPU model definition, Nehalem also doesn't support x2apic.Can anyone explain it?
Thanks to you all!
Below is the cpuinfo from host and guest:
host:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lmconstant_tscarch_perfmonpebs btsrep_goodnopl xtopologynonstop_tscaperfmperf pni dtes64 monitords_cplvmx est tm2 ssse3 cx16 xtpr pdcm dcasse4_1sse4_2popcntlahf_lmdthermtpr_shadowvnmi flexpriority ept vpidvm:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx rdtscp lmconstant_tscarch_perfmonrep_good
nopl pni ssse3 cx16sse4_1sse4_2*x2apic *popcnt hypervisorlahf_lm
Quoted 7 lines · Peter Huang(Peng)
Hi, Everyone
I have been encountered a problem recently.
My box uses Nehalem E5520 CPU, and this model doesn't support x2apic feature. I created a VM on KVM, and uses cpu mode=pass-through, I can get the right cpu model from the VM, but I can also see that the CPU in the vm supports x2apic.
Quoted 5 lines
This seems werid.
From QEMU's CPU model definition, Nehalem also doesn't support x2apic.Can anyone explain it?
libvirt's "host-passthrough" uses "-cpu host', and it "-cpu host" enables every feature that can be enabled on the host. As KVM x2apic emulation doesn't require host CPU support, it gets enabled.
If the behavior of "-cpu host" doesn't match libvirt expectations, we need to clarify what are the requirements, and maybe have a "try to be close to host CPU mode" as opposed to the current "enable everything that can be enabled" mode.
Signature · 1 line
Eduardo
Quoted 3 lines
libvirt's "host-passthrough" uses "-cpu host', and it "-cpu host" enables every feature that can be enabled on the host.
From my test results, I found that even when use host-passthrough mode, VM's
cpu features are very different from host, this doesn't match what host-passthrough mode's explanation.
libvirt's option exlanation:
With this mode, the CPU visible to the guest should be exactly the same as the host CPU even in the aspects that libvirt does not understand.
Quoted 4 lines
If the behavior of "-cpu host" doesn't match libvirt expectations, we need to clarify what are the requirements, and maybe have a "try to be close to host CPU mode" as opposed to the current "enable everything that can be enabled" mode.
Does the results above indicates what you mean to do? or the current way doesn't work as we expect.
Thanks!
Quoted 9 lines · Peter Huang(Peng)
Quoted 2 lines
libvirt's "host-passthrough" uses "-cpu host', and it "-cpu host" enables every feature that can be enabled on the host.
From my test results, I found that even when use host-passthrough mode, VM's cpu features are very different from host, this doesn't match what host-passthrough mode's explanation.
libvirt's option exlanation:
With this mode, the CPU visible to the guest should be exactly the same as the host CPU even in the aspects that libvirt does not understand.
The libvirt documentation is what needs to be updated. While host-passthrough is asking for a CPU which is as close as possible to the real host CPU, there are features that need special handling before they can be provided to a guest. And if the hypervisor does not provide that handling, it may just filter such feature out. Also if some features can be efficiently provided to a guest even though the host CPU does not provide them (x2apic is an example of such feature), they may be provided to a guest.
Jirka
Hi,Jiri
Thanks for replying.
So why VM identified different features from host is due to the hypervisor filtering. I will dig into the hypervisor of how it filter features, and update status later.
Thanks again.
Quoted 21 lines · Jiri Denemark
Quoted 9 lines · Peter Huang(Peng)
Quoted 2 lines
libvirt's "host-passthrough" uses "-cpu host', and it "-cpu host" enables every feature that can be enabled on the host.
From my test results, I found that even when use host-passthrough mode, VM's cpu features are very different from host, this doesn't match what host-passthrough mode's explanation.
libvirt's option exlanation:
With this mode, the CPU visible to the guest should be exactly the same as the host CPU even in the aspects that libvirt does not understand.The libvirt documentation is what needs to be updated. While host-passthrough is asking for a CPU which is as close as possible to the real host CPU, there are features that need special handling before they can be provided to a guest. And if the hypervisor does not provide that handling, it may just filter such feature out. Also if some features can be efficiently provided to a guest even though the host CPU does not provide them (x2apic is an example of such feature), they may be provided to a guest.
Jirka
[Qemu-devel] [Solved]FYI//Re: [Question] why x2apic's set by default without host support(on Nehalem CPU).
FYI, just for information sharing.
KVM emulated x2apic feature no matter host supports it or not. You can get the code from arch/x86/kvm/cpuid.c. kvm_dev_ioctl_get_supported_cpuid ()->do_cpuid_ent()
/* we support x2apic emulation even if host does not support
* it since we emulate x2apic in software */
entry->ecx |= F(*X2APIC*);
QEMU will get this feature through kvm_ioctl().
Quoted 8 lines · Peter Huang(Peng)
Hi,Jiri
Thanks for replying.
So why VM identified different features from host is due to the hypervisor filtering. I will dig into the hypervisor of how it filter features, and update status later.
Thanks again.