[libvirt] [PATCH v2 0/3] libxl: nestedhvm support

From: Wim ten Have <wim.ten.have@oracle.com> This patch enhances host-passthrough capability to advertise the required vendor CPU virtualization feature which will be used to enable 'nestedhvm' in the libxl driver. Wim ten Have (3): libxl: set nestedhvm for mode host-passthrough xenconfig: add conversions for xen-xl xlconfigtest: add tests for 'nestedhvm' support src/libxl/libxl_conf.c | 47 +++++++++++++-- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_domain.c | 2 +- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++ .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 62 ++++++++++++++++++++ .../test-fullvirt-nestedhvm-undefined.cfg | 25 ++++++++ .../test-fullvirt-nestedhvm-undefined.xml | 58 +++++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 +++++++++++++++++++ tests/xlconfigtest.c | 3 + 11 files changed, 370 insertions(+), 7 deletions(-) create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml -- 2.9.3

From: Wim ten Have <wim.ten.have@oracle.com> Xen feature nestedhvm is the option on Xen 4.4+ which enables nested virtualization when mode host-passthrough is applied. 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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/libxl/libxl_conf.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_domain.c | 2 +- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index f5b788b..ede7c8a 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,42 @@ 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)) { + virCPUDefPtr cpuDef = caps->host.cpu; + + vmx = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "vmx"); + svm = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "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; + + default: + 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 +2124,15 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config) { libxl_domain_config_init(d_config); - if (libxlMakeDomCreateInfo(ctx, def, &d_config->c_info) < 0) + if (libxlMakeDomCreateInfo(cfg->ctx, def, &d_config->c_info) < 0) return -1; - if (libxlMakeDomBuildInfo(def, ctx, d_config) < 0) + if (libxlMakeDomBuildInfo(def, cfg, d_config) < 0) return -1; if (libxlMakeDiskList(def, d_config) < 0) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index c653c9f..7a83669 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -216,7 +216,7 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config); static inline void diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 57ec661..562bc67 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1256,7 +1256,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, goto cleanup_dom; if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, - cfg->channelDir, cfg->ctx, &d_config) < 0) + cfg->channelDir, cfg, &d_config) < 0) goto cleanup_dom; if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0) -- 2.9.3

On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@oracle.com>
Xen feature nestedhvm is the option on Xen 4.4+ which enables nested virtualization when mode host-passthrough is applied.
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'/>
I think we should also give an example of enabling nested HVM. E.g. <cpu mode='host-passthrough'/>
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/libxl/libxl_conf.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_domain.c | 2 +- 3 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index f5b788b..ede7c8a 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,42 @@ 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)) { + virCPUDefPtr cpuDef = caps->host.cpu;
I don't see much value in having this local variable.
+ + vmx = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "vmx"); + svm = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "svm"); + hasHwVirt = (vmx | svm); + }
And you already have a local 'caps' for cfg->caps. So this could be shortened a bit to 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; + + default: + break;
Generally libvirt prefers to explicitly list all enum values in switch statements, e.g. 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 +2124,15 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config)
Long ago, in commits 5da28f24 and a6abdbf6, we changed this function signature to make it easier to unit test. Unfortunately, the subsequent unit tests were never ACKed and committed, but I haven't given up on that effort. Latest attempt was sent to the list in February https://www.redhat.com/archives/libvir-list/2017-February/msg01477.html Looks like we just need cfg->caps in the call chain. Can we pass the virCapsPtr to libxlBuildDomainConfig instead of the libxlDriverConfig object? Regards, Jim
{ libxl_domain_config_init(d_config);
- if (libxlMakeDomCreateInfo(ctx, def, &d_config->c_info) < 0) + if (libxlMakeDomCreateInfo(cfg->ctx, def, &d_config->c_info) < 0) return -1;
- if (libxlMakeDomBuildInfo(def, ctx, d_config) < 0) + if (libxlMakeDomBuildInfo(def, cfg, d_config) < 0) return -1;
if (libxlMakeDiskList(def, d_config) < 0) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index c653c9f..7a83669 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -216,7 +216,7 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config);
static inline void diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 57ec661..562bc67 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1256,7 +1256,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, goto cleanup_dom;
if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, - cfg->channelDir, cfg->ctx, &d_config) < 0) + cfg->channelDir, cfg, &d_config) < 0) goto cleanup_dom;
if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0)

