mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
conf: add xen specific feature: e820_host
e820_host is a Xen-specific option, only available for PV domains, that provides the domain a virtual e820 memory map based on the host one. It is enabled with a new Xen hypervisor feature, e.g. <features> <xen> <e820_host state='on'/> </xen> </features> e820_host is required when using PCI passthrough and is generally considered safe for any PV kernel. e820_host is silently ignored if set in HVM domain configuration. See xl.cfg(5) man page in the Xen documentation for more details. Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Reviewed-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
parent
de011c60a1
commit
b7d6648d43
@ -2061,6 +2061,9 @@
|
|||||||
<hidden state='on'/>
|
<hidden state='on'/>
|
||||||
<hint-dedicated state='on'/>
|
<hint-dedicated state='on'/>
|
||||||
</kvm>
|
</kvm>
|
||||||
|
<xen>
|
||||||
|
<e820_host state='on'/>
|
||||||
|
</xen>
|
||||||
<pvspinlock state='on'/>
|
<pvspinlock state='on'/>
|
||||||
<gic version='2'/>
|
<gic version='2'/>
|
||||||
<ioapic driver='qemu'/>
|
<ioapic driver='qemu'/>
|
||||||
@ -2242,6 +2245,23 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</dd>
|
</dd>
|
||||||
|
<dt><code>xen</code></dt>
|
||||||
|
<dd>Various features to change the behavior of the Xen hypervisor.
|
||||||
|
<table class="top_table">
|
||||||
|
<tr>
|
||||||
|
<th>Feature</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Value</th>
|
||||||
|
<th>Since</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>e820_host</td>
|
||||||
|
<td>Expose the host e820 to the guest (PV only)</td>
|
||||||
|
<td>on, off</td>
|
||||||
|
<td><span class="since">6.3.0</span></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
<dt><code>pmu</code></dt>
|
<dt><code>pmu</code></dt>
|
||||||
<dd>Depending on the <code>state</code> attribute (values <code>on</code>,
|
<dd>Depending on the <code>state</code> attribute (values <code>on</code>,
|
||||||
<code>off</code>, default <code>on</code>) enable or disable the
|
<code>off</code>, default <code>on</code>) enable or disable the
|
||||||
|
@ -5348,6 +5348,9 @@
|
|||||||
<optional>
|
<optional>
|
||||||
<ref name="kvm"/>
|
<ref name="kvm"/>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<ref name="xen"/>
|
||||||
|
</optional>
|
||||||
<optional>
|
<optional>
|
||||||
<element name="privnet">
|
<element name="privnet">
|
||||||
<empty/>
|
<empty/>
|
||||||
@ -6337,6 +6340,19 @@
|
|||||||
</element>
|
</element>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<!-- Optional Xen features -->
|
||||||
|
<define name="xen">
|
||||||
|
<element name="xen">
|
||||||
|
<interleave>
|
||||||
|
<optional>
|
||||||
|
<element name="e820_host">
|
||||||
|
<ref name="featurestate"/>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
</interleave>
|
||||||
|
</element>
|
||||||
|
</define>
|
||||||
|
|
||||||
<!-- Optional capabilities features -->
|
<!-- Optional capabilities features -->
|
||||||
<define name="capabilities">
|
<define name="capabilities">
|
||||||
<element name="capabilities">
|
<element name="capabilities">
|
||||||
|
@ -173,6 +173,7 @@ VIR_ENUM_IMPL(virDomainFeature,
|
|||||||
"nested-hv",
|
"nested-hv",
|
||||||
"msrs",
|
"msrs",
|
||||||
"ccf-assist",
|
"ccf-assist",
|
||||||
|
"xen",
|
||||||
);
|
);
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
|
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
|
||||||
@ -206,6 +207,11 @@ VIR_ENUM_IMPL(virDomainKVM,
|
|||||||
"hint-dedicated",
|
"hint-dedicated",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virDomainXen,
|
||||||
|
VIR_DOMAIN_XEN_LAST,
|
||||||
|
"e820_host"
|
||||||
|
);
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virDomainMsrsUnknown,
|
VIR_ENUM_IMPL(virDomainMsrsUnknown,
|
||||||
VIR_DOMAIN_MSRS_UNKNOWN_LAST,
|
VIR_DOMAIN_MSRS_UNKNOWN_LAST,
|
||||||
"ignore",
|
"ignore",
|
||||||
@ -20862,6 +20868,7 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
case VIR_DOMAIN_FEATURE_HYPERV:
|
case VIR_DOMAIN_FEATURE_HYPERV:
|
||||||
case VIR_DOMAIN_FEATURE_KVM:
|
case VIR_DOMAIN_FEATURE_KVM:
|
||||||
case VIR_DOMAIN_FEATURE_MSRS:
|
case VIR_DOMAIN_FEATURE_MSRS:
|
||||||
|
case VIR_DOMAIN_FEATURE_XEN:
|
||||||
def->features[val] = VIR_TRISTATE_SWITCH_ON;
|
def->features[val] = VIR_TRISTATE_SWITCH_ON;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -21172,6 +21179,51 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
VIR_FREE(nodes);
|
VIR_FREE(nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (def->features[VIR_DOMAIN_FEATURE_XEN] == VIR_TRISTATE_SWITCH_ON) {
|
||||||
|
int feature;
|
||||||
|
int value;
|
||||||
|
if ((n = virXPathNodeSet("./features/xen/*", ctxt, &nodes)) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
feature = virDomainXenTypeFromString((const char *)nodes[i]->name);
|
||||||
|
if (feature < 0) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("unsupported Xen feature: %s"),
|
||||||
|
nodes[i]->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((virDomainXen) feature) {
|
||||||
|
case VIR_DOMAIN_XEN_E820_HOST:
|
||||||
|
if (!(tmp = virXMLPropString(nodes[i], "state"))) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
|
_("missing 'state' attribute for "
|
||||||
|
"Xen feature '%s'"),
|
||||||
|
nodes[i]->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((value = virTristateSwitchTypeFromString(tmp)) < 0) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("invalid value of state argument "
|
||||||
|
"for Xen feature '%s'"),
|
||||||
|
nodes[i]->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_FREE(tmp);
|
||||||
|
def->xen_features[feature] = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* coverity[dead_error_begin] */
|
||||||
|
case VIR_DOMAIN_XEN_LAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VIR_FREE(nodes);
|
||||||
|
}
|
||||||
|
|
||||||
if (def->features[VIR_DOMAIN_FEATURE_SMM] == VIR_TRISTATE_SWITCH_ON) {
|
if (def->features[VIR_DOMAIN_FEATURE_SMM] == VIR_TRISTATE_SWITCH_ON) {
|
||||||
int rv = virDomainParseScaledValue("string(./features/smm/tseg)",
|
int rv = virDomainParseScaledValue("string(./features/smm/tseg)",
|
||||||
"string(./features/smm/tseg/@unit)",
|
"string(./features/smm/tseg/@unit)",
|
||||||
@ -23173,6 +23225,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
|
|||||||
case VIR_DOMAIN_FEATURE_PRIVNET:
|
case VIR_DOMAIN_FEATURE_PRIVNET:
|
||||||
case VIR_DOMAIN_FEATURE_HYPERV:
|
case VIR_DOMAIN_FEATURE_HYPERV:
|
||||||
case VIR_DOMAIN_FEATURE_KVM:
|
case VIR_DOMAIN_FEATURE_KVM:
|
||||||
|
case VIR_DOMAIN_FEATURE_XEN:
|
||||||
case VIR_DOMAIN_FEATURE_PVSPINLOCK:
|
case VIR_DOMAIN_FEATURE_PVSPINLOCK:
|
||||||
case VIR_DOMAIN_FEATURE_PMU:
|
case VIR_DOMAIN_FEATURE_PMU:
|
||||||
case VIR_DOMAIN_FEATURE_VMPORT:
|
case VIR_DOMAIN_FEATURE_VMPORT:
|
||||||
@ -23344,6 +23397,30 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* xen */
|
||||||
|
if (src->features[VIR_DOMAIN_FEATURE_XEN] == VIR_TRISTATE_SWITCH_ON) {
|
||||||
|
for (i = 0; i < VIR_DOMAIN_XEN_LAST; i++) {
|
||||||
|
switch ((virDomainXen) i) {
|
||||||
|
case VIR_DOMAIN_XEN_E820_HOST:
|
||||||
|
if (src->xen_features[i] != dst->xen_features[i]) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("State of Xen feature '%s' differs: "
|
||||||
|
"source: '%s', destination: '%s'"),
|
||||||
|
virDomainXenTypeToString(i),
|
||||||
|
virTristateSwitchTypeToString(src->xen_features[i]),
|
||||||
|
virTristateSwitchTypeToString(dst->xen_features[i]));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* coverity[dead_error_begin] */
|
||||||
|
case VIR_DOMAIN_XEN_LAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* kvm */
|
/* kvm */
|
||||||
if (src->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) {
|
if (src->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) {
|
||||||
for (i = 0; i < VIR_DOMAIN_KVM_LAST; i++) {
|
for (i = 0; i < VIR_DOMAIN_KVM_LAST; i++) {
|
||||||
@ -28963,6 +29040,31 @@ virDomainDefFormatFeatures(virBufferPtr buf,
|
|||||||
virBufferAddLit(&childBuf, "</kvm>\n");
|
virBufferAddLit(&childBuf, "</kvm>\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_FEATURE_XEN:
|
||||||
|
if (def->features[i] != VIR_TRISTATE_SWITCH_ON)
|
||||||
|
break;
|
||||||
|
|
||||||
|
virBufferAddLit(&childBuf, "<xen>\n");
|
||||||
|
virBufferAdjustIndent(&childBuf, 2);
|
||||||
|
for (j = 0; j < VIR_DOMAIN_XEN_LAST; j++) {
|
||||||
|
switch ((virDomainXen) j) {
|
||||||
|
case VIR_DOMAIN_XEN_E820_HOST:
|
||||||
|
if (def->xen_features[j])
|
||||||
|
virBufferAsprintf(&childBuf, "<%s state='%s'/>\n",
|
||||||
|
virDomainXenTypeToString(j),
|
||||||
|
virTristateSwitchTypeToString(
|
||||||
|
def->xen_features[j]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* coverity[dead_error_begin] */
|
||||||
|
case VIR_DOMAIN_XEN_LAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virBufferAdjustIndent(&childBuf, -2);
|
||||||
|
virBufferAddLit(&childBuf, "</xen>\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_FEATURE_CAPABILITIES:
|
case VIR_DOMAIN_FEATURE_CAPABILITIES:
|
||||||
for (j = 0; j < VIR_DOMAIN_PROCES_CAPS_FEATURE_LAST; j++) {
|
for (j = 0; j < VIR_DOMAIN_PROCES_CAPS_FEATURE_LAST; j++) {
|
||||||
if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT)
|
if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT)
|
||||||
|
@ -1814,6 +1814,7 @@ typedef enum {
|
|||||||
VIR_DOMAIN_FEATURE_NESTED_HV,
|
VIR_DOMAIN_FEATURE_NESTED_HV,
|
||||||
VIR_DOMAIN_FEATURE_MSRS,
|
VIR_DOMAIN_FEATURE_MSRS,
|
||||||
VIR_DOMAIN_FEATURE_CCF_ASSIST,
|
VIR_DOMAIN_FEATURE_CCF_ASSIST,
|
||||||
|
VIR_DOMAIN_FEATURE_XEN,
|
||||||
|
|
||||||
VIR_DOMAIN_FEATURE_LAST
|
VIR_DOMAIN_FEATURE_LAST
|
||||||
} virDomainFeature;
|
} virDomainFeature;
|
||||||
@ -1859,6 +1860,12 @@ typedef enum {
|
|||||||
VIR_DOMAIN_MSRS_UNKNOWN_LAST
|
VIR_DOMAIN_MSRS_UNKNOWN_LAST
|
||||||
} virDomainMsrsUnknown;
|
} virDomainMsrsUnknown;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VIR_DOMAIN_XEN_E820_HOST = 0,
|
||||||
|
|
||||||
|
VIR_DOMAIN_XEN_LAST
|
||||||
|
} virDomainXen;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT = 0,
|
VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT = 0,
|
||||||
VIR_DOMAIN_CAPABILITIES_POLICY_ALLOW,
|
VIR_DOMAIN_CAPABILITIES_POLICY_ALLOW,
|
||||||
@ -2484,6 +2491,7 @@ struct _virDomainDef {
|
|||||||
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
|
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
|
||||||
int kvm_features[VIR_DOMAIN_KVM_LAST];
|
int kvm_features[VIR_DOMAIN_KVM_LAST];
|
||||||
int msrs_features[VIR_DOMAIN_MSRS_LAST];
|
int msrs_features[VIR_DOMAIN_MSRS_LAST];
|
||||||
|
int xen_features[VIR_DOMAIN_XEN_LAST];
|
||||||
unsigned int hyperv_spinlocks;
|
unsigned int hyperv_spinlocks;
|
||||||
int hyperv_stimer_direct;
|
int hyperv_stimer_direct;
|
||||||
virGICVersion gic_version;
|
virGICVersion gic_version;
|
||||||
@ -3529,6 +3537,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode);
|
|||||||
VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy);
|
VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy);
|
||||||
VIR_ENUM_DECL(virDomainHyperv);
|
VIR_ENUM_DECL(virDomainHyperv);
|
||||||
VIR_ENUM_DECL(virDomainKVM);
|
VIR_ENUM_DECL(virDomainKVM);
|
||||||
|
VIR_ENUM_DECL(virDomainXen);
|
||||||
VIR_ENUM_DECL(virDomainMsrsUnknown);
|
VIR_ENUM_DECL(virDomainMsrsUnknown);
|
||||||
VIR_ENUM_DECL(virDomainRNGModel);
|
VIR_ENUM_DECL(virDomainRNGModel);
|
||||||
VIR_ENUM_DECL(virDomainRNGBackend);
|
VIR_ENUM_DECL(virDomainRNGBackend);
|
||||||
|
@ -302,6 +302,7 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_FEATURE_XEN:
|
||||||
case VIR_DOMAIN_FEATURE_ACPI:
|
case VIR_DOMAIN_FEATURE_ACPI:
|
||||||
case VIR_DOMAIN_FEATURE_PAE:
|
case VIR_DOMAIN_FEATURE_PAE:
|
||||||
case VIR_DOMAIN_FEATURE_HAP:
|
case VIR_DOMAIN_FEATURE_HAP:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user