[libvirt] [PATCH v4 2/3] xenconfig: add conversions for xen-xl
Jim Fehlig
jfehlig at suse.com
Thu Apr 27 19:54:12 UTC 2017
Wim Ten Have wrote:
> From: Wim ten Have <wim.ten.have at oracle.com>
>
> Per xen-xl conversions from and to native under host-passthrough
> mode we take care for Xen (nestedhvm = mode) applied and inherited
> settings generating or processing correct feature policy:
>
> [On Intel (VT-x) architectures]
> <feature policy='disable' name='vmx'/>
>
> or
>
> [On AMD (AMD-V) architectures]
> <feature policy='disable' name='svm'/>
>
> It will then generate (or parse) for nestedhvm=1 in/from xl format.
>
> Signed-off-by: Joao Martins <joao.m.martins at oracle.com>
> Signed-off-by: Wim ten Have <wim.ten.have at oracle.com>
> ---
> cfg.mk | 4 +--
> src/xenconfig/xen_xl.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 78 insertions(+), 2 deletions(-)
>
> diff --git a/cfg.mk b/cfg.mk
> index 09548fe..3da8332 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -768,7 +768,7 @@ sc_prohibit_gettext_markup:
> # lower-level code must not include higher-level headers.
> cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
> cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
> -mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage
> +mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage|xen
> sc_prohibit_cross_inclusion:
> @for dir in $(cross_dirs); do \
> case $$dir in \
> @@ -777,7 +777,7 @@ sc_prohibit_cross_inclusion:
> locking/) safe="($$dir|util|conf|rpc)";; \
> cpu/| network/| node_device/| rpc/| security/| storage/) \
> safe="($$dir|util|conf|storage)";; \
> - xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \
> + xenapi/) safe="($$dir|util|conf|xen)";; \
After re-reading your response from V3 [1], I think the approach taken there is
better than my suggestion you have implemented here. Otherwise the patch looks
good - ACK. I'll change this hunk back to the V3 approach before pushing.
Regards,
Jim
> *) safe="($$dir|$(mid_dirs)|util)";; \
> esac; \
> in_vc_files="^src/$$dir" \
> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> index a5b342a..4f24d45 100644
> --- a/src/xenconfig/xen_xl.c
> +++ b/src/xenconfig/xen_xl.c
> @@ -34,6 +34,7 @@
> #include "virstoragefile.h"
> #include "xen_xl.h"
> #include "libxl_capabilities.h"
> +#include "cpu/cpu.h"
>
> #define VIR_FROM_THIS VIR_FROM_XENXL
>
> @@ -106,6 +107,7 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
> if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
> const char *bios;
> const char *boot;
> + int val = 0;
>
> if (xenConfigGetString(conf, "bios", &bios, NULL) < 0)
> return -1;
> @@ -164,6 +166,52 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
> }
> def->os.nBootDevs++;
> }
> +
> + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0)
> + return -1;
> +
> + if (val == 1) {
> + virCPUDefPtr cpu;
> +
> + if (VIR_ALLOC(cpu) < 0)
> + return -1;
> +
> + cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
> + cpu->type = VIR_CPU_TYPE_GUEST;
> + def->cpu = cpu;
> + } else if (val == 0) {
> + const char *vtfeature = NULL;
> +
> + if (caps && caps->host.cpu && ARCH_IS_X86(def->os.arch)) {
> + if (virCPUCheckFeature(caps->host.arch, caps->host.cpu, "vmx"))
> + vtfeature = "vmx";
> + else if (virCPUCheckFeature(caps->host.arch, caps->host.cpu, "svm"))
> + vtfeature = "svm";
> + }
> +
> + if (vtfeature) {
> + virCPUDefPtr cpu;
> +
> + if (VIR_ALLOC(cpu) < 0)
> + return -1;
> +
> + if (VIR_ALLOC(cpu->features) < 0) {
> + VIR_FREE(cpu);
> + return -1;
> + }
> +
> + if (VIR_STRDUP(cpu->features->name, vtfeature) < 0) {
> + VIR_FREE(cpu->features);
> + VIR_FREE(cpu);
> + return -1;
> + }
> + cpu->features->policy = VIR_CPU_FEATURE_DISABLE;
> + cpu->nfeatures = cpu->nfeatures_max = 1;
> + cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
> + cpu->type = VIR_CPU_TYPE_GUEST;
> + def->cpu = cpu;
> + }
> + }
> } else {
> if (xenConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0)
> return -1;
> @@ -899,6 +947,34 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def)
> if (xenConfigSetString(conf, "boot", boot) < 0)
> return -1;
>
> + if (def->cpu &&
> + def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
> + bool hasHwVirt = true;
> +
> + if (def->cpu->nfeatures) {
> + for (i = 0; i < def->cpu->nfeatures; i++) {
> +
> + switch (def->cpu->features[i].policy) {
> + case VIR_CPU_FEATURE_DISABLE:
> + case VIR_CPU_FEATURE_FORBID:
> + if (STREQ(def->cpu->features[i].name, "vmx") ||
> + STREQ(def->cpu->features[i].name, "svm"))
> + hasHwVirt = false;
> + break;
> +
> + case VIR_CPU_FEATURE_FORCE:
> + case VIR_CPU_FEATURE_REQUIRE:
> + case VIR_CPU_FEATURE_OPTIONAL:
> + case VIR_CPU_FEATURE_LAST:
> + break;
> + }
> + }
> + }
> +
> + if (xenConfigSetInt(conf, "nestedhvm", hasHwVirt) < 0)
> + return -1;
> + }
> +
> /* XXX floppy disks */
> } else {
> if (def->os.bootloader &&
More information about the libvir-list
mailing list