[libvirt] [PATCH v4 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 cfg.mk | 4 +- src/libxl/libxl_conf.c | 39 ++++++++++- src/libxl/libxl_conf.h | 1 + src/libxl/libxl_domain.c | 2 +- src/xenconfig/xen_xl.c | 76 ++++++++++++++++++++++ tests/testutilsxen.c | 30 +++++++++ .../test-fullvirt-nestedhvm-disabled.cfg | 26 ++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 61 +++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 ++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 +++++++++++++++++ tests/xlconfigtest.c | 2 + 11 files changed, 322 insertions(+), 4 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.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. 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@oracle.com> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com> --- src/libxl/libxl_conf.c | 39 ++++++++++++++++++++++++++++++++++++++- src/libxl/libxl_conf.h | 1 + src/libxl/libxl_domain.c | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4bab651..56bc097 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 @@ -293,6 +294,7 @@ libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf) static int libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_ctx *ctx, + virCapsPtr caps, libxl_domain_config *d_config) { libxl_domain_build_info *b_info = &d_config->b_info; @@ -374,6 +376,40 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, def->features[VIR_DOMAIN_FEATURE_ACPI] == VIR_TRISTATE_SWITCH_ON); + if (caps && + def->cpu && def->cpu->mode == (VIR_CPU_MODE_HOST_PASSTHROUGH)) { + bool hasHwVirt = false; + bool svm = false, vmx = false; + + if (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 @@ -2089,6 +2125,7 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, libxl_ctx *ctx, + virCapsPtr caps, libxl_domain_config *d_config) { libxl_domain_config_init(d_config); @@ -2096,7 +2133,7 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, if (libxlMakeDomCreateInfo(ctx, def, &d_config->c_info) < 0) return -1; - if (libxlMakeDomBuildInfo(def, ctx, d_config) < 0) + if (libxlMakeDomBuildInfo(def, ctx, caps, 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..264df11 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -217,6 +217,7 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports, virDomainDefPtr def, const char *channelDir LIBXL_ATTR_UNUSED, libxl_ctx *ctx, + virCapsPtr caps, libxl_domain_config *d_config); static inline void diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index ea28c93..256cf1d 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->ctx, cfg->caps, &d_config) < 0) goto cleanup_dom; if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0) -- 2.9.3

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> --- 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)";; \ *) 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 && -- 2.9.3

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> --- 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 &&

From: Wim ten Have <wim.ten.have@oracle.com> Testing various configuration schemas targeting postive and negative 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> Signed-off-by: Jim Fehlig <jfehlig@suse.com> --- tests/testutilsxen.c | 30 +++++++++++ .../test-fullvirt-nestedhvm-disabled.cfg | 26 +++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 61 ++++++++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 +++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 +++++++++++++++++++++ tests/xlconfigtest.c | 2 + 6 files changed, 204 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.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml diff --git a/tests/testutilsxen.c b/tests/testutilsxen.c index 122789c..c4fc146 100644 --- a/tests/testutilsxen.c +++ b/tests/testutilsxen.c @@ -6,6 +6,33 @@ #include "testutilsxen.h" #include "domain_conf.h" +static virCPUFeatureDef cpuDefaultFeatures[] = { + { (char *) "ds", -1 }, + { (char *) "acpi", -1 }, + { (char *) "ss", -1 }, + { (char *) "ht", -1 }, + { (char *) "tm", -1 }, + { (char *) "pbe", -1 }, + { (char *) "ds_cpl", -1 }, + { (char *) "vmx", -1 }, + { (char *) "est", -1 }, + { (char *) "tm2", -1 }, + { (char *) "cx16", -1 }, + { (char *) "xtpr", -1 }, + { (char *) "lahf_lm", -1 }, +}; +static virCPUDef cpuDefaultData = { + .type = VIR_CPU_TYPE_HOST, + .arch = VIR_ARCH_X86_64, + .model = (char *) "core2duo", + .vendor = (char *) "Intel", + .sockets = 1, + .cores = 2, + .threads = 1, + .nfeatures = ARRAY_CARDINALITY(cpuDefaultFeatures), + .nfeatures_max = ARRAY_CARDINALITY(cpuDefaultFeatures), + .features = cpuDefaultFeatures, +}; virCapsPtr testXenCapsInit(void) { @@ -88,6 +115,9 @@ testXLInitCaps(void) if ((caps = virCapabilitiesNew(virArchFromHost(), false, false)) == NULL) return NULL; + + caps->host.cpu = virCPUDefCopy(&cpuDefaultData); + nmachines = ARRAY_CARDINALITY(x86_machines); if ((machines = virCapabilitiesAllocMachines(x86_machines, nmachines)) == NULL) goto cleanup; 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..58b6338 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-nestedhvm-disabled.xml @@ -0,0 +1,61 @@ +<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'/> + </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.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 73702ac..05f7c20 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -268,6 +268,8 @@ 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("paravirt-cmdline"); DO_TEST_FORMAT("paravirt-cmdline-extra-root", false); -- 2.9.3

Wim Ten Have 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
cfg.mk | 4 +- src/libxl/libxl_conf.c | 39 ++++++++++- src/libxl/libxl_conf.h | 1 + src/libxl/libxl_domain.c | 2 +- src/xenconfig/xen_xl.c | 76 ++++++++++++++++++++++ tests/testutilsxen.c | 30 +++++++++ .../test-fullvirt-nestedhvm-disabled.cfg | 26 ++++++++ .../test-fullvirt-nestedhvm-disabled.xml | 61 +++++++++++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.cfg | 26 ++++++++ tests/xlconfigdata/test-fullvirt-nestedhvm.xml | 59 +++++++++++++++++ tests/xlconfigtest.c | 2 + 11 files changed, 322 insertions(+), 4 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.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-nestedhvm.xml
ACK series. I went with the cfg.mk change from V3 and pushed it. Thanks! BTW, I think this improvement deserves a news entry. I'll send a patch shortly. Regards, Jim
participants (2)
-
Jim Fehlig
-
Wim Ten Have