[libvirt] Unable to start Nehalem VM on Nehalem host

Ruben Kerkhof ruben at rubenkerkhof.com
Mon Mar 10 14:58:01 UTC 2014


Hi list,

I'm trying to debug a strange issue I have, and I'd appreciate some help.

I've upgraded libvirt to 1.2.2, on Scientific Linux, with qemu-kvm-0.12.1.2-2.415.el6_5.3

Here’s my analysis so far:
I figured out that libvirt uses HMP to get the list of models from qemu-kvm by running qemu-kvm -cpu ?model -nodefconfig. This returns the following:

x86       Opteron_G5  AMD Opteron 63xx class CPU                      
x86       Opteron_G4  AMD Opteron 62xx class CPU                      
x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)          
x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)          
x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)           
x86       Haswell  Intel Core Processor (Haswell)                  
x86       SandyBridge  Intel Xeon E312xx (Sandy Bridge)                
x86       Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)          
x86       Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)       
x86       Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)    
x86       Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)   
x86       cpu64-rhel5  QEMU Virtual CPU version (cpu64-rhel5)          
x86       cpu64-rhel6  QEMU Virtual CPU version (cpu64-rhel6)          
x86       n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz          
x86       athlon  QEMU Virtual CPU version 0.12.1                 
x86       pentium3                                                  
x86       pentium2                                                  
x86       pentium                                                  
x86       486                                                  
x86       coreduo  Genuine Intel(R) CPU           T2600  @ 2.16GHz 
x86       qemu32  QEMU Virtual CPU version 0.12.1                 
x86       kvm64  Common KVM processor                            
x86       core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz 
x86       phenom  AMD Phenom(tm) 9550 Quad-Core Processor         
x86       qemu64  QEMU Virtual CPU version 0.12.1                

The comment describing the function parsing this list states that the output is expected to be as follows:
/* Format:
 *      <arch> <model>
 * qemu-0.13 encloses some model names in []:
 *      <arch> [<model>]
 */
static int
virQEMUCapsParseX86Models(const char *output,
                          virQEMUCapsPtr qemuCaps)
{

but this function doesn’t strip the rest of the line, so the models array becomes:

Breakpoint 1, x86Decode (cpu=0x7fffd82a8460, data=0x7fffd8272d00, models=0x7fffd82b7440, nmodels=25, preferred=0x7fffd82a81f0 "Nehalem", flags=0) at cpu/cpu_x86.c:1487
1487	{
(gdb) p models
$1 = (const char **) 0x7fffd82b7440
(gdb) p *models
$2 = 0x7fffd82ba240 "Opteron_G5  AMD Opteron 63xx class CPU", ' ' <repeats 22 times>
(gdb) p *models at 25
$3 = {0x7fffd82ba240 "Opteron_G5  AMD Opteron 63xx class CPU", ' ' <repeats 22 times>, 0x7fffd82c8c30 "Opteron_G4  AMD Opteron 62xx class CPU", ' ' <repeats 22 times>, 
  0x7fffd8169e00 "Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)          ", 0x7fffd8169cb0 "Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)          ", 
  0x7fffd8169b60 "Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)", ' ' <repeats 11 times>, 0x7fffd8169a10 "Haswell  Intel Core Processor (Haswell)", ' ' <repeats 18 times>, 
  0x7fffd81697e0 "SandyBridge  Intel Xeon E312xx (Sandy Bridge)", ' ' <repeats 16 times>, 0x7fffd8169690 "Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)          ", 
  0x7fffd8169460 "Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)       ", 0x7fffd81693f0 "Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)    ", 0x7fffd8169310 "Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)   ", 
  0x7fffd8169230 "cpu64-rhel5  QEMU Virtual CPU version (cpu64-rhel5)          ", 0x7fffd8169150 "cpu64-rhel6  QEMU Virtual CPU version (cpu64-rhel6)          ", 0x7fffd82ba2b0 "n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz          ", 
  0x7fffd81690e0 "athlon  QEMU Virtual CPU version 0.12.1", ' ' <repeats 17 times>, 0x7fffd8169000 "pentium3", ' ' <repeats 50 times>, 0x7fffd8168f90 "pentium2", ' ' <repeats 50 times>, 0x7fffd8168eb0 "pentium", ' ' <repeats 50 times>, 
  0x7fffd82a8760 "486", ' ' <repeats 50 times>, 0x7fffd8168e40 "coreduo  Genuine Intel(R) CPU", ' ' <repeats 11 times>, "T2600  @ 2.16GHz ", 0x7fffd8168d60 "qemu32  QEMU Virtual CPU version 0.12.1", ' ' <repeats 17 times>, 
  0x7fffd82bb150 "kvm64  Common KVM processor", ' ' <repeats 28 times>, 0x7fffd8168cf0 "core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz ", 0x7fffd8168c10 "phenom  AMD Phenom(tm) 9550 Quad-Core Processor         ", 
  0x7fffd8168b30 "qemu64  QEMU Virtual CPU version 0.12.1", ' ' <repeats 17 times>}

cpuModellsAllowed then does a strcmp between “Nehalem” and "Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)” which fails, and the vm fails to start with:
2014-03-10 14:56:16.917+0000: 8328: info : qemuDomainDefineXML:6231 : Creating domain '530df8bd-7b64-4553-b4f4-18922e1327bf'
2014-03-10 14:56:17.114+0000: 8329: warning : x86Decode:1515 : Preferred CPU model Nehalem not allowed by hypervisor; closest supported model will be used
2014-03-10 14:56:17.114+0000: 8329: error : x86Decode:1571 : internal error: Cannot find suitable CPU model for given data

Kind regards,

Ruben Kerkhof





More information about the libvir-list mailing list