On Mon, 17 Apr 2017 12:04:53 -0600 Jim Fehlig <jfehlig@suse.com> wrote:
On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@oracle.com>
Xen feature nestedhvm is the option on Xen 4.4+ which enables nested virtualization when mode host-passthrough is applied.
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'/>
I think we should also give an example of enabling nested HVM. E.g.
<cpu mode='host-passthrough'/>
Agree, will add.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/libxl/libxl_conf.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_domain.c | 2 +- 3 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index f5b788b..ede7c8a 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,42 @@ 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)) { + virCPUDefPtr cpuDef = caps->host.cpu;
I don't see much value in having this local variable.
Indeed redundant (will remove).
+ + vmx = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "vmx"); + svm = virCPUCheckFeature( + cfg->caps->host.arch, cpuDef, "svm"); + hasHwVirt = (vmx | svm); + }
And you already have a local 'caps' for cfg->caps. So this could be shortened a bit to
vmx = virCPUCheckFeature(caps->host.arch, caps->host.cpu, "vmx"); svm = virCPUCheckFeature(caps->host.arch, caps->host.cpu, "svm"); hasHwVirt = vmx | svm;
Agree.
+ + 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; + + default: + break;
Generally libvirt prefers to explicitly list all enum values in switch statements, e.g.
case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: case VIR_CPU_FEATURE_OPTIONAL: case VIR_CPU_FEATURE_LAST: break;
Ah, i was not aware but see it around and it makes sense. I'll apply.
+ } + } + } + 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 +2124,15 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config)
Long ago, in commits 5da28f24 and a6abdbf6, we changed this function signature to make it easier to unit test. Unfortunately, the subsequent unit tests were never ACKed and committed, but I haven't given up on that effort. Latest attempt was sent to the list in February
https://www.redhat.com/archives/libvir-list/2017-February/msg01477.html
Looks like we just need cfg->caps in the call chain. Can we pass the virCapsPtr to libxlBuildDomainConfig instead of the libxlDriverConfig object?
Perhaps I am missing what you try to tell me here. We need cfg->ctx for libxl allocation requirements. Eliminating by solely switching to virCapsPtr won't work. Is it good to skip this for now? There's more coming forth soon so i'll keep this in mind and try to give it a good approach near future if possible. Thanks for your review comments. Regards, - Wim.
{ libxl_domain_config_init(d_config);
- if (libxlMakeDomCreateInfo(ctx, def, &d_config->c_info) < 0) + if (libxlMakeDomCreateInfo(cfg->ctx, def, &d_config->c_info) < 0) return -1;
- if (libxlMakeDomBuildInfo(def, ctx, d_config) < 0) + if (libxlMakeDomBuildInfo(def, cfg, d_config) < 0) return -1;
if (libxlMakeDiskList(def, d_config) < 0) diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index c653c9f..7a83669 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -216,7 +216,7 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config);
static inline void diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 57ec661..562bc67 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1256,7 +1256,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, goto cleanup_dom;
if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, - cfg->channelDir, cfg->ctx, &d_config) < 0) + cfg->channelDir, cfg, &d_config) < 0) goto cleanup_dom;
if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0)

Wim ten Have wrote:
On Mon, 17 Apr 2017 12:04:53 -0600 Jim Fehlig <jfehlig@suse.com> wrote:
On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@oracle.com> @@ -2087,15 +2124,15 @@ int libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, - libxl_ctx *ctx, + libxlDriverConfigPtr cfg, libxl_domain_config *d_config) Long ago, in commits 5da28f24 and a6abdbf6, we changed this function signature to make it easier to unit test. Unfortunately, the subsequent unit tests were never ACKed and committed, but I haven't given up on that effort. Latest attempt was sent to the list in February
https://www.redhat.com/archives/libvir-list/2017-February/msg01477.html
Looks like we just need cfg->caps in the call chain. Can we pass the virCapsPtr to libxlBuildDomainConfig instead of the libxlDriverConfig object?
Perhaps I am missing what you try to tell me here. We need cfg->ctx for libxl allocation requirements. Eliminating by solely switching to virCapsPtr won't work.
Right, we need ctx *and* caps in this function. I'm suggesting changing the signature to libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, libxl_ctx *ctx, virCapsPtr caps, libxl_domain_config *d_config) That would make it easier for code testing this function. Most test code already creates the virCaps object for other purposes, so it is already available to pass into this function. E.g. see how I test this function in the following patch https://www.redhat.com/archives/libvir-list/2017-February/msg01478.html Refreshing the test patch after such a change would be as simple as including 'xencaps' in the call to libxlBuildDomainConfig.
Is it good to skip this for now? There's more coming forth soon so i'll keep this in mind and try to give it a good approach near future if possible.
I'd rather add the virCapsPtr parameter to libxlBuildDomainConfig. Regards, Jim

