]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
xenconfig: add conversions for xen-xl
authorWim ten Have <wim.ten.have@oracle.com>
Mon, 24 Apr 2017 13:07:00 +0000 (15:07 +0200)
committerJim Fehlig <jfehlig@suse.com>
Thu, 27 Apr 2017 21:05:44 +0000 (15:05 -0600)
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
src/xenconfig/xen_xl.c

diff --git a/cfg.mk b/cfg.mk
index c04a9911eb7837bca5373e53b97f72f75b4c9cf9..6be21123e034090ff09b4075b386f994d7fc52e1 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -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/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";;   \
            *) safe="($$dir|$(mid_dirs)|util)";;                        \
          esac;                                                         \
          in_vc_files="^src/$$dir"                                      \
index a5b342a86581b0a2c5203b0e3fc476115c5b009f..4f24d457c8c60e6d84453d738fa867a8e769a89f 100644 (file)
@@ -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 &&