Description of problem: When CPUs in host aren't equal.libvirt should report error to user. Or successfully starting one guest will depends on the cpu' capabilities that libvirtd' work threads running on. There is one test machine which has 4 cpus,but cpu0 doesn't have the monitor flag,and the other cpus have it.When start one guest with sandybridge cpu model . it will success when libvirtd' worker threads on cpu1-3 ,fail on cpu0. Version-Release number of selected component (if applicable): qemu-kvm-0.12.1.2-2.329.el6.x86_64 libvirt-0.10.2-7.el6.x86_64 kernel-2.6.32-335.el6.x86_6 How reproducible: 100% Steps to Reproduce: # for i in {1..5};do virsh capabilities|grep monitor|wc -l;done 1 1 0 0 0 # virsh capabilities (There isn't the "monitor" feature ,libvirtd is running on cpu0, but host cpu 1-3 include it) <capabilities> <host> <uuid>5bc55087-5efb-5107-6702-5133293b515f</uuid> <cpu> <arch>x86_64</arch> <model>SandyBridge</model> <vendor>Intel</vendor> <topology sockets='1' cores='4' threads='1'/> <feature name='osxsave'/> <feature name='pdcm'/> <feature name='xtpr'/> <feature name='tm2'/> <feature name='est'/> <feature name='smx'/> <feature name='vmx'/> <feature name='ds_cpl'/> <feature name='dtes64'/> <feature name='pbe'/> <feature name='tm'/> <feature name='ht'/> <feature name='ss'/> <feature name='acpi'/> <feature name='ds'/> <feature name='vme'/> </cpu> ...... <capabilities> # virsh start rhel6.3-new error: Failed to start domain rhel6.3-new error: unsupported configuration: guest and host CPU are not compatible: Host CPU does not provide required features: monitor # virsh dumpxml rhel6.3-new (There is the "monitor" feature) <domain type='kvm'> ...... <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> <vendor>Intel</vendor> <feature policy='require' name='tm2'/> <feature policy='require' name='est'/> <feature policy='require' name='monitor'/> ...... </cpu> ..... </domain> Actual results: When CPUs in host aren't equal , successfully starting one guest will depends on the cpu' capabilities that libvirtd'work threads running on. Expected results: When CPUs in host aren't equal.libvirt should report error to user. Additional info:
Created attachment 639729 [details] cpuinfo
I don't think we should report an error right away. If the processors aren't equal the user is still able to start guests that use the flags that are shared by all the cores. To fix this, we will need to run the CPUID code on every processor and then calculate an intersection of all those flags to get the largest subset of flags that are supported by the system. (And probably introduce som kind of caching of this data so we don't need to re-calculate them every time)
Yeah given the weirdness of a non-uniform CPU layout, I'm just closing this as DEFERRED, we can address it if anyone ever has problems in production