Wim Ten Have wrote: > From: Wim ten Have <wim.ten.have@xxxxxxxxxx> > > 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@xxxxxxxxxx> > Signed-off-by: Wim ten Have <wim.ten.have@xxxxxxxxxx> > --- > 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 && -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list