From: Wim ten Have <wim.ten.have@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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 74f68b3..d3797b8 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -106,6 +106,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 +165,47 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) } def->os.nBootDevs++; } + + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0) + return -1; + + if (val != -1) { + virCPUDefPtr cpu = NULL; + + if (VIR_ALLOC(cpu) < 0) + return -1; + + if (val == 0) { + if (VIR_ALLOC_N(cpu->features, 2) < 0) + goto cleanup; + + /* + * Below is pointless in real world but for purpose + * of testing let's check features depth holding at + * least multiple elements and also check if both + * vmx|svm are understood. + */ + cpu->features[0].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[0].name, "vmx") < 0) + goto cleanup; + cpu->features[1].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[1].name, "svm") < 0) + goto cleanup; + + cpu->nfeatures = cpu->nfeatures_max = 2; + } + cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH; + cpu->type = VIR_CPU_TYPE_GUEST; + def->cpu = cpu; + cpu = NULL; + cleanup: + if (cpu) { + VIR_FREE(cpu->features); + VIR_FREE(cpu); + return -1; + } + } + } else { if (xenConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0) return -1; @@ -897,6 +939,31 @@ 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; + + default: + break; + } + } + } + + if (xenConfigSetInt(conf, "nestedhvm", hasHwVirt) < 0) + return -1; + } + /* XXX floppy disks */ } else { if (def->os.bootloader && -- 2.9.3

On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 74f68b3..d3797b8 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -106,6 +106,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 +165,47 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) } def->os.nBootDevs++; } + + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0) + return -1; + + if (val != -1) { + virCPUDefPtr cpu = NULL; + + if (VIR_ALLOC(cpu) < 0) + return -1; + + if (val == 0) { + if (VIR_ALLOC_N(cpu->features, 2) < 0) + goto cleanup; + + /* + * Below is pointless in real world but for purpose + * of testing let's check features depth holding at + * least multiple elements and also check if both + * vmx|svm are understood. + */ + cpu->features[0].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[0].name, "vmx") < 0) + goto cleanup; + cpu->features[1].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[1].name, "svm") < 0) + goto cleanup;
Since caps is passed to this function, can it be used to determine whether to disable vmx or svm?
+ + cpu->nfeatures = cpu->nfeatures_max = 2; + } + cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH; + cpu->type = VIR_CPU_TYPE_GUEST; + def->cpu = cpu; + cpu = NULL; + cleanup: + if (cpu) { + VIR_FREE(cpu->features); + VIR_FREE(cpu); + return -1; + }
I'm not fond of the cleanup label in the middle of this function. If we can disable only one of vmx or svm, then there will be one less strdup and one less cleanup spot. Cleanup can then occur at the point of error.
+ } + } else { if (xenConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0) return -1; @@ -897,6 +939,31 @@ 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; + + default: + break;
Similar to patch 1, replace 'default' with the other enum values. Regards, Jim
+ } + } + } + + if (xenConfigSetInt(conf, "nestedhvm", hasHwVirt) < 0) + return -1; + } + /* XXX floppy disks */ } else { if (def->os.bootloader &&

On Mon, 17 Apr 2017 14:22:20 -0600 Jim Fehlig <jfehlig@suse.com> wrote:
On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 74f68b3..d3797b8 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -106,6 +106,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 +165,47 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) } def->os.nBootDevs++; } + + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0) + return -1; + + if (val != -1) { + virCPUDefPtr cpu = NULL; + + if (VIR_ALLOC(cpu) < 0) + return -1; + + if (val == 0) { + if (VIR_ALLOC_N(cpu->features, 2) < 0) + goto cleanup; + + /* + * Below is pointless in real world but for purpose + * of testing let's check features depth holding at + * least multiple elements and also check if both + * vmx|svm are understood. + */ + cpu->features[0].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[0].name, "vmx") < 0) + goto cleanup; + cpu->features[1].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[1].name, "svm") < 0) + goto cleanup;
Since caps is passed to this function, can it be used to determine whether to disable vmx or svm?
Yes :-) ... thanks for enlightening me here as that is actually the correct approach if non-test domain (conversion) actions are made under libvirtd. There's one minor question here per me. To process caps for vmx|svm I'll bring in virCPUCheckFeature() which at its turn requires me to include "cpu/cpu.h" for its prototype. Unfortunate cfg.mk does not anticipate and raises a syntax-check caveat. prohibit_cross_inclusion src/xenconfig/xen_xl.c:51:#include "cpu/cpu.h" maint.mk: unsafe cross-directory include cfg.mk:773: recipe for target 'sc_prohibit_cross_inclusion' failed make: *** [sc_prohibit_cross_inclusion] Error 1 That is ... unless I apply below change to cfg.mk. - xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \ + xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \ Is that lethal to do? I tried to reason and fail to see why not, ie. i am a bit clueless for its specific reason ... but also new to whole arena.
+ + cpu->nfeatures = cpu->nfeatures_max = 2; + } + cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH; + cpu->type = VIR_CPU_TYPE_GUEST; + def->cpu = cpu; + cpu = NULL; + cleanup: + if (cpu) { + VIR_FREE(cpu->features); + VIR_FREE(cpu); + return -1; + }
I'm not fond of the cleanup label in the middle of this function. If we can disable only one of vmx or svm, then there will be one less strdup and one less cleanup spot. Cleanup can then occur at the point of error.
Correct and given former change this will now nicely fold down under its eventual failing VIR_STRDUP().
+ } + } else { if (xenConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0) return -1; @@ -897,6 +939,31 @@ 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; + + default: + break;
Similar to patch 1, replace 'default' with the other enum values.
Sure! Regards, - Wim.
+ } + } + } + + if (xenConfigSetInt(conf, "nestedhvm", hasHwVirt) < 0) + return -1; + } + /* XXX floppy disks */ } else { if (def->os.bootloader &&

Wim ten Have wrote:
On Mon, 17 Apr 2017 14:22:20 -0600 Jim Fehlig <jfehlig@suse.com> wrote:
On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 74f68b3..d3797b8 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -106,6 +106,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 +165,47 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) } def->os.nBootDevs++; } + + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0) + return -1; + + if (val != -1) { + virCPUDefPtr cpu = NULL; + + if (VIR_ALLOC(cpu) < 0) + return -1; + + if (val == 0) { + if (VIR_ALLOC_N(cpu->features, 2) < 0) + goto cleanup; + + /* + * Below is pointless in real world but for purpose + * of testing let's check features depth holding at + * least multiple elements and also check if both + * vmx|svm are understood. + */ + cpu->features[0].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[0].name, "vmx") < 0) + goto cleanup; + cpu->features[1].policy = VIR_CPU_FEATURE_DISABLE; + if (VIR_STRDUP(cpu->features[1].name, "svm") < 0) + goto cleanup; Since caps is passed to this function, can it be used to determine whether to disable vmx or svm?
Yes :-) ... thanks for enlightening me here as that is actually the correct approach if non-test domain (conversion) actions are made under libvirtd.
There's one minor question here per me. To process caps for vmx|svm I'll bring in virCPUCheckFeature() which at its turn requires me to include "cpu/cpu.h" for its prototype. Unfortunate cfg.mk does not anticipate and raises a syntax-check caveat.
prohibit_cross_inclusion src/xenconfig/xen_xl.c:51:#include "cpu/cpu.h" maint.mk: unsafe cross-directory include cfg.mk:773: recipe for target 'sc_prohibit_cross_inclusion' failed make: *** [sc_prohibit_cross_inclusion] Error 1
That is ... unless I apply below change to cfg.mk.
- xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \ + xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
Is that lethal to do? I tried to reason and fail to see why not, ie. i am a bit clueless for its specific reason ... but also new to whole arena.
Adding 'cpu' as a safe dir should be fine. I'm not really sure why xenconfig is included in the check. Seems it should be treated like the hypervisor driver directories (qemu, libxl, lxc, etc.). Regards, Jim

