[libvirt] [RFC][PATCH]QEMU: Parse -device vfio-pci commandline

Hong-Hua.Yin at freescale.com Hong-Hua.Yin at freescale.com
Thu Jun 5 11:51:02 UTC 2014


The test case failed with the patch.

tests]$ VIR_TEST_DEBUG=1 ./qemuargv2xmltest
...
78) QEMU ARGV-2-XML hostdev-vfio                                      ... FAILED
...

tests]$ ../tools/virsh domxml-from-native qemu-argv qemuxml2argvdata/qemuxml2argv-hostdev-vfio.args
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>unnamed</name>
  <uuid>4f190a56-f64b-4db4-b326-c4895dd1bae5</uuid>
  <memory unit='KiB'>219136</memory>
  <currentMemory unit='KiB'>219136</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='i686' machine='\
pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>\
/usr/bin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='\
/dev/HostVG/QEMUGuest2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'/>
    <controller type='ide' index='0'/>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
      </source>
    </hostdev>
    <memballoon model='virtio'/>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-nodefconfig'/>
    <qemu:arg value='-nodefaults'/>
  </qemu:commandline>
</domain>

It seemed that <hostdev> section is correct as expected.
Why does the case fail? How to check more detailed debug information?


Best Regards,
Olivia 
> -----Original Message-----
> From: Olivia Yin [mailto:Hong-Hua.Yin at freescale.com]
> Sent: Thursday, June 05, 2014 7:43 PM
> To: libvir-list at redhat.com
> Cc: Yin Olivia-R63875
> Subject: [RFC][PATCH]QEMU: Parse -device vfio-pci commandline
> 
> Signed-off-by: Olivia Yin <Hong-Hua.Yin at freescale.com>
> ---
>  src/qemu/qemu_command.c  | 67
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/qemuargv2xmltest.c |  2 +-
>  2 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index
> e6acced..4db4a1d 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -10239,6 +10239,59 @@ qemuParseCommandLinePCI(const char *val)
>      return NULL;
>  }
> 
> +/*
> + * Tries to parse a QEMU vfio-pci device  */ static
> +virDomainHostdevDefPtr qemuParseCommandLineVFIOPCI(const char *val) {
> +    int bus = 0, slot = 0, func = 0;
> +    const char *start;
> +    char *end;
> +    virDomainHostdevDefPtr def = virDomainHostdevDefAlloc();
> +
> +    if (!def)
> +       goto error;
> +
> +    if (!STRPREFIX(val, "host=")) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("unknown PCI device syntax '%s'"), val);
> +        goto error;
> +    }
> +
> +    start = val + strlen("host=");
> +    if (virStrToLong_i(start, &end, 16, &bus) < 0 || *end != ':') {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("cannot extract PCI device bus '%s'"), val);
> +        goto error;
> +    }
> +    start = end + 1;
> +    if (virStrToLong_i(start, &end, 16, &slot) < 0 || *end != '.') {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("cannot extract PCI device slot '%s'"), val);
> +        goto error;
> +    }
> +    start = end + 1;
> +    if (virStrToLong_i(start, &end, 16, &func) < 0 || *end != ',') {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("cannot extract PCI device function '%s'"), val);
> +        goto error;
> +    }
> +
> +    def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
> +    def->managed = true;
> +    def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
> +    def->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
> +    def->source.subsys.u.pci.addr.bus = bus;
> +    def->source.subsys.u.pci.addr.slot = slot;
> +    def->source.subsys.u.pci.addr.function = func;
> +    return def;
> +
> + error:
> +    virDomainHostdevDefFree(def);
> +    return NULL;
> +}
> +
> 
>  /*
>   * Tries to parse a QEMU USB device
> @@ -11351,6 +11404,20 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
>                  virDomainHostdevDefFree(hostdev);
>                  goto error;
>              }
> +        } else if (STREQ(arg, "-device")) {
> +            WANT_VALUE();
> +            if (STRPREFIX(val, "vfio-pci,")) {
> +                const char *start;
> +                start = val;
> +                virDomainHostdevDefPtr hostdev;
> +                start += strlen("vfio-pci,");
> +                if (!(hostdev = qemuParseCommandLineVFIOPCI(start)))
> +                    goto error;
> +                if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs,
> hostdev) < 0) {
> +                    virDomainHostdevDefFree(hostdev);
> +                    goto error;
> +                }
> +            }
>          } else if (STREQ(arg, "-soundhw")) {
>              const char *start;
>              WANT_VALUE();
> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index
> 0fc9fcb..b4ba97a 100644
> --- a/tests/qemuargv2xmltest.c
> +++ b/tests/qemuargv2xmltest.c
> @@ -251,8 +251,8 @@ mymain(void)
>      DO_TEST("watchdog");
> 
>      DO_TEST("hostdev-usb-address");
> -
>      DO_TEST("hostdev-pci-address");
> +    DO_TEST("hostdev-vfio");
> 
>      DO_TEST("smp");
> 
> --
> 1.8.5





More information about the libvir-list mailing list