From: Peter Krempa Date: Mon, 17 Jun 2019 15:55:52 +0000 (+0200) Subject: qemu: domain: Add support for modifying qemu capability list via qemu namespace X-Git-Tag: v5.5.0-rc1~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3616ec3927d7807313e4774c2706067a73d29902;p=thirdparty%2Flibvirt.git qemu: domain: Add support for modifying qemu capability list via qemu namespace For testing purposes it's sometimes desired to be able to control the presence of capabilities of qemu. This adds the possibility to do this via the qemu namespace. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ac19d254ee..0a9056d1a0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8320,6 +8320,7 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, size_t i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); qemuDomainObjPrivatePtr priv = obj->privateData; + bool custom_hypervisor_feat = false; if (virQEMUDriverIsPrivileged(driver) && (!cfg->clearEmulatorCapabilities || @@ -8334,6 +8335,13 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, qemuDomainXmlNsDefPtr qemuxmlns = obj->def->namespaceData; if (qemuxmlns->num_args || qemuxmlns->num_env) qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV, logCtxt); + if (qemuxmlns->ncapsadd > 0 || qemuxmlns->ncapsdel > 0) + custom_hypervisor_feat = true; + } + + if (custom_hypervisor_feat) { + qemuDomainObjTaint(driver, obj, + VIR_DOMAIN_TAINT_CUSTOM_HYPERVISOR_FEATURE, logCtxt); } if (obj->def->cpu && obj->def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 86cfeeb6f0..f0d410306c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5448,6 +5448,42 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, } +static int +qemuProcessStartUpdateCustomCaps(virDomainObjPtr vm) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + qemuDomainXmlNsDefPtr nsdef = vm->def->namespaceData; + int tmp; + size_t i; + + if (nsdef) { + for (i = 0; i < nsdef->ncapsadd; i++) { + if ((tmp = virQEMUCapsTypeFromString(nsdef->capsadd[i])) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid qemu namespace capability '%s'"), + nsdef->capsadd[i]); + return -1; + } + + virQEMUCapsSet(priv->qemuCaps, tmp); + } + + for (i = 0; i < nsdef->ncapsdel; i++) { + if ((tmp = virQEMUCapsTypeFromString(nsdef->capsdel[i])) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid qemu namespace capability '%s'"), + nsdef->capsdel[i]); + return -1; + } + + virQEMUCapsClear(priv->qemuCaps, tmp); + } + } + + return 0; +} + + /** * qemuProcessInit: * @@ -5518,6 +5554,10 @@ qemuProcessInit(virQEMUDriverPtr driver, if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0) goto cleanup; + /* Update qemu capabilities according to lists passed in via namespace */ + if (qemuProcessStartUpdateCustomCaps(vm) < 0) + goto cleanup; + if (flags & VIR_QEMU_PROCESS_START_PRETEND) { if (qemuDomainSetPrivatePaths(driver, vm) < 0) { virDomainObjRemoveTransientDef(vm);