From: Wim ten Have <wim.ten.have@oracle.com> Testing various configuration schemas targeting postive, negative and undefined nestedhvm under libvirt <cpu mode="host-passthrough"> configuration. Mode "host-passthrough" generates nestedhvm=1 in/from xl format where Intel virtualization (VT-x): <feature policy='disable' name='vmx'/> or AMD virtualization (AMD-V): <feature policy='disable' name='svm'/> disables virtualization mode under guest domains. Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 62 ++++++++++++++++++++++ .../test-fullvirt-nestedhvm-undefined.cfg | 25 +++++++++ .../test-fullvirt-nestedhvm-undefined.xml | 58 ++++++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 ++++++++++++++++++++ tests/xlconfigtest.c | 3 ++ 7 files changed, 259 insertions(+) create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg new file mode 100644 index 0000000..d4b9f45 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 0 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml new file mode 100644 index 0000000..a5b9233 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml @@ -0,0 +1,62 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'> + <feature policy='disable' name='vmx'/> + <feature policy='disable' name='svm'/> + </cpu> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg new file mode 100644 index 0000000..4fe76b2 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg @@ -0,0 +1,25 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml new file mode 100644 index 0000000..1bc5b43 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml @@ -0,0 +1,58 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg new file mode 100644 index 0000000..281f126 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 1 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml new file mode 100644 index 0000000..8c02e7a --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml @@ -0,0 +1,59 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'/> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index e74e4d6..2dac241 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -268,6 +268,9 @@ mymain(void) DO_TEST("fullvirt-hpet-timer"); DO_TEST("fullvirt-tsc-timer"); DO_TEST("fullvirt-multi-timer"); + DO_TEST("fullvirt-nestedhvm"); + DO_TEST("fullvirt-nestedhvm-disabled"); + DO_TEST("fullvirt-nestedhvm-undefined"); DO_TEST("paravirt-cmdline"); DO_TEST_FORMAT("paravirt-cmdline-extra-root", false); -- 2.9.3

