]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: pass in default architecture via domain XML options
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 27 Nov 2019 15:22:45 +0000 (15:22 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 9 Dec 2019 10:15:16 +0000 (10:15 +0000)
When parsing the guest XML we must fill in the default guest arch if it
is not already present because later parts of the parsing process need
this information.

If no arch is specified we lookup the first guest in the capabilities
data matching the os type and virt type. In most cases this will result
in picking the host architecture but there are some exceptions...

 - The test driver is hardcoded to always use i686 arch
 - The VMWare/ESX drivers will always place i686 guests ahead
   of x86_64 guests in capabilities, so effectively they always
   use i686
 - The QEMU driver can potentially return any arch at all
   depending on what combination of QEMU binaries are installed.

The domain XML hardware configurations are inherently architecture
specific in many places. As a result whomever/whatever created the
domain XML will have had a particular architecture in mind when
specifying the config. In pretty much any sensible case this arch
will have been the native host architecture. i686 on x86_64 is
the only sensible divergance because both these archs are
compatible from a domaain XML config POV.

IOW, although the QEMU driver can pick an almost arbitrary arch as its
default, in the real world no application or user is likely to be
relying on this default arch being anything other than native.

With all this in mind, it is reasonable to change the XML parser to
allow the default architecture to be passed via the domain XML options
struct. If no info is explicitly given then it is safe & sane to pick
the host native architecture as the default for the guest.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
docs/formatdomain.html.in
src/conf/domain_conf.c
src/conf/domain_conf.h
src/test/test_driver.c
src/vmware/vmware_driver.c
src/vmx/vmx.c

index 5c0a00350bb4fe77edbed6a64f5ea501ab0d262d..bfcdc026e66743d230e80fc9a49a09c23e882be6 100644 (file)
         and <a id="attributeOSTypeMachine"><code>machine</code></a> referring
         to the machine type. The <a href="formatcaps.html">Capabilities XML</a>
         provides details on allowed values for
-        these. <span class="since">Since 0.0.1</span></dd>
+        these. If <code>arch</code> is omitted then for most hypervisor
+        drivers, the host native arch will be chosen. For the <code>test</code>,
+        <code>ESX</code> and <code>VMWare</code> hypervisor drivers, however,
+        the <code>i686</code> arch will always be chosen even on an
+        <code>x86_64</code> host. <span class="since">Since 0.0.1</span></dd>
       <dt><a id="elementLoader"><code>loader</code></a></dt>
       <dd>The optional <code>loader</code> tag refers to a firmware blob,
         which is specified by absolute path,
index a7a89b61b93ed5bad21485c84f8dcbbccc78a57a..3d36bb9ac90c6dddc6f3e6c4bddf287f7ac980ee 100644 (file)
@@ -19613,6 +19613,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
 static int
 virDomainDefParseCaps(virDomainDefPtr def,
                       xmlXPathContextPtr ctxt,
+                      virDomainXMLOptionPtr xmlopt,
                       virCapsPtr caps,
                       unsigned int flags)
 {
@@ -19673,6 +19674,13 @@ virDomainDefParseCaps(virDomainDefPtr def,
         return -1;
     }
 
+    if (def->os.arch == VIR_ARCH_NONE) {
+        if (xmlopt && xmlopt->config.defArch != VIR_ARCH_NONE)
+            def->os.arch = xmlopt->config.defArch;
+        else
+            def->os.arch = virArchFromHost();
+    }
+
     if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
                                                      def->os.arch,
                                                      def->virtType,
@@ -19681,8 +19689,6 @@ virDomainDefParseCaps(virDomainDefPtr def,
             return -1;
         virResetLastError();
     } else {
-        if (!def->os.arch)
-            def->os.arch = capsdata->arch;
         if (!def->os.machine)
             def->os.machine = g_strdup(capsdata->machinetype);
     }
@@ -19840,7 +19846,7 @@ virDomainDefParseXML(xmlDocPtr xml,
             id = -1;
     def->id = (int)id;
 
-    if (virDomainDefParseCaps(def, ctxt, caps, flags) < 0)
+    if (virDomainDefParseCaps(def, ctxt, xmlopt, caps, flags) < 0)
         goto error;
 
     /* Extract domain name */
index 6b70eda14e05976a0a1d838cb75e87bce0b5cb05..462323ec76b4e861cb498a2f4da5c809d359b0b4 100644 (file)
@@ -2705,6 +2705,7 @@ struct _virDomainDefParserConfig {
     /* data */
     unsigned int features; /* virDomainDefFeatures */
     unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
+    virArch defArch;
 };
 
 typedef void *(*virDomainXMLPrivateDataAllocFunc)(void *);
index e7ec537bb0f65ba486a17c9193f755c2ceabd551..f2700d90bc3b8df374a830bdc08cee83434a779d 100644 (file)
@@ -424,6 +424,7 @@ testDriverNew(void)
                     VIR_DOMAIN_DEF_FEATURE_USER_ALIAS |
                     VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT |
                     VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
+        .defArch = VIR_ARCH_I686,
     };
     virDomainXMLPrivateDataCallbacks privatecb = {
         .alloc = testDomainObjPrivateAlloc,
index c0071fc18c77d323962bd6201b570877d6e856f1..bab4fdb82bdffdeca435fccbd119f513acf9264d 100644 (file)
@@ -139,6 +139,7 @@ vmwareDomainDeviceDefPostParse(virDomainDeviceDefPtr dev G_GNUC_UNUSED,
 virDomainDefParserConfig vmwareDomainDefParserConfig = {
     .devicesPostParseCallback = vmwareDomainDeviceDefPostParse,
     .domainPostParseCallback = vmwareDomainDefPostParse,
+    .defArch = VIR_ARCH_I686,
 };
 
 static virDomainXMLOptionPtr
index 0ccc4eefe63ec8ab4e779f775a1ce754f9e16bb5..c4af7b1ce97763cec066e47eed3260a4968f093e 100644 (file)
@@ -556,6 +556,7 @@ static virDomainDefParserConfig virVMXDomainDefParserConfig = {
     .features = (VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI |
                  VIR_DOMAIN_DEF_FEATURE_NAME_SLASH |
                  VIR_DOMAIN_DEF_FEATURE_NO_BOOT_ORDER),
+    .defArch = VIR_ARCH_I686,
 };
 
 struct virVMXDomainDefNamespaceData {