Skip to contentSkip to conversation

why x2apic's set by default without host support(on Nehalem CPU).

Qemu-devel Peter Huang(Peng) 4 participants 9 messages Jul 22, 2013 – Jul 24, 2013 KVM

lore
Share & tools
lore
#0 lore raw

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_tsc
arch_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

#1 lore raw

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 lm constant_tsc
arch_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

#2 lore raw

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=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 lm constant_tsc
arch_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

#3 lore raw

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=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 lm constant_tsc
arch_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

#4 lore raw
In reply to Peter Huang(Peng)
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
#5 lore raw
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!

#6 lore raw
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

#7 lore raw

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

#8 lore raw

[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.