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@xxxxxxxxxx> --- 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