From d4c007e6d58916d2d4eb0b71863dca834c5233f8 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Wed, 15 Jun 2016 16:15:44 +0200 Subject: [PATCH] domcaps: Add CPU usable flag In case a hypervisor is able to tell us a list of supported CPU models and whether each CPU models can be used on the current host, we can propagate this to domain capabilities. This is a better alternative to calling virConnectCompareCPU for each supported CPU model. Signed-off-by: Jiri Denemark --- docs/formatdomaincaps.html.in | 10 +++- docs/schemas/domaincaps.rng | 7 +++ src/conf/domain_capabilities.c | 28 ++++++--- src/conf/domain_capabilities.h | 16 ++++- src/libvirt_private.syms | 2 + src/qemu/qemu_capabilities.c | 15 +++-- tests/domaincapsschemadata/full.xml | 6 +- .../qemu_1.7.0.x86_64.xml | 48 +++++++-------- .../qemu_2.6.0-gicv2-virt.aarch64.xml | 60 +++++++++---------- .../qemu_2.6.0-gicv3-virt.aarch64.xml | 60 +++++++++---------- .../qemu_2.6.0.aarch64.xml | 60 +++++++++---------- .../qemu_2.6.0.ppc64le.xml | 4 +- .../qemu_2.6.0.x86_64.xml | 56 ++++++++--------- tests/domaincapstest.c | 9 ++- 14 files changed, 213 insertions(+), 168 deletions(-) diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in index ce43658e06..045ba939fe 100644 --- a/docs/formatdomaincaps.html.in +++ b/docs/formatdomaincaps.html.in @@ -156,9 +156,9 @@ <mode name='host-passthrough' supported='yes'/> <mode name='host-model' supported='yes'/> <mode name='custom' supported='yes'> - <model>Broadwell</model> - <model>Broadwell-noTSX</model> - <model>Haswell</model> + <model usable='no'>Broadwell</model> + <model usable='yes'>Broadwell-noTSX</model> + <model usable='no'>Haswell</model> ... </mode> </cpu> @@ -183,6 +183,10 @@
The mode element contains a list of supported CPU models, each described by a dedicated model element. + The usable attribute specifies whether the model can + be used on the host. A special value unknown indicates + libvirt does not have enough information to provide the usability + data.
diff --git a/docs/schemas/domaincaps.rng b/docs/schemas/domaincaps.rng index 9f3d225b5e..5a605a7e1a 100644 --- a/docs/schemas/domaincaps.rng +++ b/docs/schemas/domaincaps.rng @@ -105,6 +105,13 @@ + + + yes + no + unknown + + diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 828fa707ca..9ec416e3b0 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -29,6 +29,9 @@ #define VIR_FROM_THIS VIR_FROM_CAPABILITIES +VIR_ENUM_IMPL(virDomainCapsCPUUsable, VIR_DOMCAPS_CPU_USABLE_LAST, + "unknown", "yes", "no"); + static virClassPtr virDomainCapsClass; static virClassPtr virDomainCapsCPUModelsClass; @@ -157,7 +160,9 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) return NULL; for (i = 0; i < old->nmodels; i++) { - if (virDomainCapsCPUModelsAdd(cpuModels, old->models[i].name, -1) < 0) + if (virDomainCapsCPUModelsAdd(cpuModels, + old->models[i].name, -1, + old->models[i].usable) < 0) goto error; } @@ -184,7 +189,8 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, continue; if (virDomainCapsCPUModelsAdd(cpuModels, - old->models[i].name, -1) < 0) + old->models[i].name, -1, + old->models[i].usable) < 0) goto error; } @@ -198,13 +204,16 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, - char **name) + char **name, + virDomainCapsCPUUsable usable) { if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max, cpuModels->nmodels, 1) < 0) return -1; - VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels++].name, *name); + cpuModels->models[cpuModels->nmodels].usable = usable; + VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].name, *name); + cpuModels->nmodels++; return 0; } @@ -212,14 +221,15 @@ virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, - ssize_t nameLen) + ssize_t nameLen, + virDomainCapsCPUUsable usable) { char *copy = NULL; if (VIR_STRNDUP(copy, name, nameLen) < 0) goto error; - if (virDomainCapsCPUModelsAddSteal(cpuModels, ©) < 0) + if (virDomainCapsCPUModelsAddSteal(cpuModels, ©, usable) < 0) goto error; return 0; @@ -372,8 +382,10 @@ virDomainCapsCPUCustomFormat(virBufferPtr buf, virBufferAdjustIndent(buf, 2); for (i = 0; i < custom->nmodels; i++) { - virBufferAsprintf(buf, "%s\n", - custom->models[i].name); + virDomainCapsCPUModelPtr model = custom->models + i; + virBufferAsprintf(buf, "%s\n", + virDomainCapsCPUUsableTypeToString(model->usable), + model->name); } virBufferAdjustIndent(buf, -2); diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 57f0161be8..3ec05dc07d 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -102,10 +102,20 @@ struct _virDomainCapsFeatureGIC { virDomainCapsEnum version; /* Info about virGICVersion */ }; +typedef enum { + VIR_DOMCAPS_CPU_USABLE_UNKNOWN, + VIR_DOMCAPS_CPU_USABLE_YES, + VIR_DOMCAPS_CPU_USABLE_NO, + + VIR_DOMCAPS_CPU_USABLE_LAST +} virDomainCapsCPUUsable; +VIR_ENUM_DECL(virDomainCapsCPUUsable); + typedef struct _virDomainCapsCPUModel virDomainCapsCPUModel; typedef virDomainCapsCPUModel *virDomainCapsCPUModelPtr; struct _virDomainCapsCPUModel { char *name; + virDomainCapsCPUUsable usable; }; typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels; @@ -159,10 +169,12 @@ virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr o virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, const char **models); int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, - char **name); + char **name, + virDomainCapsCPUUsable usable); int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, - ssize_t nameLen); + ssize_t nameLen, + virDomainCapsCPUUsable usable); # define VIR_DOMAIN_CAPS_ENUM_SET(capsEnum, ...) \ do { \ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index dc4bba71f3..b6561e803a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -158,6 +158,8 @@ virDomainCapsCPUModelsAddSteal; virDomainCapsCPUModelsCopy; virDomainCapsCPUModelsFilter; virDomainCapsCPUModelsNew; +virDomainCapsCPUUsableTypeFromString; +virDomainCapsCPUUsableTypeToString; virDomainCapsEnumClear; virDomainCapsEnumSet; virDomainCapsFormat; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 92b8b026de..86e40ba4fe 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -671,7 +671,8 @@ virQEMUCapsParseX86Models(const char *output, len -= 2; } - if (virDomainCapsCPUModelsAdd(cpus, p, len) < 0) + if (virDomainCapsCPUModelsAdd(cpus, p, len, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0) goto error; } while ((p = next)); @@ -719,7 +720,8 @@ virQEMUCapsParsePPCModels(const char *output, if (*p == '\n') continue; - if (virDomainCapsCPUModelsAdd(cpus, p, t - p - 1) < 0) + if (virDomainCapsCPUModelsAdd(cpus, p, t - p - 1, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0) goto error; } while ((p = next)); @@ -2306,7 +2308,8 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, return -1; for (i = 0; i < count; i++) { - if (virDomainCapsCPUModelsAdd(qemuCaps->cpuDefinitions, name[i], -1) < 0) + if (virDomainCapsCPUModelsAdd(qemuCaps->cpuDefinitions, name[i], -1, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0) return -1; } @@ -2674,7 +2677,8 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps, for (i = 0; i < ncpus; i++) { if (virDomainCapsCPUModelsAddSteal(qemuCaps->cpuDefinitions, - &cpus[i]->name) < 0) + &cpus[i]->name, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0) goto cleanup; } @@ -3041,7 +3045,8 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, } if (virDomainCapsCPUModelsAddSteal(qemuCaps->cpuDefinitions, - &str) < 0) + &str, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0) goto cleanup; } } diff --git a/tests/domaincapsschemadata/full.xml b/tests/domaincapsschemadata/full.xml index 80fd1f0bc2..b75e86ce5d 100644 --- a/tests/domaincapsschemadata/full.xml +++ b/tests/domaincapsschemadata/full.xml @@ -23,9 +23,9 @@ - Model1 - Model2 - Model3 + Model1 + Model2 + Model3 diff --git a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml index 4ee2f9586d..2b17dd0f74 100644 --- a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml @@ -22,30 +22,30 @@ - Opteron_G5 - Opteron_G4 - Opteron_G3 - Opteron_G2 - Opteron_G1 - Haswell - SandyBridge - Westmere - Nehalem - Penryn - Conroe - n270 - athlon - pentium3 - pentium2 - pentium - 486 - coreduo - kvm32 - qemu32 - kvm64 - core2duo - phenom - qemu64 + Opteron_G5 + Opteron_G4 + Opteron_G3 + Opteron_G2 + Opteron_G1 + Haswell + SandyBridge + Westmere + Nehalem + Penryn + Conroe + n270 + athlon + pentium3 + pentium2 + pentium + 486 + coreduo + kvm32 + qemu32 + kvm64 + core2duo + phenom + qemu64 diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml index 9e96f47d80..8a54f9e3fd 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml @@ -22,36 +22,36 @@ - pxa262 - pxa270-a0 - arm1136 - cortex-a15 - pxa260 - arm1136-r2 - pxa261 - pxa255 - arm926 - arm11mpcore - pxa250 - ti925t - cortex-a57 - sa1110 - arm1176 - cortex-a53 - sa1100 - pxa270-c5 - cortex-a9 - cortex-a8 - pxa270-c0 - arm1026 - pxa270-b1 - cortex-m3 - cortex-m4 - pxa270-b0 - arm946 - cortex-r5 - pxa270-a1 - pxa270 + pxa262 + pxa270-a0 + arm1136 + cortex-a15 + pxa260 + arm1136-r2 + pxa261 + pxa255 + arm926 + arm11mpcore + pxa250 + ti925t + cortex-a57 + sa1110 + arm1176 + cortex-a53 + sa1100 + pxa270-c5 + cortex-a9 + cortex-a8 + pxa270-c0 + arm1026 + pxa270-b1 + cortex-m3 + cortex-m4 + pxa270-b0 + arm946 + cortex-r5 + pxa270-a1 + pxa270 diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml index c081b35992..8d8087fb7c 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml @@ -22,36 +22,36 @@ - pxa262 - pxa270-a0 - arm1136 - cortex-a15 - pxa260 - arm1136-r2 - pxa261 - pxa255 - arm926 - arm11mpcore - pxa250 - ti925t - cortex-a57 - sa1110 - arm1176 - cortex-a53 - sa1100 - pxa270-c5 - cortex-a9 - cortex-a8 - pxa270-c0 - arm1026 - pxa270-b1 - cortex-m3 - cortex-m4 - pxa270-b0 - arm946 - cortex-r5 - pxa270-a1 - pxa270 + pxa262 + pxa270-a0 + arm1136 + cortex-a15 + pxa260 + arm1136-r2 + pxa261 + pxa255 + arm926 + arm11mpcore + pxa250 + ti925t + cortex-a57 + sa1110 + arm1176 + cortex-a53 + sa1100 + pxa270-c5 + cortex-a9 + cortex-a8 + pxa270-c0 + arm1026 + pxa270-b1 + cortex-m3 + cortex-m4 + pxa270-b0 + arm946 + cortex-r5 + pxa270-a1 + pxa270 diff --git a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml index 811d2b7246..83c03db465 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml @@ -22,36 +22,36 @@ - pxa262 - pxa270-a0 - arm1136 - cortex-a15 - pxa260 - arm1136-r2 - pxa261 - pxa255 - arm926 - arm11mpcore - pxa250 - ti925t - cortex-a57 - sa1110 - arm1176 - cortex-a53 - sa1100 - pxa270-c5 - cortex-a9 - cortex-a8 - pxa270-c0 - arm1026 - pxa270-b1 - cortex-m3 - cortex-m4 - pxa270-b0 - arm946 - cortex-r5 - pxa270-a1 - pxa270 + pxa262 + pxa270-a0 + arm1136 + cortex-a15 + pxa260 + arm1136-r2 + pxa261 + pxa255 + arm926 + arm11mpcore + pxa250 + ti925t + cortex-a57 + sa1110 + arm1176 + cortex-a53 + sa1100 + pxa270-c5 + cortex-a9 + cortex-a8 + pxa270-c0 + arm1026 + pxa270-b1 + cortex-m3 + cortex-m4 + pxa270-b0 + arm946 + cortex-r5 + pxa270-a1 + pxa270 diff --git a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml index d96927438e..14a087bc1a 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml @@ -22,8 +22,8 @@ - POWER8 - POWER7 + POWER8 + POWER7 diff --git a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml index 80101a401d..4294c64c59 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml @@ -22,34 +22,34 @@ - Opteron_G5 - Opteron_G4 - Opteron_G3 - Opteron_G2 - Opteron_G1 - Broadwell - Broadwell-noTSX - Haswell - Haswell-noTSX - IvyBridge - SandyBridge - Westmere - Nehalem - Penryn - Conroe - n270 - athlon - pentium3 - pentium2 - pentium - 486 - coreduo - kvm32 - qemu32 - kvm64 - core2duo - phenom - qemu64 + Opteron_G5 + Opteron_G4 + Opteron_G3 + Opteron_G2 + Opteron_G1 + Broadwell + Broadwell-noTSX + Haswell + Haswell-noTSX + IvyBridge + SandyBridge + Westmere + Nehalem + Penryn + Conroe + n270 + athlon + pentium3 + pentium2 + pentium + 486 + coreduo + kvm32 + qemu32 + kvm64 + core2duo + phenom + qemu64 diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 10b745209d..511066d9ab 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -81,9 +81,12 @@ fillAllCaps(virDomainCapsPtr domCaps) cpu->hostPassthrough = true; cpu->hostModel = true; if (!(cpu->custom = virDomainCapsCPUModelsNew(3)) || - virDomainCapsCPUModelsAdd(cpu->custom, "Model1", -1) < 0 || - virDomainCapsCPUModelsAdd(cpu->custom, "Model2", -1) < 0 || - virDomainCapsCPUModelsAdd(cpu->custom, "Model3", -1) < 0) + virDomainCapsCPUModelsAdd(cpu->custom, "Model1", -1, + VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 || + virDomainCapsCPUModelsAdd(cpu->custom, "Model2", -1, + VIR_DOMCAPS_CPU_USABLE_NO) < 0 || + virDomainCapsCPUModelsAdd(cpu->custom, "Model3", -1, + VIR_DOMCAPS_CPU_USABLE_YES) < 0) return -1; disk->supported = true;