From 3616ec3927d7807313e4774c2706067a73d29902 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 17 Jun 2019 17:55:52 +0200 Subject: [PATCH] qemu: domain: Add support for modifying qemu capability list via qemu namespace MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/qemu/qemu_domain.c | 8 ++++++++ src/qemu/qemu_process.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) 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); -- 2.39.5