[libvirt] [PATCH v2 0/7] cpuGetModels: Create a NULL-terminated list

The list of CPU models is freed using virStringFreeList, which expects the list to by NULL-terminated. Jiri Denemark (7): cpu_x86: Use array of models in CPU map cpu_x86: Use array of vendors in CPU map cpu_x86: Use array of features in CPU map cpu_ppc64: Use array of vendors in CPU map cpu_ppc64: Use array of models in CPU map cpu: Rework CPU map loading cpu: Fix documentation of cpuGetModels src/cpu/cpu.c | 2 +- src/cpu/cpu_map.c | 21 +- src/cpu/cpu_map.h | 2 + src/cpu/cpu_ppc64.c | 216 +++++------ src/cpu/cpu_x86.c | 395 +++++++++++---------- tests/cputestdata/x86-baseline-3-expanded.xml | 62 ++-- tests/cputestdata/x86-baseline-4-expanded.xml | 80 ++--- tests/cputestdata/x86-baseline-4-result.xml | 18 +- tests/cputestdata/x86-baseline-5-expanded.xml | 80 ++--- tests/cputestdata/x86-baseline-5-result.xml | 8 +- tests/cputestdata/x86-baseline-6-migratable.xml | 8 +- tests/cputestdata/x86-baseline-6-result.xml | 10 +- .../cputestdata/x86-host+guest,model486-result.xml | 62 ++-- .../x86-host+guest,models,Penryn-result.xml | 14 +- .../x86-host+guest,models,qemu64-result.xml | 14 +- tests/cputestdata/x86-host+guest,models-result.xml | 14 +- tests/cputestdata/x86-host+guest-result.xml | 10 +- ...6-host+host+host-model,models,Penryn-result.xml | 28 +- tests/cputestdata/x86-host+min.xml | 26 +- tests/cputestdata/x86-host+pentium3.xml | 46 +-- .../x86-host+strict-force-extra-result.xml | 28 +- ...aswell-noTSX+Haswell,haswell,Haswell-result.xml | 2 +- ...+Haswell-noTSX,haswell,Haswell-noTSX-result.xml | 2 +- .../x86-host-better+pentium3,core2duo-result.xml | 32 +- .../x86-host-better+pentium3,pentium3-result.xml | 50 +-- .../x86-host-better+pentium3-result.xml | 26 +- tests/cputestdata/x86-host-worse+guest-result.xml | 6 +- .../qemuxml2argv-cpu-Haswell2.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 2 +- .../qemuxml2argv-cpu-exact2-nofallback.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 2 +- .../qemuxml2argv-cpu-host-model-fallback.args | 4 +- .../qemuxml2argv-cpu-host-model-vendor.args | 4 +- .../qemuxml2argv-cpu-host-model.args | 4 +- .../qemuxml2argv-cpu-minimum1.args | 4 +- .../qemuxml2argv-cpu-minimum2.args | 4 +- .../qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 2 +- .../qemuxml2argv-graphics-spice-timeout.args | 4 +- 38 files changed, 658 insertions(+), 638 deletions(-) -- 2.8.2

There's no reason for keeping the models in a linked list. Especially when we know upfront the total number of models we are loading. As a nice side effect, this fixes x86GetModels to always return a NULL-terminated list of models. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_x86.c | 65 ++++++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 4263d1e..5e4fa28 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -97,8 +97,6 @@ struct _virCPUx86Model { char *name; virCPUx86VendorPtr vendor; virCPUx86Data *data; - - virCPUx86ModelPtr next; }; typedef struct _virCPUx86Map virCPUx86Map; @@ -106,7 +104,8 @@ typedef virCPUx86Map *virCPUx86MapPtr; struct _virCPUx86Map { virCPUx86VendorPtr vendors; virCPUx86FeaturePtr features; - virCPUx86ModelPtr models; + size_t nmodels; + virCPUx86ModelPtr *models; virCPUx86FeaturePtr migrate_blockers; }; @@ -859,14 +858,11 @@ static virCPUx86ModelPtr x86ModelFind(virCPUx86MapPtr map, const char *name) { - virCPUx86ModelPtr model; + size_t i; - model = map->models; - while (model) { - if (STREQ(model->name, name)) - return model; - - model = model->next; + for (i = 0; i < map->nmodels; i++) { + if (STREQ(map->models[i]->name, name)) + return map->models[i]; } return NULL; @@ -1094,9 +1090,8 @@ x86ModelLoad(xmlXPathContextPtr ctxt, goto cleanup; } - model->next = map->models; - map->models = model; - model = NULL; + if (VIR_APPEND_ELEMENT(map->models, map->nmodels, model) < 0) + goto cleanup; ret = 0; @@ -1111,6 +1106,8 @@ x86ModelLoad(xmlXPathContextPtr ctxt, static void x86MapFree(virCPUx86MapPtr map) { + size_t i; + if (!map) return; @@ -1120,11 +1117,9 @@ x86MapFree(virCPUx86MapPtr map) x86FeatureFree(feature); } - while (map->models) { - virCPUx86ModelPtr model = map->models; - map->models = model->next; - x86ModelFree(model); - } + for (i = 0; i < map->nmodels; i++) + x86ModelFree(map->models[i]); + VIR_FREE(map->models); while (map->vendors) { virCPUx86VendorPtr vendor = map->vendors; @@ -1592,7 +1587,7 @@ x86Decode(virCPUDefPtr cpu, virCPUx86Data *features = NULL; const virCPUx86Data *cpuData = NULL; virCPUx86VendorPtr vendor; - size_t i; + ssize_t i; int rc; virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | @@ -1603,7 +1598,11 @@ x86Decode(virCPUDefPtr cpu, vendor = x86DataToVendor(data, map); - for (candidate = map->models; candidate; candidate = candidate->next) { + /* Walk through the CPU models in reverse order to check newest + * models first. + */ + for (i = map->nmodels - 1; i >= 0; i--) { + candidate = map->models[i]; if (!cpuModelIsAllowed(candidate->name, models, nmodels)) { if (preferred && STREQ(candidate->name, preferred)) { if (cpu->fallback != VIR_CPU_FALLBACK_ALLOW) { @@ -2211,34 +2210,22 @@ static int x86GetModels(char ***models) { virCPUx86MapPtr map; - virCPUx86ModelPtr model; - char *name; - size_t nmodels = 0; + size_t i; if (!(map = virCPUx86GetMap())) return -1; - if (models && VIR_ALLOC_N(*models, 0) < 0) - goto error; + if (models) { + if (VIR_ALLOC_N(*models, map->nmodels + 1) < 0) + goto error; - model = map->models; - while (model) { - if (models) { - if (VIR_STRDUP(name, model->name) < 0) + for (i = 0; i < map->nmodels; i++) { + if (VIR_STRDUP((*models)[i], map->models[i]->name) < 0) goto error; - - if (VIR_APPEND_ELEMENT(*models, nmodels, name) < 0) { - VIR_FREE(name); - goto error; - } - } else { - nmodels++; } - - model = model->next; } - return nmodels; + return map->nmodels; error: if (models) { -- 2.8.2