On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@oracle.com>
Testing various configuration schemas targeting postive, negative and undefined nestedhvm under libvirt <cpu mode="host-passthrough"> configuration.
Mode "host-passthrough" generates nestedhvm=1 in/from xl format where
Intel virtualization (VT-x): <feature policy='disable' name='vmx'/>
or
AMD virtualization (AMD-V): <feature policy='disable' name='svm'/>
disables virtualization mode under guest domains.
Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 62 ++++++++++++++++++++++ .../test-fullvirt-nestedhvm-undefined.cfg | 25 +++++++++ .../test-fullvirt-nestedhvm-undefined.xml | 58 ++++++++++++++++++++
The 'undefined' case is already tested by all the other tests that don't contain an explicit 'nestedhvm='. IMO it can be removed. Regards, Jim
tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 ++++++++++++++++++++ tests/xlconfigtest.c | 3 ++ 7 files changed, 259 insertions(+) create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml
diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg new file mode 100644 index 0000000..d4b9f45 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 0 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml new file mode 100644 index 0000000..a5b9233 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml @@ -0,0 +1,62 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'> + <feature policy='disable' name='vmx'/> + <feature policy='disable' name='svm'/> + </cpu> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg new file mode 100644 index 0000000..4fe76b2 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg @@ -0,0 +1,25 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml new file mode 100644 index 0000000..1bc5b43 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml @@ -0,0 +1,58 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg new file mode 100644 index 0000000..281f126 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 1 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml new file mode 100644 index 0000000..8c02e7a --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml @@ -0,0 +1,59 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'/> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index e74e4d6..2dac241 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -268,6 +268,9 @@ mymain(void) DO_TEST("fullvirt-hpet-timer"); DO_TEST("fullvirt-tsc-timer"); DO_TEST("fullvirt-multi-timer"); + DO_TEST("fullvirt-nestedhvm"); + DO_TEST("fullvirt-nestedhvm-disabled"); + DO_TEST("fullvirt-nestedhvm-undefined");
DO_TEST("paravirt-cmdline"); DO_TEST_FORMAT("paravirt-cmdline-extra-root", false);

