From a935e07ee487f10c9d90f16e53fe5be8ef000484 Mon Sep 17 00:00:00 2001 From: Tim Wiederhake Date: Tue, 22 Jun 2021 14:22:46 +0200 Subject: [PATCH] virDomainFeaturesDefParse: Factor out KVM parsing into separate function Only moving code, cleanup to follow. Signed-off-by: Tim Wiederhake Reviewed-by: Michal Privoznik Reviewed-by: weishaokun --- src/conf/domain_conf.c | 110 +++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5a04d1b5d1..ac2bb8abb4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -20592,6 +20592,65 @@ virDomainMemorytuneDefParse(virDomainDefPtr def, return ret; } +static int +virDomainFeaturesKVMDefParse(virDomainDef *def, + xmlXPathContext *ctxt) +{ + g_autofree char *tmp = NULL; + g_autofree xmlNodePtr *nodes = NULL; + size_t i; + int n; + + def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON; + + if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) { + int feature; + virTristateSwitch value; + if ((n = virXPathNodeSet("./features/kvm/*", ctxt, &nodes)) < 0) + return -1; + + for (i = 0; i < n; i++) { + feature = virDomainKVMTypeFromString((const char *)nodes[i]->name); + if (feature < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported KVM feature: %s"), + nodes[i]->name); + return -1; + } + + switch ((virDomainKVM) feature) { + case VIR_DOMAIN_KVM_HIDDEN: + case VIR_DOMAIN_KVM_DEDICATED: + if (!(tmp = virXMLPropString(nodes[i], "state"))) { + virReportError(VIR_ERR_XML_ERROR, + _("missing 'state' attribute for " + "KVM feature '%s'"), + nodes[i]->name); + return -1; + } + + if ((value = virTristateSwitchTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid value of state argument " + "for KVM feature '%s'"), + nodes[i]->name); + return -1; + } + + VIR_FREE(tmp); + def->kvm_features[feature] = value; + break; + + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_KVM_LAST: + break; + } + } + VIR_FREE(nodes); + } + + return 0; +} static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, @@ -21109,11 +21168,14 @@ virDomainDefParseXML(xmlDocPtr xml, case VIR_DOMAIN_FEATURE_VIRIDIAN: case VIR_DOMAIN_FEATURE_PRIVNET: case VIR_DOMAIN_FEATURE_HYPERV: - case VIR_DOMAIN_FEATURE_KVM: case VIR_DOMAIN_FEATURE_MSRS: def->features[val] = VIR_TRISTATE_SWITCH_ON; break; + case VIR_DOMAIN_FEATURE_KVM: + if (virDomainFeaturesKVMDefParse(def, ctxt) < 0) + goto error; + break; case VIR_DOMAIN_FEATURE_CAPABILITIES: if ((tmp = virXMLPropString(nodes[i], "policy"))) { if ((def->features[val] = virDomainCapabilitiesPolicyTypeFromString(tmp)) == -1) { @@ -21375,52 +21437,6 @@ virDomainDefParseXML(xmlDocPtr xml, VIR_FREE(nodes); } - if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) { - int feature; - int value; - if ((n = virXPathNodeSet("./features/kvm/*", ctxt, &nodes)) < 0) - goto error; - - for (i = 0; i < n; i++) { - feature = virDomainKVMTypeFromString((const char *)nodes[i]->name); - if (feature < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported KVM feature: %s"), - nodes[i]->name); - goto error; - } - - switch ((virDomainKVM) feature) { - case VIR_DOMAIN_KVM_HIDDEN: - case VIR_DOMAIN_KVM_DEDICATED: - if (!(tmp = virXMLPropString(nodes[i], "state"))) { - virReportError(VIR_ERR_XML_ERROR, - _("missing 'state' attribute for " - "KVM feature '%s'"), - nodes[i]->name); - goto error; - } - - if ((value = virTristateSwitchTypeFromString(tmp)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid value of state argument " - "for KVM feature '%s'"), - nodes[i]->name); - goto error; - } - - VIR_FREE(tmp); - def->kvm_features[feature] = value; - break; - - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_KVM_LAST: - break; - } - } - VIR_FREE(nodes); - } - if (def->features[VIR_DOMAIN_FEATURE_SMM] == VIR_TRISTATE_SWITCH_ON) { int rv = virDomainParseScaledValue("string(./features/smm/tseg)", "string(./features/smm/tseg/@unit)", -- 2.27.0