There's no reason for keeping the vendors in a linked list. Especially when we know upfront the total number of models we are loading. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_x86.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 5e4fa28..ca0e9b7 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -49,8 +49,6 @@ typedef virCPUx86Vendor *virCPUx86VendorPtr; struct _virCPUx86Vendor { char *name; virCPUx86CPUID cpuid; - - virCPUx86VendorPtr next; }; typedef struct _virCPUx86Feature virCPUx86Feature; @@ -102,7 +100,8 @@ struct _virCPUx86Model { typedef struct _virCPUx86Map virCPUx86Map; typedef virCPUx86Map *virCPUx86MapPtr; struct _virCPUx86Map { - virCPUx86VendorPtr vendors; + size_t nvendors; + virCPUx86VendorPtr *vendors; virCPUx86FeaturePtr features; size_t nmodels; virCPUx86ModelPtr *models; @@ -433,16 +432,16 @@ static virCPUx86VendorPtr x86DataToVendor(const virCPUx86Data *data, virCPUx86MapPtr map) { - virCPUx86VendorPtr vendor = map->vendors; virCPUx86CPUID *cpuid; + size_t i; - while (vendor) { + for (i = 0; i < map->nvendors; i++) { + virCPUx86VendorPtr vendor = map->vendors[i]; if ((cpuid = x86DataCpuid(data, vendor->cpuid.function)) && x86cpuidMatchMasked(cpuid, &vendor->cpuid)) { x86cpuidClearBits(cpuid, &vendor->cpuid); return vendor; } - vendor = vendor->next; } return NULL; @@ -506,14 +505,11 @@ static virCPUx86VendorPtr x86VendorFind(virCPUx86MapPtr map, const char *name) { - virCPUx86VendorPtr vendor; + size_t i; - vendor = map->vendors; - while (vendor) { - if (STREQ(vendor->name, name)) - return vendor; - - vendor = vendor->next; + for (i = 0; i < map->nvendors; i++) { + if (STREQ(map->vendors[i]->name, name)) + return map->vendors[i]; } return NULL; @@ -562,9 +558,8 @@ x86VendorLoad(xmlXPathContextPtr ctxt, vendor->cpuid.edx = virReadBufInt32LE(string + 4); vendor->cpuid.ecx = virReadBufInt32LE(string + 8); - vendor->next = map->vendors; - map->vendors = vendor; - vendor = NULL; + if (VIR_APPEND_ELEMENT(map->vendors, map->nvendors, vendor) < 0) + goto cleanup; ret = 0; @@ -1121,11 +1116,9 @@ x86MapFree(virCPUx86MapPtr map) x86ModelFree(map->models[i]); VIR_FREE(map->models); - while (map->vendors) { - virCPUx86VendorPtr vendor = map->vendors; - map->vendors = vendor->next; - x86VendorFree(vendor); - } + for (i = 0; i < map->nvendors; i++) + x86VendorFree(map->vendors[i]); + VIR_FREE(map->vendors); while (map->migrate_blockers) { virCPUx86FeaturePtr migrate_blocker = map->migrate_blockers; -- 2.8.2

