diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index e313caddcd..40fed9638d 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -656,19 +656,28 @@ virCPUDefFormatBuf(virBufferPtr buf, return 0; } - -int -virCPUDefAddFeature(virCPUDefPtr def, - const char *name, - int policy) +static int +virCPUDefUpdateFeatureInternal(virCPUDefPtr def, + const char *name, + int policy, + bool update) { size_t i; + if (def->type == VIR_CPU_TYPE_HOST) + policy = -1; + for (i = 0; i < def->nfeatures; i++) { if (STREQ(name, def->features[i].name)) { + if (update) { + def->features[i].policy = policy; + return 0; + } + virReportError(VIR_ERR_INTERNAL_ERROR, _("CPU feature `%s' specified more than once"), name); + return -1; } } @@ -677,9 +686,6 @@ virCPUDefAddFeature(virCPUDefPtr def, def->nfeatures, 1) < 0) return -1; - if (def->type == VIR_CPU_TYPE_HOST) - policy = -1; - if (VIR_STRDUP(def->features[def->nfeatures].name, name) < 0) return -1; @@ -689,6 +695,22 @@ virCPUDefAddFeature(virCPUDefPtr def, return 0; } +int +virCPUDefUpdateFeature(virCPUDefPtr def, + const char *name, + int policy) +{ + return virCPUDefUpdateFeatureInternal(def, name, policy, true); +} + +int +virCPUDefAddFeature(virCPUDefPtr def, + const char *name, + int policy) +{ + return virCPUDefUpdateFeatureInternal(def, name, policy, false); +} + bool virCPUDefIsEqual(virCPUDefPtr src, virCPUDefPtr dst) diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 23ea455a2d..2d1854ffa5 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -164,4 +164,9 @@ virCPUDefAddFeature(virCPUDefPtr cpu, const char *name, int policy); +int +virCPUDefUpdateFeature(virCPUDefPtr cpu, + const char *name, + int policy); + #endif /* __VIR_CPU_CONF_H__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0ab7632564..3c27041ed1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -70,6 +70,7 @@ virCPUDefFormatBuf; virCPUDefFree; virCPUDefFreeModel; virCPUDefParseXML; +virCPUDefUpdateFeature; virCPUModeTypeToString;