[libvirt PATCH 2/3] qemu: process: sev: Fill missing 'cbitpos' & 'reducedPhysBits' from caps
Daniel Henrique Barboza
danielhb413 at gmail.com
Wed Oct 14 21:43:13 UTC 2020
On 10/9/20 11:13 AM, Erik Skultety wrote:
> These XML attributes have been mandatory since the introduction of SEV
> support to libvirt. This design decision was based on QEMU's
> requirement for these to be mandatory for migration purposes, as
> differences in these values across platforms must result in the
> pre-migration checks failing (not that migration with SEV works at the
> time of this patch).
>
> This patch enables autofill of these attributes right before launching
> QEMU and thus updating the live XML.
>
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
> src/conf/domain_conf.h | 2 ++
> src/qemu/qemu_process.c | 40 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 42 insertions(+)
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 450686dfb5..344bb64081 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2490,7 +2490,9 @@ struct _virDomainSEVDef {
> char *dh_cert;
> char *session;
> unsigned int policy;
> + bool haveCbitpos;
> unsigned int cbitpos;
> + bool haveReducedPhysBits;
> unsigned int reduced_phys_bits;
> };
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 2cc1d58266..35af0d11cd 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -6233,6 +6233,40 @@ qemuProcessPrepareAllowReboot(virDomainObjPtr vm)
> }
>
>
> +static int
> +qemuProcessUpdateSEVInfo(virDomainObjPtr vm)
> +{
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + virQEMUCapsPtr qemuCaps = priv->qemuCaps;
> + virDomainSEVDefPtr sev = vm->def->sev;
> + virSEVCapabilityPtr sevCaps = NULL;
> +
> + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Domain %s asked for 'sev' launch but this "
> + "QEMU does not support SEV feature"), vm->def->name);
> + return -1;
> + }
> +
I suggest to move this validation to qemu_validate.c, e.g.:
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index e651668d21..a8b319892b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6241,13 +6241,6 @@ qemuProcessUpdateSEVInfo(virDomainObjPtr vm)
virDomainSEVDefPtr sev = vm->def->sev;
virSEVCapabilityPtr sevCaps = NULL;
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Domain %s asked for 'sev' launch but this "
- "QEMU does not support SEV feature"), vm->def->name);
- return -1;
- }
-
/* if platform specific info like 'cbitpos' and 'reducedPhysBits' have
* not been supplied, we need to autofill them from caps now as both are
* mandatory on QEMU cmdline
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index bc3043bb3f..964ff776fc 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -1034,6 +1034,14 @@ qemuValidateDomainDef(const virDomainDef *def,
return -1;
}
+ if (def->sev &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Domain %s asked for 'sev' launch but this "
+ "QEMU does not support SEV feature"), def->name);
+ return -1;
+ }
+
return 0;
}
Thanks,
DHB
> + /* if platform specific info like 'cbitpos' and 'reducedPhysBits' have
> + * not been supplied, we need to autofill them from caps now as both are
> + * mandatory on QEMU cmdline
> + */
> + sevCaps = virQEMUCapsGetSEVCapabilities(qemuCaps);
> + if (!sev->haveCbitpos) {
> + sev->cbitpos = sevCaps->cbitpos;
> + sev->haveCbitpos = true;
> + }
> +
> + if (!sev->haveReducedPhysBits) {
> + sev->reduced_phys_bits = sevCaps->reduced_phys_bits;
> + sev->haveReducedPhysBits = true;
> + }
> +
> + return 0;
> +}
> +
> +
> /**
> * qemuProcessPrepareDomain:
> * @driver: qemu driver
> @@ -6361,6 +6395,12 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver,
> for (i = 0; i < vm->def->nshmems; i++)
> qemuDomainPrepareShmemChardev(vm->def->shmems[i]);
>
> + if (vm->def->sev) {
> + VIR_DEBUG("Updating SEV platform info");
> + if (qemuProcessUpdateSEVInfo(vm) < 0)
> + return -1;
> + }
> +
> return 0;
> }
>
>
More information about the libvir-list
mailing list