There's no reason for keeping the features in a linked list. Especially when we know upfront the total number of features we are loading. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_x86.c | 121 ++++++++------------- tests/cputestdata/x86-baseline-3-expanded.xml | 62 +++++------ tests/cputestdata/x86-baseline-4-expanded.xml | 80 +++++++------- tests/cputestdata/x86-baseline-4-result.xml | 18 +-- tests/cputestdata/x86-baseline-5-expanded.xml | 80 +++++++------- tests/cputestdata/x86-baseline-5-result.xml | 8 +- tests/cputestdata/x86-baseline-6-migratable.xml | 8 +- tests/cputestdata/x86-baseline-6-result.xml | 10 +- .../cputestdata/x86-host+guest,model486-result.xml | 62 +++++------ .../x86-host+guest,models,Penryn-result.xml | 14 +-- .../x86-host+guest,models,qemu64-result.xml | 14 +-- tests/cputestdata/x86-host+guest,models-result.xml | 14 +-- tests/cputestdata/x86-host+guest-result.xml | 10 +- ...6-host+host+host-model,models,Penryn-result.xml | 28 ++--- tests/cputestdata/x86-host+min.xml | 26 ++--- tests/cputestdata/x86-host+pentium3.xml | 46 ++++---- .../x86-host+strict-force-extra-result.xml | 28 ++--- ...aswell-noTSX+Haswell,haswell,Haswell-result.xml | 2 +- ...+Haswell-noTSX,haswell,Haswell-noTSX-result.xml | 2 +- .../x86-host-better+pentium3,core2duo-result.xml | 32 +++--- .../x86-host-better+pentium3,pentium3-result.xml | 50 ++++----- .../x86-host-better+pentium3-result.xml | 26 ++--- tests/cputestdata/x86-host-worse+guest-result.xml | 6 +- .../qemuxml2argv-cpu-Haswell2.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 2 +- .../qemuxml2argv-cpu-exact2-nofallback.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 2 +- .../qemuxml2argv-cpu-host-model-fallback.args | 4 +- .../qemuxml2argv-cpu-host-model-vendor.args | 4 +- .../qemuxml2argv-cpu-host-model.args | 4 +- .../qemuxml2argv-cpu-minimum1.args | 4 +- .../qemuxml2argv-cpu-minimum2.args | 4 +- .../qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 2 +- .../qemuxml2argv-graphics-spice-timeout.args | 4 +- 34 files changed, 376 insertions(+), 405 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index ca0e9b7..81ff3be 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -56,8 +56,6 @@ typedef virCPUx86Feature *virCPUx86FeaturePtr; struct _virCPUx86Feature { char *name; virCPUx86Data *data; - - virCPUx86FeaturePtr next; }; typedef struct _virCPUx86KVMFeature virCPUx86KVMFeature; @@ -102,10 +100,12 @@ typedef virCPUx86Map *virCPUx86MapPtr; struct _virCPUx86Map { size_t nvendors; virCPUx86VendorPtr *vendors; - virCPUx86FeaturePtr features; + size_t nfeatures; + virCPUx86FeaturePtr *features; size_t nmodels; virCPUx86ModelPtr *models; - virCPUx86FeaturePtr migrate_blockers; + size_t nblockers; + virCPUx86FeaturePtr *migrate_blockers; }; static virCPUx86MapPtr cpuMap; @@ -412,15 +412,15 @@ x86DataToCPUFeatures(virCPUDefPtr cpu, virCPUx86Data *data, virCPUx86MapPtr map) { - virCPUx86FeaturePtr feature = map->features; + size_t i; - while (feature) { + for (i = 0; i < map->nfeatures; i++) { + virCPUx86FeaturePtr feature = map->features[i]; if (x86DataIsSubset(data, feature->data)) { x86DataSubtract(data, feature->data); if (virCPUDefAddFeature(cpu, feature->name, policy) < 0) return -1; } - feature = feature->next; } return 0; @@ -600,39 +600,14 @@ x86FeatureFree(virCPUx86FeaturePtr feature) static virCPUx86FeaturePtr -x86FeatureCopy(virCPUx86FeaturePtr src) -{ - virCPUx86FeaturePtr feature; - - if (VIR_ALLOC(feature) < 0) - return NULL; - - if (VIR_STRDUP(feature->name, src->name) < 0) - goto error; - - if (!(feature->data = x86DataCopy(src->data))) - goto error; - - return feature; - - error: - x86FeatureFree(feature); - return NULL; -} - - -static virCPUx86FeaturePtr x86FeatureFind(virCPUx86MapPtr map, const char *name) { - virCPUx86FeaturePtr feature; + size_t i; - feature = map->features; - while (feature) { - if (STREQ(feature->name, name)) - return feature; - - feature = feature->next; + for (i = 0; i < map->nfeatures; i++) { + if (STREQ(map->features[i]->name, name)) + return map->features[i]; } return NULL; @@ -646,21 +621,20 @@ x86FeatureNames(virCPUx86MapPtr map, { virBuffer ret = VIR_BUFFER_INITIALIZER; bool first = true; - - virCPUx86FeaturePtr next_feature = map->features; + size_t i; virBufferAdd(&ret, "", 0); - while (next_feature) { - if (x86DataIsSubset(data, next_feature->data)) { + for (i = 0; i < map->nfeatures; i++) { + virCPUx86FeaturePtr feature = map->features[i]; + if (x86DataIsSubset(data, feature->data)) { if (!first) virBufferAdd(&ret, separator, -1); else first = false; - virBufferAdd(&ret, next_feature->name, -1); + virBufferAdd(&ret, feature->name, -1); } - next_feature = next_feature->next; } return virBufferContentAndReset(&ret); @@ -746,19 +720,13 @@ x86FeatureLoad(xmlXPathContextPtr ctxt, goto cleanup; } - if (!migratable) { - virCPUx86FeaturePtr blocker; + if (!migratable && + VIR_APPEND_ELEMENT_COPY(map->migrate_blockers, + map->nblockers, feature) < 0) + goto cleanup; - if (!(blocker = x86FeatureCopy(feature))) - goto cleanup; - - blocker->next = map->migrate_blockers; - map->migrate_blockers = blocker; - } - - feature->next = map->features; - map->features = feature; - feature = NULL; + if (VIR_APPEND_ELEMENT(map->features, map->nfeatures, feature) < 0) + goto cleanup; ret = 0; @@ -1106,11 +1074,9 @@ x86MapFree(virCPUx86MapPtr map) if (!map) return; - while (map->features) { - virCPUx86FeaturePtr feature = map->features; - map->features = feature->next; - x86FeatureFree(feature); - } + for (i = 0; i < map->nfeatures; i++) + x86FeatureFree(map->features[i]); + VIR_FREE(map->features); for (i = 0; i < map->nmodels; i++) x86ModelFree(map->models[i]); @@ -1120,11 +1086,10 @@ x86MapFree(virCPUx86MapPtr map) x86VendorFree(map->vendors[i]); VIR_FREE(map->vendors); - while (map->migrate_blockers) { - virCPUx86FeaturePtr migrate_blocker = map->migrate_blockers; - map->migrate_blockers = migrate_blocker->next; - x86FeatureFree(migrate_blocker); - } + /* migrate_blockers only points to the features from map->features list, + * which were already freed above + */ + VIR_FREE(map->migrate_blockers); VIR_FREE(map); } @@ -1157,14 +1122,19 @@ x86MapLoadInternalFeatures(virCPUx86MapPtr map) { size_t i; virCPUx86FeaturePtr feature = NULL; + size_t nfeatures = map->nfeatures; + size_t count = ARRAY_CARDINALITY(x86_kvm_features); - for (i = 0; i < ARRAY_CARDINALITY(x86_kvm_features); i++) { + if (VIR_EXPAND_N(map->features, nfeatures, count) < 0) + goto error; + + for (i = 0; i < count; i++) { const char *name = x86_kvm_features[i].name; if (x86FeatureFind(map, name)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU feature %s already defined"), name); - return -1; + goto error; } if (!(feature = x86FeatureNew())) @@ -1176,8 +1146,7 @@ x86MapLoadInternalFeatures(virCPUx86MapPtr map) if (virCPUx86DataAddCPUID(feature->data, &x86_kvm_features[i].cpuid)) goto error; - feature->next = map->features; - map->features = feature; + map->features[map->nfeatures++] = feature; feature = NULL; } @@ -1651,11 +1620,13 @@ x86Decode(virCPUDefPtr cpu, * features directly */ if (flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE) { for (i = 0; i < cpuModel->nfeatures; i++) { - virCPUx86FeaturePtr feat; - for (feat = map->migrate_blockers; feat; feat = feat->next) { - if (STREQ(feat->name, cpuModel->features[i].name)) { + size_t j; + for (j = 0; j < map->nblockers; j++) { + if (STREQ(map->migrate_blockers[j]->name, + cpuModel->features[i].name)) { VIR_FREE(cpuModel->features[i].name); - VIR_DELETE_ELEMENT_INPLACE(cpuModel->features, i, cpuModel->nfeatures); + VIR_DELETE_ELEMENT_INPLACE(cpuModel->features, i, + cpuModel->nfeatures); } } } @@ -2106,7 +2077,6 @@ x86UpdateHostModel(virCPUDefPtr guest, { virCPUDefPtr oldguest = NULL; virCPUx86MapPtr map; - virCPUx86FeaturePtr feat; size_t i; int ret = -1; @@ -2131,8 +2101,9 @@ x86UpdateHostModel(virCPUDefPtr guest, * Note: this only works as long as no CPU model contains non-migratable * features directly */ for (i = 0; i < guest->nfeatures; i++) { - for (feat = map->migrate_blockers; feat; feat = feat->next) { - if (STREQ(feat->name, guest->features[i].name)) { + size_t j; + for (j = 0; j < map->nblockers; j++) { + if (STREQ(map->migrate_blockers[j]->name, guest->features[i].name)) { VIR_FREE(guest->features[i].name); VIR_DELETE_ELEMENT_INPLACE(guest->features, i, guest->nfeatures); } diff --git a/tests/cputestdata/x86-baseline-3-expanded.xml b/tests/cputestdata/x86-baseline-3-expanded.xml index a7e57be..f0c2273 100644 --- a/tests/cputestdata/x86-baseline-3-expanded.xml +++ b/tests/cputestdata/x86-baseline-3-expanded.xml @@ -1,35 +1,35 @@ <cpu mode='custom' match='exact'> <model fallback='forbid'>Westmere</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='aes'/> - <feature policy='require' name='popcnt'/> - <feature policy='require' name='sse4.2'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='sse'/> - <feature policy='require' name='fxsr'/> - <feature policy='require' name='mmx'/> - <feature policy='require' name='clflush'/> - <feature policy='require' name='pse36'/> - <feature policy='require' name='pat'/> - <feature policy='require' name='cmov'/> - <feature policy='require' name='mca'/> - <feature policy='require' name='pge'/> - <feature policy='require' name='mtrr'/> - <feature policy='require' name='sep'/> - <feature policy='require' name='apic'/> - <feature policy='require' name='cx8'/> - <feature policy='require' name='mce'/> - <feature policy='require' name='pae'/> - <feature policy='require' name='msr'/> - <feature policy='require' name='tsc'/> - <feature policy='require' name='pse'/> - <feature policy='require' name='de'/> <feature policy='require' name='fpu'/> + <feature policy='require' name='de'/> + <feature policy='require' name='pse'/> + <feature policy='require' name='tsc'/> + <feature policy='require' name='msr'/> + <feature policy='require' name='pae'/> + <feature policy='require' name='mce'/> + <feature policy='require' name='cx8'/> + <feature policy='require' name='apic'/> + <feature policy='require' name='sep'/> + <feature policy='require' name='mtrr'/> + <feature policy='require' name='pge'/> + <feature policy='require' name='mca'/> + <feature policy='require' name='cmov'/> + <feature policy='require' name='pat'/> + <feature policy='require' name='pse36'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='mmx'/> + <feature policy='require' name='fxsr'/> + <feature policy='require' name='sse'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='sse4.2'/> + <feature policy='require' name='popcnt'/> + <feature policy='require' name='aes'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-4-expanded.xml b/tests/cputestdata/x86-baseline-4-expanded.xml index b5671b5..7e4578e 100644 --- a/tests/cputestdata/x86-baseline-4-expanded.xml +++ b/tests/cputestdata/x86-baseline-4-expanded.xml @@ -1,46 +1,46 @@ <cpu mode='custom' match='exact'> <model fallback='forbid'>Westmere</model> <vendor>Intel</vendor> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='avx'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='xsave'/> - <feature policy='require' name='tsc-deadline'/> - <feature policy='require' name='x2apic'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='pclmuldq'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='aes'/> - <feature policy='require' name='popcnt'/> - <feature policy='require' name='sse4.2'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='sse'/> - <feature policy='require' name='fxsr'/> - <feature policy='require' name='mmx'/> - <feature policy='require' name='clflush'/> - <feature policy='require' name='pse36'/> - <feature policy='require' name='pat'/> - <feature policy='require' name='cmov'/> - <feature policy='require' name='mca'/> - <feature policy='require' name='pge'/> - <feature policy='require' name='mtrr'/> - <feature policy='require' name='sep'/> - <feature policy='require' name='apic'/> - <feature policy='require' name='cx8'/> - <feature policy='require' name='mce'/> - <feature policy='require' name='pae'/> - <feature policy='require' name='msr'/> - <feature policy='require' name='tsc'/> - <feature policy='require' name='pse'/> - <feature policy='require' name='de'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pclmuldq'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='x2apic'/> + <feature policy='require' name='tsc-deadline'/> + <feature policy='require' name='xsave'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='avx'/> + <feature policy='require' name='hypervisor'/> <feature policy='require' name='fpu'/> + <feature policy='require' name='de'/> + <feature policy='require' name='pse'/> + <feature policy='require' name='tsc'/> + <feature policy='require' name='msr'/> + <feature policy='require' name='pae'/> + <feature policy='require' name='mce'/> + <feature policy='require' name='cx8'/> + <feature policy='require' name='apic'/> + <feature policy='require' name='sep'/> + <feature policy='require' name='mtrr'/> + <feature policy='require' name='pge'/> + <feature policy='require' name='mca'/> + <feature policy='require' name='cmov'/> + <feature policy='require' name='pat'/> + <feature policy='require' name='pse36'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='mmx'/> + <feature policy='require' name='fxsr'/> + <feature policy='require' name='sse'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='sse4.2'/> + <feature policy='require' name='popcnt'/> + <feature policy='require' name='aes'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-4-result.xml b/tests/cputestdata/x86-baseline-4-result.xml index 44fbc38..1461a5b 100644 --- a/tests/cputestdata/x86-baseline-4-result.xml +++ b/tests/cputestdata/x86-baseline-4-result.xml @@ -1,14 +1,14 @@ <cpu mode='custom' match='exact'> <model fallback='forbid'>Westmere</model> <vendor>Intel</vendor> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='avx'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='xsave'/> - <feature policy='require' name='tsc-deadline'/> - <feature policy='require' name='x2apic'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='pclmuldq'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pclmuldq'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='x2apic'/> + <feature policy='require' name='tsc-deadline'/> + <feature policy='require' name='xsave'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='avx'/> + <feature policy='require' name='hypervisor'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-5-expanded.xml b/tests/cputestdata/x86-baseline-5-expanded.xml index 2408704..daef2a7 100644 --- a/tests/cputestdata/x86-baseline-5-expanded.xml +++ b/tests/cputestdata/x86-baseline-5-expanded.xml @@ -1,47 +1,47 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> <vendor>Intel</vendor> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='hypervisor'/> <feature policy='disable' name='rdtscp'/> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='avx'/> - <feature policy='require' name='xsave'/> - <feature policy='require' name='aes'/> - <feature policy='require' name='tsc-deadline'/> - <feature policy='require' name='popcnt'/> - <feature policy='require' name='x2apic'/> - <feature policy='require' name='sse4.2'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='pclmuldq'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='sse'/> - <feature policy='require' name='fxsr'/> - <feature policy='require' name='mmx'/> - <feature policy='require' name='clflush'/> - <feature policy='require' name='pse36'/> - <feature policy='require' name='pat'/> - <feature policy='require' name='cmov'/> - <feature policy='require' name='mca'/> - <feature policy='require' name='pge'/> - <feature policy='require' name='mtrr'/> - <feature policy='require' name='sep'/> - <feature policy='require' name='apic'/> - <feature policy='require' name='cx8'/> - <feature policy='require' name='mce'/> - <feature policy='require' name='pae'/> - <feature policy='require' name='msr'/> - <feature policy='require' name='tsc'/> - <feature policy='require' name='pse'/> - <feature policy='require' name='de'/> <feature policy='require' name='fpu'/> + <feature policy='require' name='de'/> + <feature policy='require' name='pse'/> + <feature policy='require' name='tsc'/> + <feature policy='require' name='msr'/> + <feature policy='require' name='pae'/> + <feature policy='require' name='mce'/> + <feature policy='require' name='cx8'/> + <feature policy='require' name='apic'/> + <feature policy='require' name='sep'/> + <feature policy='require' name='mtrr'/> + <feature policy='require' name='pge'/> + <feature policy='require' name='mca'/> + <feature policy='require' name='cmov'/> + <feature policy='require' name='pat'/> + <feature policy='require' name='pse36'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='mmx'/> + <feature policy='require' name='fxsr'/> + <feature policy='require' name='sse'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='pclmuldq'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='sse4.2'/> + <feature policy='require' name='x2apic'/> + <feature policy='require' name='popcnt'/> + <feature policy='require' name='tsc-deadline'/> + <feature policy='require' name='aes'/> + <feature policy='require' name='xsave'/> + <feature policy='require' name='avx'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-5-result.xml b/tests/cputestdata/x86-baseline-5-result.xml index 3c2f38c..775a27d 100644 --- a/tests/cputestdata/x86-baseline-5-result.xml +++ b/tests/cputestdata/x86-baseline-5-result.xml @@ -1,10 +1,10 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> <vendor>Intel</vendor> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='hypervisor'/> <feature policy='disable' name='rdtscp'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-6-migratable.xml b/tests/cputestdata/x86-baseline-6-migratable.xml index 3c2f38c..775a27d 100644 --- a/tests/cputestdata/x86-baseline-6-migratable.xml +++ b/tests/cputestdata/x86-baseline-6-migratable.xml @@ -1,10 +1,10 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> <vendor>Intel</vendor> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='hypervisor'/> <feature policy='disable' name='rdtscp'/> </cpu> diff --git a/tests/cputestdata/x86-baseline-6-result.xml b/tests/cputestdata/x86-baseline-6-result.xml index bea0beb..cafca97 100644 --- a/tests/cputestdata/x86-baseline-6-result.xml +++ b/tests/cputestdata/x86-baseline-6-result.xml @@ -1,11 +1,11 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> <vendor>Intel</vendor> - <feature policy='require' name='invtsc'/> - <feature policy='require' name='hypervisor'/> - <feature policy='require' name='osxsave'/> - <feature policy='require' name='pcid'/> - <feature policy='require' name='ss'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='hypervisor'/> + <feature policy='require' name='invtsc'/> <feature policy='disable' name='rdtscp'/> </cpu> diff --git a/tests/cputestdata/x86-host+guest,model486-result.xml b/tests/cputestdata/x86-host+guest,model486-result.xml index e21c8b8..8bd425d 100644 --- a/tests/cputestdata/x86-host+guest,model486-result.xml +++ b/tests/cputestdata/x86-host+guest,model486-result.xml @@ -1,37 +1,37 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>486</model> - <feature policy='require' name='svm'/> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='fxsr'/> - <feature policy='require' name='mmx'/> - <feature policy='require' name='clflush'/> - <feature policy='require' name='pse36'/> - <feature policy='require' name='pat'/> - <feature policy='require' name='cmov'/> - <feature policy='require' name='mca'/> - <feature policy='require' name='pge'/> - <feature policy='require' name='mtrr'/> - <feature policy='require' name='sep'/> - <feature policy='require' name='apic'/> - <feature policy='require' name='cx8'/> - <feature policy='require' name='mce'/> - <feature policy='require' name='pae'/> - <feature policy='require' name='msr'/> - <feature policy='require' name='tsc'/> <feature policy='require' name='de'/> + <feature policy='require' name='tsc'/> + <feature policy='require' name='msr'/> + <feature policy='require' name='pae'/> + <feature policy='require' name='mce'/> + <feature policy='require' name='cx8'/> + <feature policy='require' name='apic'/> + <feature policy='require' name='sep'/> + <feature policy='require' name='mtrr'/> + <feature policy='require' name='pge'/> + <feature policy='require' name='mca'/> + <feature policy='require' name='cmov'/> + <feature policy='require' name='pat'/> + <feature policy='require' name='pse36'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='mmx'/> + <feature policy='require' name='fxsr'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='lahf_lm'/> + <feature policy='require' name='svm'/> <feature policy='disable' name='vme'/> </cpu> diff --git a/tests/cputestdata/x86-host+guest,models,Penryn-result.xml b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml index 6a31dcd..6cd0668 100644 --- a/tests/cputestdata/x86-host+guest,models,Penryn-result.xml +++ b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml @@ -1,13 +1,13 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Nehalem</model> - <feature policy='require' name='svm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='monitor'/> <feature policy='require' name='pbe'/> - <feature policy='disable' name='popcnt'/> - <feature policy='disable' name='sse4.2'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='svm'/> <feature policy='disable' name='sse'/> + <feature policy='disable' name='sse4.2'/> + <feature policy='disable' name='popcnt'/> </cpu> diff --git a/tests/cputestdata/x86-host+guest,models,qemu64-result.xml b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml index 469d39a..8b170e5 100644 --- a/tests/cputestdata/x86-host+guest,models,qemu64-result.xml +++ b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml @@ -1,13 +1,13 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>qemu64</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='monitor'/> <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='lahf_lm'/> <feature policy='disable' name='sse'/> </cpu> diff --git a/tests/cputestdata/x86-host+guest,models-result.xml b/tests/cputestdata/x86-host+guest,models-result.xml index 6a31dcd..6cd0668 100644 --- a/tests/cputestdata/x86-host+guest,models-result.xml +++ b/tests/cputestdata/x86-host+guest,models-result.xml @@ -1,13 +1,13 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Nehalem</model> - <feature policy='require' name='svm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='monitor'/> <feature policy='require' name='pbe'/> - <feature policy='disable' name='popcnt'/> - <feature policy='disable' name='sse4.2'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='svm'/> <feature policy='disable' name='sse'/> + <feature policy='disable' name='sse4.2'/> + <feature policy='disable' name='popcnt'/> </cpu> diff --git a/tests/cputestdata/x86-host+guest-result.xml b/tests/cputestdata/x86-host+guest-result.xml index 9d37dec..6082b7b 100644 --- a/tests/cputestdata/x86-host+guest-result.xml +++ b/tests/cputestdata/x86-host+guest-result.xml @@ -1,11 +1,11 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Penryn</model> - <feature policy='require' name='svm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='monitor'/> <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='svm'/> <feature policy='disable' name='sse'/> </cpu> diff --git a/tests/cputestdata/x86-host+host+host-model,models,Penryn-result.xml b/tests/cputestdata/x86-host+host+host-model,models,Penryn-result.xml index e2b7f5b..2696356 100644 --- a/tests/cputestdata/x86-host+host+host-model,models,Penryn-result.xml +++ b/tests/cputestdata/x86-host+host+host-model,models,Penryn-result.xml @@ -1,19 +1,19 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>core2duo</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='acpi'/> <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-host+min.xml b/tests/cputestdata/x86-host+min.xml index 8101151..6d2d5cd 100644 --- a/tests/cputestdata/x86-host+min.xml +++ b/tests/cputestdata/x86-host+min.xml @@ -1,17 +1,17 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>Penryn</model> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='acpi'/> - <feature policy='require' name='ds'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> </cpu> diff --git a/tests/cputestdata/x86-host+pentium3.xml b/tests/cputestdata/x86-host+pentium3.xml index d46525c..a8c15f4 100644 --- a/tests/cputestdata/x86-host+pentium3.xml +++ b/tests/cputestdata/x86-host+pentium3.xml @@ -1,27 +1,27 @@ <cpu mode='custom' match='exact'> <model fallback='allow'>pentium3</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='acpi'/> - <feature policy='require' name='ds'/> - <feature policy='require' name='clflush'/> <feature policy='require' name='apic'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-host+strict-force-extra-result.xml b/tests/cputestdata/x86-host+strict-force-extra-result.xml index 68db412..958d458 100644 --- a/tests/cputestdata/x86-host+strict-force-extra-result.xml +++ b/tests/cputestdata/x86-host+strict-force-extra-result.xml @@ -1,19 +1,19 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Penryn</model> - <feature policy='require' name='3dnow'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='acpi'/> - <feature policy='require' name='ds'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='3dnow'/> </cpu> diff --git a/tests/cputestdata/x86-host-Haswell-noTSX+Haswell,haswell,Haswell-result.xml b/tests/cputestdata/x86-host-Haswell-noTSX+Haswell,haswell,Haswell-result.xml index 087aa7d..dfdca13 100644 --- a/tests/cputestdata/x86-host-Haswell-noTSX+Haswell,haswell,Haswell-result.xml +++ b/tests/cputestdata/x86-host-Haswell-noTSX+Haswell,haswell,Haswell-result.xml @@ -1,6 +1,6 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Haswell</model> - <feature policy='disable' name='rtm'/> <feature policy='disable' name='hle'/> + <feature policy='disable' name='rtm'/> </cpu> diff --git a/tests/cputestdata/x86-host-Haswell-noTSX+Haswell-noTSX,haswell,Haswell-noTSX-result.xml b/tests/cputestdata/x86-host-Haswell-noTSX+Haswell-noTSX,haswell,Haswell-noTSX-result.xml index 087aa7d..dfdca13 100644 --- a/tests/cputestdata/x86-host-Haswell-noTSX+Haswell-noTSX,haswell,Haswell-noTSX-result.xml +++ b/tests/cputestdata/x86-host-Haswell-noTSX+Haswell-noTSX,haswell,Haswell-noTSX-result.xml @@ -1,6 +1,6 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Haswell</model> - <feature policy='disable' name='rtm'/> <feature policy='disable' name='hle'/> + <feature policy='disable' name='rtm'/> </cpu> diff --git a/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml index 0c436d9..2bf691c 100644 --- a/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml +++ b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml @@ -1,21 +1,21 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>core2duo</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='popcnt'/> - <feature policy='require' name='sse4.2'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='acpi'/> <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='sse4.2'/> + <feature policy='require' name='popcnt'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml index 1e4f488..d1d0c4b 100644 --- a/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml +++ b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml @@ -1,30 +1,30 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>pentium3</model> - <feature policy='require' name='lahf_lm'/> - <feature policy='require' name='lm'/> - <feature policy='require' name='nx'/> - <feature policy='require' name='syscall'/> - <feature policy='require' name='popcnt'/> - <feature policy='require' name='sse4.2'/> - <feature policy='require' name='sse4.1'/> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='cx16'/> - <feature policy='require' name='ssse3'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pni'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='sse2'/> - <feature policy='require' name='acpi'/> - <feature policy='require' name='ds'/> - <feature policy='require' name='clflush'/> <feature policy='require' name='apic'/> + <feature policy='require' name='clflush'/> + <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='sse2'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='pni'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='ssse3'/> + <feature policy='require' name='cx16'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> + <feature policy='require' name='sse4.1'/> + <feature policy='require' name='sse4.2'/> + <feature policy='require' name='popcnt'/> + <feature policy='require' name='syscall'/> + <feature policy='require' name='nx'/> + <feature policy='require' name='lm'/> + <feature policy='require' name='lahf_lm'/> </cpu> diff --git a/tests/cputestdata/x86-host-better+pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3-result.xml index 07be0f7..a37b368 100644 --- a/tests/cputestdata/x86-host-better+pentium3-result.xml +++ b/tests/cputestdata/x86-host-better+pentium3-result.xml @@ -1,18 +1,18 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Nehalem</model> - <feature policy='require' name='dca'/> - <feature policy='require' name='xtpr'/> - <feature policy='require' name='tm2'/> - <feature policy='require' name='est'/> - <feature policy='require' name='vmx'/> - <feature policy='require' name='ds_cpl'/> - <feature policy='require' name='monitor'/> - <feature policy='require' name='pbe'/> - <feature policy='require' name='tm'/> - <feature policy='require' name='ht'/> - <feature policy='require' name='ss'/> - <feature policy='require' name='acpi'/> - <feature policy='require' name='ds'/> <feature policy='require' name='vme'/> + <feature policy='require' name='ds'/> + <feature policy='require' name='acpi'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='ht'/> + <feature policy='require' name='tm'/> + <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='ds_cpl'/> + <feature policy='require' name='vmx'/> + <feature policy='require' name='est'/> + <feature policy='require' name='tm2'/> + <feature policy='require' name='xtpr'/> + <feature policy='require' name='dca'/> </cpu> diff --git a/tests/cputestdata/x86-host-worse+guest-result.xml b/tests/cputestdata/x86-host-worse+guest-result.xml index 441259f..6b9c74a 100644 --- a/tests/cputestdata/x86-host-worse+guest-result.xml +++ b/tests/cputestdata/x86-host-worse+guest-result.xml @@ -1,9 +1,9 @@ <cpu mode='custom' match='exact'> <arch>x86_64</arch> <model fallback='allow'>Penryn</model> - <feature policy='require' name='svm'/> - <feature policy='require' name='3dnowext'/> - <feature policy='require' name='monitor'/> <feature policy='require' name='pbe'/> + <feature policy='require' name='monitor'/> + <feature policy='require' name='3dnowext'/> + <feature policy='require' name='svm'/> <feature policy='disable' name='sse'/> </cpu> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell2.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell2.args index 3f55ffb..6503a52 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell2.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell2.args @@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu Haswell,-rtm,-hle \ +-cpu Haswell,-hle,-rtm \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args index 9c9f53a..971d522 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args @@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu qemu64,-svm,-lm,-nx,-syscall,-clflush,-pse36,-mca \ +-cpu qemu64,-mca,-pse36,-clflush,-syscall,-nx,-lm,-svm \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args index 2bc03ca..404878d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args @@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+3dnowext,+xtpr,+ds_cpl,+tm,+ht,+ds,-nx \ +-cpu core2duo,+ds,+ht,+tm,+ds_cpl,+xtpr,+3dnowext,+lahf_lm,-nx \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args index 2bc03ca..404878d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args @@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+3dnowext,+xtpr,+ds_cpl,+tm,+ht,+ds,-nx \ +-cpu core2duo,+ds,+ht,+tm,+ds_cpl,+xtpr,+3dnowext,+lahf_lm,-nx \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args index 07a8504..d96d973 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu Penryn,+xtpr,+tm2,+est,+vmx,+ds_cpl,+monitor,+pbe,+tm,+ht,+ss,+acpi,+ds,\ -+vme,-sse4.1 \ +-cpu Penryn,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+monitor,+ds_cpl,+vmx,+est,+tm2,\ ++xtpr,-sse4.1 \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-vendor.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-vendor.args index 4a8cf90..04abe06 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-vendor.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-vendor.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu 'core2duo,vendor=Libvirt QEMU,+lahf_lm,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,\ -+pbe,+tm,+ht,+ss,+acpi,+ds' \ +-cpu 'core2duo,vendor=Libvirt QEMU,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,\ ++tm2,+cx16,+xtpr,+lahf_lm' \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args index b8dd2d4..b6e660c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,+pbe,+tm,+ht,+ss,+acpi,\ -+ds \ +-cpu core2duo,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,+tm2,+cx16,+xtpr,\ ++lahf_lm \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args index 849d945..a7d37fc 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,+pbe,+tm,+ht,+ss,+acpi,\ -+ds \ +-cpu core2duo,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,+tm2,+cx16,+xtpr,\ ++lahf_lm \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args index 0de55ab..ca6592f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,+pbe,+tm,+ht,+ss,+acpi,\ -+ds,-lm,-nx,-syscall \ +-cpu core2duo,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,+tm2,+cx16,+xtpr,\ ++lahf_lm,-syscall,-nx,-lm \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args index c0b420f..a6b2c1f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args @@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+3dnowext,+xtpr,+est,+vmx,+ds_cpl,+tm,+ht,+acpi,+ds,-nx \ +-cpu core2duo,+ds,+acpi,+ht,+tm,+ds_cpl,+vmx,+est,+xtpr,+3dnowext,+lahf_lm,-nx \ -m 214 \ -smp 6 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.args index 0950c1b..100a94e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.args @@ -8,8 +8,8 @@ QEMU_AUDIO_DRV=spice \ -name f14 \ -S \ -M pc \ --cpu core2duo,+lahf_lm,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,+pbe,+tm,+ht,+ss,+acpi,\ -+ds \ +-cpu core2duo,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,+tm2,+cx16,+xtpr,\ ++lahf_lm \ -m 1024 \ -smp 2 \ -uuid 553effab-b5e1-2d80-dfe3-da4344826c43 \ -- 2.8.2

