[libvirt] [PATCH/RFC]: hostdev passthrough support take #2
Daniel P. Berrange
berrange at redhat.com
Mon Aug 4 09:34:31 UTC 2008
On Sun, Aug 03, 2008 at 01:41:28AM +0200, Guido G?nther wrote:
> Hi,
> attached is a second version. Changes are:
>
> * s/bus/subsystem/
> * support hexadecimal and decimal attributes
> * introduce device and source elements.
>
> I decided to not drop vendor and product id into their own elements
> since the structure would then become very nested for no good reason.
The reason is that I want it to match the host device enumeration
XML format. This will be using explicit <product> and <vendor>
tags, with an 'id' attribute, because there will be text content
in the body giving the human readable name.
> Some examples:
>
> <hostdev mode="subsys" type='usb'>
> <source>
> <device vendor="0x0204" product="0x6025"/>
So this needs to be changed to
<vendor id="0x0204"/>
<product id="0x6025"/>
> </source>
> </hostdev>
>
> <hostdev mode="subsys" type='usb'>
> <source>
> <address bus="001" device="003"/>
> </source>
> </hostdev>
This one is fine.
>
> Support for <target> will be coming once I got around to adjust
> qemu/kvm.
Ok, that's not critical, but the other things we need before we
can commit this are
- Code to format XML for output, so that the devices are included when
dumping the XML description of a guest.
- Update to the RNG schema in docs/libvirt.rng
- Example XML data files in tests/qemuxml2argvdata/, along with the
corresponding CLI args for QEMU. THis is then hooked into the
qemuxml2argvtest.c and qemuxml2xmltest.c files
The latter test suite requires point the XML formatting & RNG updates.
The currrent code you have for parsing XML & attaching device/creating
CLI flags is basically correct with only very minor bugs
>
> +static int
> +virDomainHostdevSubsysUsbDefParseXML(virConnectPtr conn,
> + const xmlNodePtr node,
> + virDomainHostdevDefPtr def) {
Minor indentation bug.
> +
> + int ret = -1;
> + xmlNodePtr cur;
> +
> + def->source.subsys.usb.vendor = 0;
> + def->source.subsys.usb.product = 0;
> + def->source.subsys.usb.bus = 0;
> + def->source.subsys.usb.device = 0;
This isn't needed, since the VIR_ALLOC contract says that the memory
range has been memset() to all zero.
> +static int qemudDomainAttachHostDevice(virDomainPtr dom, virDomainDeviceDefPtr dev)
> +{
> + struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
> + virDomainObjPtr vm = virDomainFindByUUID(driver->domains, dom->uuid);
> + int ret;
> + char *cmd, *reply;
> +
> + if (dev->data.hostdev->source.subsys.usb.vendor) {
> + ret = asprintf(&cmd, "usb_add host:%.4x:%.4x",
> + dev->data.hostdev->source.subsys.usb.vendor,
> + dev->data.hostdev->source.subsys.usb.product);
> + } else {
> + ret = asprintf(&cmd, "usb_add host:%.3d.%.3d",
> + dev->data.hostdev->source.subsys.usb.bus,
> + dev->data.hostdev->source.subsys.usb.device);
> + }
> + if (ret == -1) {
> + qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
> + "%s", _("out of memory"));
> + return -1;
This should be reporting OOM, and not pass the 'dom' parameter, and
no need for a string message, eg
qemudReportError(dom->conn, NULL, NULL, VIR_ERR_NO_MEMORY, NULL);
Regards,
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