[libvirt] [PATCH 1/2] Add domain support for virtio channel
Daniel P. Berrange
berrange at redhat.com
Thu Feb 18 12:34:13 UTC 2010
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 :|
More information about the libvir-list
mailing list