There's no reason for keeping the vendors in a linked list. Especially when we know upfront the total number of models we are loading. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_ppc64.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c index 1aed984..094b075 100644 --- a/src/cpu/cpu_ppc64.c +++ b/src/cpu/cpu_ppc64.c @@ -42,7 +42,6 @@ static const virArch archs[] = { VIR_ARCH_PPC64, VIR_ARCH_PPC64LE }; struct ppc64_vendor { char *name; - struct ppc64_vendor *next; }; struct ppc64_model { @@ -53,7 +52,8 @@ struct ppc64_model { }; struct ppc64_map { - struct ppc64_vendor *vendors; + size_t nvendors; + struct ppc64_vendor **vendors; struct ppc64_model *models; }; @@ -182,14 +182,11 @@ static struct ppc64_vendor * ppc64VendorFind(const struct ppc64_map *map, const char *name) { - struct ppc64_vendor *vendor; + size_t i; - vendor = map->vendors; - while (vendor) { - if (STREQ(vendor->name, name)) - return vendor; - - vendor = vendor->next; + for (i = 0; i < map->nvendors; i++) { + if (STREQ(map->vendors[i]->name, name)) + return map->vendors[i]; } return NULL; @@ -283,6 +280,8 @@ ppc64ModelFromCPU(const virCPUDef *cpu, static void ppc64MapFree(struct ppc64_map *map) { + size_t i; + if (!map) return; @@ -292,11 +291,9 @@ ppc64MapFree(struct ppc64_map *map) ppc64ModelFree(model); } - while (map->vendors) { - struct ppc64_vendor *vendor = map->vendors; - map->vendors = vendor->next; - ppc64VendorFree(vendor); - } + for (i = 0; i < map->nvendors; i++) + ppc64VendorFree(map->vendors[i]); + VIR_FREE(map->vendors); VIR_FREE(map); } @@ -323,12 +320,8 @@ ppc64VendorLoad(xmlXPathContextPtr ctxt, goto ignore; } - if (!map->vendors) { - map->vendors = vendor; - } else { - vendor->next = map->vendors; - map->vendors = vendor; - } + if (VIR_APPEND_ELEMENT(map->vendors, map->nvendors, vendor) < 0) + goto ignore; cleanup: return 0; -- 2.8.2

