1
0
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:
Marek Marczykowski-Górecki 2020-04-14 04:37:04 +02:00 committed by Jim Fehlig
parent de011c60a1
commit b7d6648d43
5 changed files with 148 additions and 0 deletions

View File

@ -2061,6 +2061,9 @@
&lt;hidden state='on'/&gt; &lt;hidden state='on'/&gt;
&lt;hint-dedicated state='on'/&gt; &lt;hint-dedicated state='on'/&gt;
&lt;/kvm&gt; &lt;/kvm&gt;
&lt;xen&gt;
&lt;e820_host state='on'/&gt;
&lt;/xen&gt;
&lt;pvspinlock state='on'/&gt; &lt;pvspinlock state='on'/&gt;
&lt;gic version='2'/&gt; &lt;gic version='2'/&gt;
&lt;ioapic driver='qemu'/&gt; &lt;ioapic driver='qemu'/&gt;
@ -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

View File

@ -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">

View File

@ -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)

View File

@ -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);

View File

@ -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: