Event channels are like PV interrupts and in conjuction with grant frames
form a data transfer mechanism for PV drivers. They are also used for
inter-processor interrupts. Guests with a large number of vcpus and/or
many PV devices many need to increase the maximum default value of 1023.
For this reason the native Xen config format supports the
'max_event_channels' setting. See xl.cfg(5) man page for more details.
Similar to the existing maxGrantFrames option, add a new xenbus controller
option 'maxEventChannels', allowing to adjust the maximum value via libvirt.
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
docs/formatdomain.html.in | 8 ++++++--
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 15 +++++++++++++++
src/conf/domain_conf.h | 1 +
4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index d56600dc18..eabb7b6ece 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4454,7 +4454,7 @@
<driver iothread='4'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x0b' function='0x0'/>
</controller>
- <controller type='xenbus' maxGrantFrames='64'/>
+ <controller type='xenbus' maxGrantFrames='64'
maxEventChannels='2047'/>
...
</devices>
...</pre>
@@ -4514,7 +4514,11 @@
<dd><span class="since">Since 5.2.0</span>, the
<code>xenbus</code>
controller has an optional attribute <code>maxGrantFrames</code>,
which specifies the maximum number of grant frames the controller
- makes available for connected devices.</dd>
+ makes available for connected devices.
+ <span class="since">Since 6.3.0</span>, the xenbus
controller
+ supports the optional <code>maxEventChannels</code> attribute,
+ which specifies maximum number of event channels (PV interrupts)
+ that can be used by the guest.</dd>
</dl>
<p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index dcf2e09db8..d0dcab9059 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2548,6 +2548,11 @@
<ref name="unsignedInt"/>
</attribute>
</optional>
+ <optional>
+ <attribute name="maxEventChannels">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
</group>
</choice>
<optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6ad7552bde..0a2aa53264 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2252,6 +2252,7 @@ virDomainControllerDefNew(virDomainControllerType type)
break;
case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
def->opts.xenbusopts.maxGrantFrames = -1;
+ def->opts.xenbusopts.maxEventChannels = -1;
break;
case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
@@ -11344,6 +11345,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
break;
case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: {
g_autofree char *gntframes = virXMLPropString(node, "maxGrantFrames");
+ g_autofree char *eventchannels = virXMLPropString(node,
"maxEventChannels");
if (gntframes) {
int r = virStrToLong_i(gntframes, NULL, 10,
@@ -11354,6 +11356,15 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
goto error;
}
}
+ if (eventchannels) {
+ int r = virStrToLong_i(eventchannels, NULL, 10,
+ &def->opts.xenbusopts.maxEventChannels);
+ if (r != 0 || def->opts.xenbusopts.maxEventChannels < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Invalid maxEventChannels: %s"),
eventchannels);
+ goto error;
+ }
+ }
break;
}
@@ -25286,6 +25297,10 @@ virDomainControllerDefFormat(virBufferPtr buf,
virBufferAsprintf(&attrBuf, " maxGrantFrames='%d'",
def->opts.xenbusopts.maxGrantFrames);
}
+ if (def->opts.xenbusopts.maxEventChannels != -1) {
+ virBufferAsprintf(&attrBuf, " maxEventChannels='%d'",
+ def->opts.xenbusopts.maxEventChannels);
+ }
break;
default:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 024f692053..089d600061 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -730,6 +730,7 @@ struct _virDomainUSBControllerOpts {
struct _virDomainXenbusControllerOpts {
int maxGrantFrames; /* -1 == undef */
+ int maxEventChannels; /* -1 == undef */
};
/* Stores the virtual disk controller configuration */
--
2.26.0