There's no reason for keeping the models in a linked list. Especially when we know upfront the total number of models we are loading. As a nice side effect, this fixes ppc64GetModels to always return a NULL-terminated list of models. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_ppc64.c | 73 +++++++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c index 094b075..ee4bab0 100644 --- a/src/cpu/cpu_ppc64.c +++ b/src/cpu/cpu_ppc64.c @@ -48,13 +48,13 @@ struct ppc64_model { char *name; const struct ppc64_vendor *vendor; virCPUppc64Data *data; - struct ppc64_model *next; }; struct ppc64_map { size_t nvendors; struct ppc64_vendor **vendors; - struct ppc64_model *models; + size_t nmodels; + struct ppc64_model **models; }; /* Convert a legacy CPU definition by transforming @@ -230,14 +230,11 @@ static struct ppc64_model * ppc64ModelFind(const struct ppc64_map *map, const char *name) { - struct ppc64_model *model; + size_t i; - model = map->models; - while (model) { - if (STREQ(model->name, name)) - return model; - - model = model->next; + for (i = 0; i < map->nmodels; i++) { + if (STREQ(map->models[i]->name, name)) + return map->models[i]; } return NULL; @@ -247,16 +244,15 @@ static struct ppc64_model * ppc64ModelFindPVR(const struct ppc64_map *map, uint32_t pvr) { - struct ppc64_model *model; size_t i; + size_t j; - model = map->models; - while (model) { - for (i = 0; i < model->data->len; i++) { - if ((pvr & model->data->pvr[i].mask) == model->data->pvr[i].value) + for (i = 0; i < map->nmodels; i++) { + struct ppc64_model *model = map->models[i]; + for (j = 0; j < model->data->len; j++) { + if ((pvr & model->data->pvr[j].mask) == model->data->pvr[j].value) return model; } - model = model->next; } return NULL; @@ -285,11 +281,9 @@ ppc64MapFree(struct ppc64_map *map) if (!map) return; - while (map->models) { - struct ppc64_model *model = map->models; - map->models = model->next; - ppc64ModelFree(model); - } + for (i = 0; i < map->nmodels; i++) + ppc64ModelFree(map->models[i]); + VIR_FREE(map->models); for (i = 0; i < map->nvendors; i++) ppc64VendorFree(map->vendors[i]); @@ -417,12 +411,8 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt, model->data->pvr[i].mask = pvr; } - if (!map->models) { - map->models = model; - } else { - model->next = map->models; - map->models = model; - } + if (VIR_APPEND_ELEMENT(map->models, map->nmodels, model) < 0) + goto ignore; cleanup: ctxt->node = bookmark; @@ -863,44 +853,33 @@ static int ppc64DriverGetModels(char ***models) { struct ppc64_map *map; - struct ppc64_model *model; - char *name; - size_t nmodels = 0; + size_t i; + int ret = -1; if (!(map = ppc64LoadMap())) goto error; - if (models && VIR_ALLOC_N(*models, 0) < 0) - goto error; + if (models) { + if (VIR_ALLOC_N(*models, map->nmodels + 1) < 0) + goto error; - model = map->models; - while (model) { - if (models) { - if (VIR_STRDUP(name, model->name) < 0) + for (i = 0; i < map->nmodels; i++) { + if (VIR_STRDUP((*models)[i], map->models[i]->name) < 0) goto error; - - if (VIR_APPEND_ELEMENT(*models, nmodels, name) < 0) { - VIR_FREE(name); - goto error; - } - } else { - nmodels++; } - - model = model->next; } + ret = map->nmodels; + cleanup: ppc64MapFree(map); - - return nmodels; + return ret; error: if (models) { virStringFreeList(*models); *models = NULL; } - nmodels = -1; goto cleanup; } -- 2.8.2

