From 8e669b382c3533793356261c6d748df56162a2c6 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Tue, 7 Apr 2020 16:37:09 -0600 Subject: [PATCH] conf: Add a new xenbus controller option for event channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Daniel P. Berrangé --- 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 47e10a836c..8a4f7b1e87 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -4464,7 +4464,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> ... @@ -4524,7 +4524,11 @@
Since 5.2.0, the xenbus controller has an optional attribute maxGrantFrames, which specifies the maximum number of grant frames the controller - makes available for connected devices.
+ makes available for connected devices. + Since 6.3.0, the xenbus controller + supports the optional maxEventChannels attribute, + which specifies maximum number of event channels (PV interrupts) + that can be used by the guest.

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 12e842cec5..f7eeb0200f 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2548,6 +2548,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c478d79554..639d471424 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2262,6 +2262,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: @@ -11364,6 +11365,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, @@ -11374,6 +11376,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; } @@ -25314,6 +25325,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 33e1e2235c..9310fab169 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 */