mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
conf: pass in default architecture via domain XML options
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>
This commit is contained in:
parent
92d412149c
commit
6430c00552
@ -175,7 +175,11 @@
|
|||||||
and <a id="attributeOSTypeMachine"><code>machine</code></a> referring
|
and <a id="attributeOSTypeMachine"><code>machine</code></a> referring
|
||||||
to the machine type. The <a href="formatcaps.html">Capabilities XML</a>
|
to the machine type. The <a href="formatcaps.html">Capabilities XML</a>
|
||||||
provides details on allowed values for
|
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>
|
<dt><a id="elementLoader"><code>loader</code></a></dt>
|
||||||
<dd>The optional <code>loader</code> tag refers to a firmware blob,
|
<dd>The optional <code>loader</code> tag refers to a firmware blob,
|
||||||
which is specified by absolute path,
|
which is specified by absolute path,
|
||||||
|
@ -19613,6 +19613,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
|
|||||||
static int
|
static int
|
||||||
virDomainDefParseCaps(virDomainDefPtr def,
|
virDomainDefParseCaps(virDomainDefPtr def,
|
||||||
xmlXPathContextPtr ctxt,
|
xmlXPathContextPtr ctxt,
|
||||||
|
virDomainXMLOptionPtr xmlopt,
|
||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
@ -19673,6 +19674,13 @@ virDomainDefParseCaps(virDomainDefPtr def,
|
|||||||
return -1;
|
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,
|
if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
|
||||||
def->os.arch,
|
def->os.arch,
|
||||||
def->virtType,
|
def->virtType,
|
||||||
@ -19681,8 +19689,6 @@ virDomainDefParseCaps(virDomainDefPtr def,
|
|||||||
return -1;
|
return -1;
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
} else {
|
} else {
|
||||||
if (!def->os.arch)
|
|
||||||
def->os.arch = capsdata->arch;
|
|
||||||
if (!def->os.machine)
|
if (!def->os.machine)
|
||||||
def->os.machine = g_strdup(capsdata->machinetype);
|
def->os.machine = g_strdup(capsdata->machinetype);
|
||||||
}
|
}
|
||||||
@ -19840,7 +19846,7 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
id = -1;
|
id = -1;
|
||||||
def->id = (int)id;
|
def->id = (int)id;
|
||||||
|
|
||||||
if (virDomainDefParseCaps(def, ctxt, caps, flags) < 0)
|
if (virDomainDefParseCaps(def, ctxt, xmlopt, caps, flags) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Extract domain name */
|
/* Extract domain name */
|
||||||
|
@ -2705,6 +2705,7 @@ struct _virDomainDefParserConfig {
|
|||||||
/* data */
|
/* data */
|
||||||
unsigned int features; /* virDomainDefFeatures */
|
unsigned int features; /* virDomainDefFeatures */
|
||||||
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
|
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
|
||||||
|
virArch defArch;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void *(*virDomainXMLPrivateDataAllocFunc)(void *);
|
typedef void *(*virDomainXMLPrivateDataAllocFunc)(void *);
|
||||||
|
@ -424,6 +424,7 @@ testDriverNew(void)
|
|||||||
VIR_DOMAIN_DEF_FEATURE_USER_ALIAS |
|
VIR_DOMAIN_DEF_FEATURE_USER_ALIAS |
|
||||||
VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT |
|
VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT |
|
||||||
VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
|
VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
|
||||||
|
.defArch = VIR_ARCH_I686,
|
||||||
};
|
};
|
||||||
virDomainXMLPrivateDataCallbacks privatecb = {
|
virDomainXMLPrivateDataCallbacks privatecb = {
|
||||||
.alloc = testDomainObjPrivateAlloc,
|
.alloc = testDomainObjPrivateAlloc,
|
||||||
|
@ -139,6 +139,7 @@ vmwareDomainDeviceDefPostParse(virDomainDeviceDefPtr dev G_GNUC_UNUSED,
|
|||||||
virDomainDefParserConfig vmwareDomainDefParserConfig = {
|
virDomainDefParserConfig vmwareDomainDefParserConfig = {
|
||||||
.devicesPostParseCallback = vmwareDomainDeviceDefPostParse,
|
.devicesPostParseCallback = vmwareDomainDeviceDefPostParse,
|
||||||
.domainPostParseCallback = vmwareDomainDefPostParse,
|
.domainPostParseCallback = vmwareDomainDefPostParse,
|
||||||
|
.defArch = VIR_ARCH_I686,
|
||||||
};
|
};
|
||||||
|
|
||||||
static virDomainXMLOptionPtr
|
static virDomainXMLOptionPtr
|
||||||
|
@ -556,6 +556,7 @@ static virDomainDefParserConfig virVMXDomainDefParserConfig = {
|
|||||||
.features = (VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI |
|
.features = (VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI |
|
||||||
VIR_DOMAIN_DEF_FEATURE_NAME_SLASH |
|
VIR_DOMAIN_DEF_FEATURE_NAME_SLASH |
|
||||||
VIR_DOMAIN_DEF_FEATURE_NO_BOOT_ORDER),
|
VIR_DOMAIN_DEF_FEATURE_NO_BOOT_ORDER),
|
||||||
|
.defArch = VIR_ARCH_I686,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct virVMXDomainDefNamespaceData {
|
struct virVMXDomainDefNamespaceData {
|
||||||
|
Loading…
Reference in New Issue
Block a user