The architecture specific loaders are now called with a list of all elements of a given type (rather than a single element at a time). This avoids the need to reallocate the arrays in CPU maps for each element. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu_map.c | 21 +++--- src/cpu/cpu_map.h | 2 + src/cpu/cpu_ppc64.c | 118 +++++++++++++++++++++----------- src/cpu/cpu_x86.c | 194 ++++++++++++++++++++++++++++++++++------------------ 4 files changed, 216 insertions(+), 119 deletions(-) diff --git a/src/cpu/cpu_map.c b/src/cpu/cpu_map.c index 066be97..d263eb8 100644 --- a/src/cpu/cpu_map.c +++ b/src/cpu/cpu_map.c @@ -48,27 +48,24 @@ static int load(xmlXPathContextPtr ctxt, { int ret = -1; xmlNodePtr ctxt_node; - xmlNodePtr cur; + xmlNodePtr *nodes = NULL; + int n; ctxt_node = ctxt->node; - cur = ctxt_node->children; - while (cur != NULL) { - if (cur->type == XML_ELEMENT_NODE && - xmlStrEqual(cur->name, - BAD_CAST cpuMapElementTypeToString(element))) { - ctxt->node = cur; - if (callback(element, ctxt, data) < 0) - goto cleanup; - } + n = virXPathNodeSet(cpuMapElementTypeToString(element), ctxt, &nodes); + if (n < 0) + goto cleanup; - cur = cur->next; - } + if (n > 0 && + callback(element, ctxt, nodes, n, data) < 0) + goto cleanup; ret = 0; cleanup: ctxt->node = ctxt_node; + VIR_FREE(nodes); return ret; } diff --git a/src/cpu/cpu_map.h b/src/cpu/cpu_map.h index 6b476fd..0c7507e 100644 --- a/src/cpu/cpu_map.h +++ b/src/cpu/cpu_map.h @@ -41,6 +41,8 @@ VIR_ENUM_DECL(cpuMapElement) typedef int (*cpuMapLoadCallback) (cpuMapElement element, xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n, void *data); int diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c index ee4bab0..799fb8e 100644 --- a/src/cpu/cpu_ppc64.c +++ b/src/cpu/cpu_ppc64.c @@ -292,74 +292,87 @@ ppc64MapFree(struct ppc64_map *map) VIR_FREE(map); } -static int -ppc64VendorLoad(xmlXPathContextPtr ctxt, - struct ppc64_map *map) +static struct ppc64_vendor * +ppc64VendorParse(xmlXPathContextPtr ctxt, + struct ppc64_map *map) { struct ppc64_vendor *vendor; if (VIR_ALLOC(vendor) < 0) - return -1; + return NULL; vendor->name = virXPathString("string(@name)", ctxt); if (!vendor->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU vendor name")); - goto ignore; + goto error; } if (ppc64VendorFind(map, vendor->name)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU vendor %s already defined"), vendor->name); - goto ignore; + goto error; } - if (VIR_APPEND_ELEMENT(map->vendors, map->nvendors, vendor) < 0) - goto ignore; + return vendor; - cleanup: - return 0; - - ignore: + error: ppc64VendorFree(vendor); - goto cleanup; + return NULL; } + static int -ppc64ModelLoad(xmlXPathContextPtr ctxt, - struct ppc64_map *map) +ppc64VendorsLoad(struct ppc64_map *map, + xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n) +{ + struct ppc64_vendor *vendor; + size_t i; + + if (VIR_ALLOC_N(map->vendors, n) < 0) + return -1; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + if (!(vendor = ppc64VendorParse(ctxt, map))) + return -1; + map->vendors[map->nvendors++] = vendor; + } + + return 0; +} + + +static struct ppc64_model * +ppc64ModelParse(xmlXPathContextPtr ctxt, + struct ppc64_map *map) { struct ppc64_model *model; xmlNodePtr *nodes = NULL; - xmlNodePtr bookmark; char *vendor = NULL; unsigned long pvr; size_t i; int n; - /* Save the node the context was pointing to, as we're going - * to change it later. It's going to be restored on exit */ - bookmark = ctxt->node; - if (VIR_ALLOC(model) < 0) - return -1; + goto error; - if (VIR_ALLOC(model->data) < 0) { - ppc64ModelFree(model); - return -1; - } + if (VIR_ALLOC(model->data) < 0) + goto error; model->name = virXPathString("string(@name)", ctxt); if (!model->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU model name")); - goto ignore; + goto error; } if (ppc64ModelFind(map, model->name)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU model %s already defined"), model->name); - goto ignore; + goto error; } if (virXPathBoolean("boolean(./vendor)", ctxt)) { @@ -368,14 +381,14 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid vendor element in CPU model %s"), model->name); - goto ignore; + goto error; } if (!(model->vendor = ppc64VendorFind(map, vendor))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown vendor %s referenced by CPU model %s"), vendor, model->name); - goto ignore; + goto error; } } @@ -383,11 +396,11 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing PVR information for CPU model %s"), model->name); - goto ignore; + goto error; } if (VIR_ALLOC_N(model->data->pvr, n) < 0) - goto ignore; + goto error; model->data->len = n; @@ -398,7 +411,7 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing or invalid PVR value in CPU model %s"), model->name); - goto ignore; + goto error; } model->data->pvr[i].value = pvr; @@ -406,37 +419,60 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing or invalid PVR mask in CPU model %s"), model->name); - goto ignore; + goto error; } model->data->pvr[i].mask = pvr; } - if (VIR_APPEND_ELEMENT(map->models, map->nmodels, model) < 0) - goto ignore; - cleanup: - ctxt->node = bookmark; VIR_FREE(vendor); VIR_FREE(nodes); - return 0; + return model; - ignore: + error: ppc64ModelFree(model); + model = NULL; goto cleanup; } + +static int +ppc64ModelsLoad(struct ppc64_map *map, + xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n) +{ + struct ppc64_model *model; + size_t i; + + if (VIR_ALLOC_N(map->models, n) < 0) + return -1; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + if (!(model = ppc64ModelParse(ctxt, map))) + return -1; + map->models[map->nmodels++] = model; + } + + return 0; +} + + static int ppc64MapLoadCallback(cpuMapElement element, xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n, void *data) { struct ppc64_map *map = data; switch (element) { case CPU_MAP_ELEMENT_VENDOR: - return ppc64VendorLoad(ctxt, map); + return ppc64VendorsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_MODEL: - return ppc64ModelLoad(ctxt, map); + return ppc64ModelsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_FEATURE: case CPU_MAP_ELEMENT_LAST: break; diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 81ff3be..d0cb653 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -56,6 +56,7 @@ typedef virCPUx86Feature *virCPUx86FeaturePtr; struct _virCPUx86Feature { char *name; virCPUx86Data *data; + bool migratable; }; typedef struct _virCPUx86KVMFeature virCPUx86KVMFeature; @@ -516,28 +517,27 @@ x86VendorFind(virCPUx86MapPtr map, } -static int -x86VendorLoad(xmlXPathContextPtr ctxt, - virCPUx86MapPtr map) +static virCPUx86VendorPtr +x86VendorParse(xmlXPathContextPtr ctxt, + virCPUx86MapPtr map) { virCPUx86VendorPtr vendor = NULL; char *string = NULL; - int ret = -1; if (VIR_ALLOC(vendor) < 0) - goto cleanup; + goto error; vendor->name = virXPathString("string(@name)", ctxt); if (!vendor->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU vendor name")); - goto cleanup; + goto error; } if (x86VendorFind(map, vendor->name)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU vendor %s already defined"), vendor->name); - goto cleanup; + goto error; } string = virXPathString("string(@string)", ctxt); @@ -545,12 +545,12 @@ x86VendorLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing vendor string for CPU vendor %s"), vendor->name); - goto cleanup; + goto error; } if (strlen(string) != VENDOR_STRING_LENGTH) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid CPU vendor string '%s'"), string); - goto cleanup; + goto error; } vendor->cpuid.function = 0; @@ -558,15 +558,37 @@ x86VendorLoad(xmlXPathContextPtr ctxt, vendor->cpuid.edx = virReadBufInt32LE(string + 4); vendor->cpuid.ecx = virReadBufInt32LE(string + 8); - if (VIR_APPEND_ELEMENT(map->vendors, map->nvendors, vendor) < 0) - goto cleanup; - - ret = 0; - cleanup: VIR_FREE(string); + return vendor; + + error: x86VendorFree(vendor); - return ret; + vendor = NULL; + goto cleanup; +} + + +static int +x86VendorsLoad(virCPUx86MapPtr map, + xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n) +{ + virCPUx86VendorPtr vendor; + size_t i; + + if (VIR_ALLOC_N(map->vendors, n) < 0) + return -1; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + if (!(vendor = x86VendorParse(ctxt, map))) + return -1; + map->vendors[map->nvendors++] = vendor; + } + + return 0; } @@ -670,43 +692,41 @@ x86ParseCPUID(xmlXPathContextPtr ctxt, } -static int -x86FeatureLoad(xmlXPathContextPtr ctxt, - virCPUx86MapPtr map) +static virCPUx86FeaturePtr +x86FeatureParse(xmlXPathContextPtr ctxt, + virCPUx86MapPtr map) { xmlNodePtr *nodes = NULL; - xmlNodePtr ctxt_node = ctxt->node; virCPUx86FeaturePtr feature; virCPUx86CPUID cpuid; - int ret = -1; size_t i; int n; char *str = NULL; - bool migratable = true; if (!(feature = x86FeatureNew())) - goto cleanup; + goto error; + feature->migratable = true; feature->name = virXPathString("string(@name)", ctxt); if (!feature->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU feature name")); - goto cleanup; + goto error; } if (x86FeatureFind(map, feature->name)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU feature %s already defined"), feature->name); - goto cleanup; + goto error; } str = virXPathString("string(@migratable)", ctxt); if (STREQ_NULLABLE(str, "no")) - migratable = false; + feature->migratable = false; n = virXPathNodeSet("./cpuid", ctxt, &nodes); if (n < 0) - goto cleanup; + goto error; for (i = 0; i < n; i++) { ctxt->node = nodes[i]; @@ -714,32 +734,51 @@ x86FeatureLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid cpuid[%zu] in %s feature"), i, feature->name); - goto cleanup; + goto error; } if (virCPUx86DataAddCPUID(feature->data, &cpuid)) - goto cleanup; + goto error; } - if (!migratable && - VIR_APPEND_ELEMENT_COPY(map->migrate_blockers, - map->nblockers, feature) < 0) - goto cleanup; - - if (VIR_APPEND_ELEMENT(map->features, map->nfeatures, feature) < 0) - goto cleanup; - - ret = 0; - cleanup: - x86FeatureFree(feature); - ctxt->node = ctxt_node; VIR_FREE(nodes); VIR_FREE(str); + return feature; - return ret; + error: + x86FeatureFree(feature); + feature = NULL; + goto cleanup; } +static int +x86FeaturesLoad(virCPUx86MapPtr map, + xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n) +{ + virCPUx86FeaturePtr feature; + size_t i; + + if (VIR_ALLOC_N(map->features, n) < 0) + return -1; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + if (!(feature = x86FeatureParse(ctxt, map))) + return -1; + map->features[map->nfeatures++] = feature; + if (!feature->migratable && + VIR_APPEND_ELEMENT(map->migrate_blockers, + map->nblockers, + feature) < 0) + return -1; + } + + return 0; +} + static virCPUx86Data * x86DataFromCPUFeatures(virCPUDefPtr cpu, virCPUx86MapPtr map) @@ -960,25 +999,24 @@ x86ModelCompare(virCPUx86ModelPtr model1, } -static int -x86ModelLoad(xmlXPathContextPtr ctxt, - virCPUx86MapPtr map) +static virCPUx86ModelPtr +x86ModelParse(xmlXPathContextPtr ctxt, + virCPUx86MapPtr map) { xmlNodePtr *nodes = NULL; virCPUx86ModelPtr model; char *vendor = NULL; - int ret = -1; size_t i; int n; if (!(model = x86ModelNew())) - goto cleanup; + goto error; model->name = virXPathString("string(@name)", ctxt); if (!model->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU model name")); - goto cleanup; + goto error; } if (virXPathNode("./model", ctxt)) { @@ -990,7 +1028,7 @@ x86ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing ancestor's name in CPU model %s"), model->name); - goto cleanup; + goto error; } if (!(ancestor = x86ModelFind(map, name))) { @@ -998,7 +1036,7 @@ x86ModelLoad(xmlXPathContextPtr ctxt, _("Ancestor model %s not found for CPU model %s"), name, model->name); VIR_FREE(name); - goto cleanup; + goto error; } VIR_FREE(name); @@ -1006,7 +1044,7 @@ x86ModelLoad(xmlXPathContextPtr ctxt, model->vendor = ancestor->vendor; virCPUx86DataFree(model->data); if (!(model->data = x86DataCopy(ancestor->data))) - goto cleanup; + goto error; } if (virXPathBoolean("boolean(./vendor)", ctxt)) { @@ -1015,20 +1053,20 @@ x86ModelLoad(xmlXPathContextPtr ctxt, virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid vendor element in CPU model %s"), model->name); - goto cleanup; + goto error; } if (!(model->vendor = x86VendorFind(map, vendor))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown vendor %s referenced by CPU model %s"), vendor, model->name); - goto cleanup; + goto error; } } n = virXPathNodeSet("./feature", ctxt, &nodes); if (n < 0) - goto cleanup; + goto error; for (i = 0; i < n; i++) { virCPUx86FeaturePtr feature; @@ -1037,7 +1075,7 @@ x86ModelLoad(xmlXPathContextPtr ctxt, if (!(name = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Missing feature name for CPU model %s"), model->name); - goto cleanup; + goto error; } if (!(feature = x86FeatureFind(map, name))) { @@ -1045,24 +1083,46 @@ x86ModelLoad(xmlXPathContextPtr ctxt, _("Feature %s required by CPU model %s not found"), name, model->name); VIR_FREE(name); - goto cleanup; + goto error; } VIR_FREE(name); if (x86DataAdd(model->data, feature->data)) - goto cleanup; + goto error; } - if (VIR_APPEND_ELEMENT(map->models, map->nmodels, model) < 0) - goto cleanup; - - ret = 0; - cleanup: - x86ModelFree(model); VIR_FREE(vendor); VIR_FREE(nodes); - return ret; + return model; + + error: + x86ModelFree(model); + model = NULL; + goto cleanup; +} + + +static int +x86ModelsLoad(virCPUx86MapPtr map, + xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n) +{ + virCPUx86ModelPtr model; + size_t i; + + if (VIR_ALLOC_N(map->models, n) < 0) + return -1; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + if (!(model = x86ModelParse(ctxt, map))) + return -1; + map->models[map->nmodels++] = model; + } + + return 0; } @@ -1098,17 +1158,19 @@ x86MapFree(virCPUx86MapPtr map) static int x86MapLoadCallback(cpuMapElement element, xmlXPathContextPtr ctxt, + xmlNodePtr *nodes, + int n, void *data) { virCPUx86MapPtr map = data; switch (element) { case CPU_MAP_ELEMENT_VENDOR: - return x86VendorLoad(ctxt, map); + return x86VendorsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_FEATURE: - return x86FeatureLoad(ctxt, map); + return x86FeaturesLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_MODEL: - return x86ModelLoad(ctxt, map); + return x86ModelsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_LAST: break; } -- 2.8.2

All callers of cpuGetModels expect @models to be NULL-terminated. Once both x86GetModels and ppc64GetModels were fixed to meet this expectation, we can explicitly document it. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 1952b53..dbd0987 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -716,7 +716,7 @@ cpuModelIsAllowed(const char *model, * cpuGetModels: * * @archName: CPU architecture string - * @models: where to store the list of supported models + * @models: where to store the NULL-terminated list of supported models * * Fetches all CPU models supported by libvirt on @archName. * -- 2.8.2

On Thu, May 19, 2016 at 01:07:01PM +0200, Jiri Denemark wrote:
The list of CPU models is freed using virStringFreeList, which expects the list to by NULL-terminated.
Jiri Denemark (7): cpu_x86: Use array of models in CPU map cpu_x86: Use array of vendors in CPU map cpu_x86: Use array of features in CPU map cpu_ppc64: Use array of vendors in CPU map cpu_ppc64: Use array of models in CPU map cpu: Rework CPU map loading cpu: Fix documentation of cpuGetModels
ACK series Pavel

On Thu, May 19, 2016 at 16:29:13 +0200, Pavel Hrdina wrote:
On Thu, May 19, 2016 at 01:07:01PM +0200, Jiri Denemark wrote:
The list of CPU models is freed using virStringFreeList, which expects the list to by NULL-terminated.
Jiri Denemark (7): cpu_x86: Use array of models in CPU map cpu_x86: Use array of vendors in CPU map cpu_x86: Use array of features in CPU map cpu_ppc64: Use array of vendors in CPU map cpu_ppc64: Use array of models in CPU map cpu: Rework CPU map loading cpu: Fix documentation of cpuGetModels
ACK series
Pushed, thanks. Jirka
participants (2)
-
Jiri Denemark
-
Pavel Hrdina