158 lines
5.8 KiB
Diff
158 lines
5.8 KiB
Diff
|
|
From a935e07ee487f10c9d90f16e53fe5be8ef000484 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Tim Wiederhake <twiederh@redhat.com>
|
||
|
|
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 <twiederh@redhat.com>
|
||
|
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||
|
|
Reviewed-by: weishaokun <weishaokun@kylinos.cn>
|
||
|
|
---
|
||
|
|
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
|
||
|
|
|