
On Wed, Feb 17, 2010 at 05:11:00PM +0000, Matthew Booth wrote:
Add support for virtio-serial by defining a new 'virtio' channel target type and a virtio-serial controller. Allows the following to be specified in a domain:
<controller type='virtio-serial' index='0' max_ports='16' vectors='4'/> <channel type='pty'> <target type='virtio' name='org.linux-kvm.port.0'/> <address type='virtio-serial' controller='0' bus='0'/> </channel>
* docs/schemas/domain.rng: Add virtio-serial controller and virtio channel type. * src/conf/domain_conf.[ch]: Domain parsing/serialization for virtio-serial controller and virtio channel. * tests/qemuxml2xmltest.c tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml : add domain xml parsing test * src/libvirt_private.syms src/qemu/qemu_conf.c: virDomainDefAddDiskControllers() renamed to virDomainDefAddImplicitControllers() --- docs/schemas/domain.rng | 71 +++++- src/conf/domain_conf.c | 234 +++++++++++++++++--- src/conf/domain_conf.h | 25 ++- src/libvirt_private.syms | 2 +- src/qemu/qemu_conf.c | 2 +- .../qemuxml2argv-channel-virtio.xml | 35 +++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 320 insertions(+), 50 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 53b82ce..85df8b8 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -523,16 +523,36 @@ </define> <define name="controller"> <element name="controller"> - <optional> - <attribute name="type"> - <choice> - <value>fdc</value> - <value>ide</value> - <value>scsi</value> - <value>sata</value> - </choice> - </attribute> - </optional> + <choice> + <group> + <optional> + <attribute name="type"> + <choice> + <value>fdc</value> + <value>ide</value> + <value>scsi</value> + <value>sata</value> + </choice> + </attribute> + </optional> + </group> + <!-- virtio-serial can have 2 additional attributes --> + <group> + <attribute name="type"> + <value>virtio-serial</value> + </attribute> + <optional> + <attribute name="max_ports"> + <ref name="unsignedInt"/> + </attribute> + </optional> + <optional> + <attribute name="vectors"> + <ref name="unsignedInt"/> + </attribute> + </optional>
What are these two new attributes doing ? Can't we just auto-assign those values based on the configured channels later int he XML.
+ </group> + </choice> <attribute name="index"> <ref name="unsignedInt"/> </attribute> @@ -1139,12 +1159,25 @@ <attribute name="port"/> </element> </define> + <define name="virtioTarget"> + <element name="target"> + <attribute name="type"> + <value>virtio</value> + </attribute> + <optional> + <attribute name="name"/> + </optional> + </element> + </define> <define name="channel"> <element name="channel"> <ref name="qemucdevSrcType"/> <interleave> <ref name="qemucdevSrcDef"/> - <ref name="guestfwdTarget"/> + <choice> + <ref name="guestfwdTarget"/> + <ref name="virtioTarget"/> + </choice> <optional> <ref name="address"/> </optional> @@ -1269,6 +1302,16 @@ <ref name="driveUnit"/> </attribute> </define> + <define name="virtioserialaddress"> + <attribute name="controller"> + <ref name="driveController"/> + </attribute> + <optional> + <attribute name="bus"> + <ref name="driveBus"/> + </attribute> + </optional> + </define>
What is the "bus" in the content of virtio serial ?
@@ -916,7 +930,8 @@ void virDomainDefClearDeviceAliases(virDomainDefPtr def) */ static int virDomainDeviceInfoFormat(virBufferPtr buf, virDomainDeviceInfoPtr info, - int flags) + int flags, + const char *indent)
I'm not seeing why we need to pass 'indent' through here? The device info data should always be appearing at exactly the same place in all devices, specifically at /domain/devices/[device type]/, so indent level should always be the same.
@@ -1481,10 +1553,49 @@ virDomainControllerDefParseXML(xmlNodePtr node, if (virDomainDeviceInfoParseXML(node, &def->info, flags) < 0) goto error;
+ switch (def->type) { + case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: + 0; /* C requires a statement immediately following a label */
Just put a curly brace after the case case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: {
+ + char *max_ports = virXMLPropString(node, "max_ports"); + if (max_ports) { + int r = virStrToLong_i(max_ports, NULL, 10, + &def->opts.vioserial.max_ports); + if (r != 0 || def->opts.vioserial.max_ports < 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid max_ports: %s"), max_ports); + VIR_FREE(max_ports); + goto error; + } + } else { + def->opts.vioserial.max_ports = -1; + } + VIR_FREE(max_ports); + + char *vectors = virXMLPropString(node, "vectors"); + if (vectors) { + int r = virStrToLong_i(vectors, NULL, 10, + &def->opts.vioserial.vectors); + if (r != 0 || def->opts.vioserial.vectors < 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid vectors: %s"), vectors); + VIR_FREE(vectors); + goto error; + } + } else { + def->opts.vioserial.vectors = -1; + }
I think '0' would be preferable as the not-initialized number here, since its not a valid value for either attribute AFAICT
+ VIR_FREE(vectors); + break;
And close it here } break;
+ + default: + break; + } + if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Disk controllers must use the 'pci' address type")); + _("Controllers must use the 'pci' address type")); goto error; }
Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|