On Mon, 17 Apr 2017 14:25:13 -0600 Jim Fehlig <jfehlig@suse.com> wrote:
On 03/24/2017 03:02 PM, Wim Ten Have wrote:
From: Wim ten Have <wim.ten.have@oracle.com>
Testing various configuration schemas targeting postive, negative and undefined nestedhvm under libvirt <cpu mode="host-passthrough"> configuration.
Mode "host-passthrough" generates nestedhvm=1 in/from xl format where
Intel virtualization (VT-x): <feature policy='disable' name='vmx'/>
or
AMD virtualization (AMD-V): <feature policy='disable' name='svm'/>
disables virtualization mode under guest domains.
Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 62 ++++++++++++++++++++++ .../test-fullvirt-nestedhvm-undefined.cfg | 25 +++++++++ .../test-fullvirt-nestedhvm-undefined.xml | 58 ++++++++++++++++++++
The 'undefined' case is already tested by all the other tests that don't contain an explicit 'nestedhvm='. IMO it can be removed.
O:-) ... will remove! Regards, - Wim.
tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 ++++++++++++++++++++ tests/xlconfigtest.c | 3 ++ 7 files changed, 259 insertions(+) create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml
diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg new file mode 100644 index 0000000..d4b9f45 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 0 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml new file mode 100644 index 0000000..a5b9233 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml @@ -0,0 +1,62 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'> + <feature policy='disable' name='vmx'/> + <feature policy='disable' name='svm'/> + </cpu> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg new file mode 100644 index 0000000..4fe76b2 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg @@ -0,0 +1,25 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml new file mode 100644 index 0000000..1bc5b43 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml @@ -0,0 +1,58 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg new file mode 100644 index 0000000..281f126 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +nestedhvm = 1 +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-nestedhvm.xml b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml new file mode 100644 index 0000000..8c02e7a --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm.xml @@ -0,0 +1,59 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <cpu mode='host-passthrough'/> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index e74e4d6..2dac241 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -268,6 +268,9 @@ mymain(void) DO_TEST("fullvirt-hpet-timer"); DO_TEST("fullvirt-tsc-timer"); DO_TEST("fullvirt-multi-timer"); + DO_TEST("fullvirt-nestedhvm"); + DO_TEST("fullvirt-nestedhvm-disabled"); + DO_TEST("fullvirt-nestedhvm-undefined");
DO_TEST("paravirt-cmdline"); DO_TEST_FORMAT("paravirt-cmdline-extra-root", false);

Kind reminder, was this PATCH received and is it under review? % Date: Fri, 24 Mar 2017 22:02:33 +0100 % Subject: [PATCH v2 0/3] libxl: nestedhvm support % Subject: [PATCH v2 1/3] libxl: set nestedhvm for mode host-passthrough % Subject: [PATCH v2 2/3] xenconfig: add conversions for xen-xl % Subject: [PATCH v2 3/3] xlconfigtest: add tests for 'nestedhvm' support Regards, - Wim. On Fri, 24 Mar 2017 22:02:33 +0100 Wim Ten Have <wim.ten.have@oracle.com> wrote:
From: Wim ten Have <wim.ten.have@oracle.com>
This patch enhances host-passthrough capability to advertise the required vendor CPU virtualization feature which will be used to enable 'nestedhvm' in the libxl driver.
Wim ten Have (3): libxl: set nestedhvm for mode host-passthrough xenconfig: add conversions for xen-xl xlconfigtest: add tests for 'nestedhvm' support
src/libxl/libxl_conf.c | 47 +++++++++++++-- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_domain.c | 2 +- src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++ .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 62 ++++++++++++++++++++ .../test-fullvirt-nestedhvm-undefined.cfg | 25 ++++++++ .../test-fullvirt-nestedhvm-undefined.xml | 58 +++++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 +++++++++++++++++++ tests/xlconfigtest.c | 3 + 11 files changed, 370 insertions(+), 7 deletions(-) create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm-undefined.xml create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml
participants (3)
-
Jim Fehlig
-
Wim Ten Have
-
Wim ten Have