Wim Ten Have wrote: > From: Wim ten Have <wim.ten.have@xxxxxxxxxx> > > Xen feature nestedhvm is the option on Xen 4.4+ which enables > nested virtualization when mode host-passthrough is applied. > > nested HVM is enabled by adding below on the target domain; > <cpu mode='host-passthrough'/> > > Virtualization on target domain can be disabled by specifying > such under feature policy rule on target name; > > [On Intel (VT-x) architecture] > <feature policy='disable' name='vmx'/> > > or: > > [On AMD (AMD-V) architecture] > <feature policy='disable' name='svm'/> > > Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > Signed-off-by: Wim ten Have <wim.ten.have@xxxxxxxxxx> > --- > src/libxl/libxl_conf.c | 46 +++++++++++++++++++++++++++++++++++++++++----- > src/libxl/libxl_conf.h | 2 +- > src/libxl/libxl_domain.c | 2 +- > 3 files changed, 43 insertions(+), 7 deletions(-) > > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c > index f5b788b..31508d6 100644 > --- a/src/libxl/libxl_conf.c > +++ b/src/libxl/libxl_conf.c > @@ -47,6 +47,7 @@ > #include "libxl_utils.h" > #include "virstoragefile.h" > #include "secret_util.h" > +#include "cpu/cpu.h" > > > #define VIR_FROM_THIS VIR_FROM_LIBXL > @@ -292,7 +293,7 @@ libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf) > > static int > libxlMakeDomBuildInfo(virDomainDefPtr def, > - libxl_ctx *ctx, > + libxlDriverConfigPtr cfg, > libxl_domain_config *d_config) > { > libxl_domain_build_info *b_info = &d_config->b_info; > @@ -308,7 +309,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, > libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_PV); > > b_info->max_vcpus = virDomainDefGetVcpusMax(def); > - if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, b_info->max_vcpus)) > + if (libxl_cpu_bitmap_alloc(cfg->ctx, &b_info->avail_vcpus, b_info->max_vcpus)) > return -1; > libxl_bitmap_set_none(&b_info->avail_vcpus); > for (i = 0; i < virDomainDefGetVcpus(def); i++) > @@ -374,6 +375,41 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, > def->features[VIR_DOMAIN_FEATURE_ACPI] == > VIR_TRISTATE_SWITCH_ON); > > + if (cfg && def->cpu && > + def->cpu->mode == (VIR_CPU_MODE_HOST_PASSTHROUGH)) { > + bool hasHwVirt = false; > + bool svm = false, vmx = false; > + virCapsPtr caps = cfg->caps; > + > + if (caps && ARCH_IS_X86(def->os.arch)) { > + vmx = virCPUCheckFeature(caps->host.arch, caps->host.cpu, "vmx"); > + svm = virCPUCheckFeature(caps->host.arch, caps->host.cpu, "svm"); > + hasHwVirt = vmx | svm; > + } > + > + 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 ((vmx && STREQ(def->cpu->features[i].name, "vmx")) || > + (svm && 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; > + } > + } > + } > + libxl_defbool_set(&b_info->u.hvm.nested_hvm, hasHwVirt); > + } > + > if (def->nsounds > 0) { > /* > * Use first sound device. man xl.cfg(5) describes soundhw as > @@ -2087,15 +2123,15 @@ int > libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, > virDomainDefPtr def, > const char *channelDir LIBXL_ATTR_UNUSED, > - libxl_ctx *ctx, > + libxlDriverConfigPtr cfg, > libxl_domain_config *d_config) I replied to your question about this function in the V2 thread. Essentially, I'd like to see this function changed to libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, libxl_ctx *ctx, virCapsPtr caps, libxl_domain_config *d_config) Looks good otherwise! Regards, Jim -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list