conf: Add a new xenbus controller option for event channels

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@suse.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Jim Fehlig 2020-04-07 16:37:09 -06:00
parent 65ff4e6c0f
commit 8e669b382c
4 changed files with 27 additions and 2 deletions

View File

@ -4464,7 +4464,7 @@
&lt;driver iothread='4'/&gt;
&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/&gt;
&lt;/controller&gt;
&lt;controller type='xenbus' maxGrantFrames='64'/&gt;
&lt;controller type='xenbus' maxGrantFrames='64' maxEventChannels='2047'/&gt;
...
&lt;/devices&gt;
...</pre>
@ -4524,7 +4524,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>

View File

@ -2548,6 +2548,11 @@
<ref name="unsignedInt"/>
</attribute>
</optional>
<optional>
<attribute name="maxEventChannels">
<ref name="unsignedInt"/>
</attribute>
</optional>
</group>
</choice>
<optional>

View File

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

View File

@ -730,6 +730,7 @@ struct _virDomainUSBControllerOpts {
struct _virDomainXenbusControllerOpts {
int maxGrantFrames; /* -1 == undef */
int maxEventChannels; /* -1 == undef */
};
/* Stores the virtual disk controller configuration */