In future commits we will need to store not just an array of
VIR_TRISTATE_SWITCH_* but also an additional integer. Follow the
example of TCG and introduce a structure where both the array an
integer can live.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/conf/domain_conf.c | 20 +++++++++++++-------
src/conf/domain_conf.h | 7 ++++++-
src/qemu/qemu_command.c | 8 ++++----
3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b6249aa76f..07cbfa24bc 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3713,6 +3713,7 @@ void virDomainDefFree(virDomainDef *def)
g_free(def->emulator);
g_free(def->description);
g_free(def->title);
+ g_free(def->kvm_features);
g_free(def->hyperv_vendor_id);
g_free(def->tcg_features);
@@ -17532,7 +17533,9 @@ static int
virDomainFeaturesKVMDefParse(virDomainDef *def,
xmlNodePtr node)
{
- def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON;
+ g_autofree virDomainFeatureKVM *kvm = NULL;
+
+ kvm = g_new0(virDomainFeatureKVM, 1);
node = xmlFirstElementChild(node);
while (node) {
@@ -17551,11 +17554,14 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
&value) < 0)
return -1;
- def->kvm_features[feature] = value;
+ kvm->features[feature] = value;
node = xmlNextElementSibling(node);
}
+ def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON;
+ def->kvm_features = g_steal_pointer(&kvm);
+
return 0;
}
@@ -21803,13 +21809,13 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
case VIR_DOMAIN_KVM_DEDICATED:
case VIR_DOMAIN_KVM_POLLCONTROL:
case VIR_DOMAIN_KVM_PVIPI:
- if (src->kvm_features[i] != dst->kvm_features[i]) {
+ if (src->kvm_features->features[i] !=
dst->kvm_features->features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of KVM feature '%s' differs:
"
"source: '%s', destination:
'%s'"),
virDomainKVMTypeToString(i),
-
virTristateSwitchTypeToString(src->kvm_features[i]),
-
virTristateSwitchTypeToString(dst->kvm_features[i]));
+
virTristateSwitchTypeToString(src->kvm_features->features[i]),
+
virTristateSwitchTypeToString(dst->kvm_features->features[i]));
return false;
}
@@ -27873,11 +27879,11 @@ virDomainDefFormatFeatures(virBuffer *buf,
case VIR_DOMAIN_KVM_DEDICATED:
case VIR_DOMAIN_KVM_POLLCONTROL:
case VIR_DOMAIN_KVM_PVIPI:
- if (def->kvm_features[j])
+ if (def->kvm_features->features[j])
virBufferAsprintf(&childBuf, "<%s
state='%s'/>\n",
virDomainKVMTypeToString(j),
virTristateSwitchTypeToString(
- def->kvm_features[j]));
+ def->kvm_features->features[j]));
break;
case VIR_DOMAIN_KVM_LAST:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b410922f68..5613d621bb 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2263,6 +2263,11 @@ typedef enum {
VIR_ENUM_DECL(virDomainIBS);
+typedef struct _virDomainFeatureKVM virDomainFeatureKVM;
+struct _virDomainFeatureKVM {
+ int features[VIR_DOMAIN_KVM_LAST];
+};
+
typedef struct _virDomainFeatureTCG virDomainFeatureTCG;
struct _virDomainFeatureTCG {
unsigned long long tb_cache; /* Stored in KiB */
@@ -2819,7 +2824,7 @@ struct _virDomainDef {
int features[VIR_DOMAIN_FEATURE_LAST];
int caps_features[VIR_DOMAIN_PROCES_CAPS_FEATURE_LAST];
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
- int kvm_features[VIR_DOMAIN_KVM_LAST];
+ virDomainFeatureKVM *kvm_features;
int msrs_features[VIR_DOMAIN_MSRS_LAST];
int xen_features[VIR_DOMAIN_XEN_LAST];
virDomainXenPassthroughMode xen_passthrough_mode;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index ce22372749..7cdec9f910 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6765,22 +6765,22 @@ qemuBuildCpuCommandLine(virCommand *cmd,
for (i = 0; i < VIR_DOMAIN_KVM_LAST; i++) {
switch ((virDomainKVM) i) {
case VIR_DOMAIN_KVM_HIDDEN:
- if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_ON)
+ if (def->kvm_features->features[i] == VIR_TRISTATE_SWITCH_ON)
virBufferAddLit(&buf, ",kvm=off");
break;
case VIR_DOMAIN_KVM_DEDICATED:
- if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_ON)
+ if (def->kvm_features->features[i] == VIR_TRISTATE_SWITCH_ON)
virBufferAddLit(&buf, ",kvm-hint-dedicated=on");
break;
case VIR_DOMAIN_KVM_POLLCONTROL:
- if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_ON)
+ if (def->kvm_features->features[i] == VIR_TRISTATE_SWITCH_ON)
virBufferAddLit(&buf, ",kvm-poll-control=on");
break;
case VIR_DOMAIN_KVM_PVIPI:
- if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_OFF)
+ if (def->kvm_features->features[i] == VIR_TRISTATE_SWITCH_OFF)
virBufferAddLit(&buf, ",kvm-pv-ipi=off");
break;
--
2.32.0