[libvirt] [PATCH 0/3] qemu aio mode per disk

I've taken the patch that Matthias Dahl originally posted _months_ ago: https://www.redhat.com/archives/libvir-list/2010-April/msg00888.html and updated it by splitting into three patches, adding more testsuite coverage, improving documentation, and altering the names slightly. The end result is that you use: <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' io='native'/> ... </disk> </devices> as the way to request qemu -drive ...,aio=native Let's get this reviewed and in, rather than dragging our feet for a few more months :) Eric Blake (1): qemu aio: enable support Matthias Dahl (2): qemu aio: add XML parsing qemu aio: parse aio support from qemu -help AUTHORS | 1 + docs/formatdomain.html.in | 40 +++++++++++++++++---- docs/schemas/domain.rng | 11 ++++++ src/conf/domain_conf.c | 25 +++++++++++++ src/conf/domain_conf.h | 10 +++++ src/libvirt_private.syms | 3 ++ src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 3 +- src/qemu/qemu_command.c | 17 +++++++++ tests/qemuhelptest.c | 12 ++++-- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 33 +++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/qemuxml2xmltest.c | 1 + 14 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml -- 1.7.3.4

From: Matthias Dahl <mdvirt@designassembly.de> Allows io={threads|native} as an optional attribute to <driver>. Signed-off-by: Eric Blake <eblake@redhat.com> --- AUTHORS | 1 + docs/formatdomain.html.in | 40 +++++++++++++++++++++++++++++++++------- docs/schemas/domain.rng | 11 +++++++++++ src/conf/domain_conf.c | 25 +++++++++++++++++++++++++ src/conf/domain_conf.h | 10 ++++++++++ src/libvirt_private.syms | 3 +++ 6 files changed, 83 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index c704a41..496c740 100644 --- a/AUTHORS +++ b/AUTHORS diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index dad268d..9531732 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -635,7 +635,7 @@ </disk> ... <disk type='network'> - <driver name="qemu" type="raw"/> + <driver name="qemu" type="raw" io="aiothreads"/> <source protocol="sheepdog" name="image_name"> <host name="hostname" port="7000"/> </source> @@ -685,12 +685,38 @@ <span class="since">Since 0.0.3; <code>bus</code> attribute since 0.4.3; "usb" attribute value since after 0.4.4</span></dd> <dt><code>driver</code></dt> - <dd>If the hypervisor supports multiple backend drivers, then the optional - <code>driver</code> element allows them to be selected. The <code>name</code> - attribute is the primary backend driver name, while the optional <code>type</code> - attribute provides the sub-type. The optional <code>cache</code> attribute - controls the cache mechanism, possible values are "default", "none", - "writethrough" and "writeback". <span class="since">Since 0.1.8</span> + <dd> + The optional driver element allows specifying further details + related to the hypervisor driver used to provide the disk. + <span class="since">Since 0.1.8; <code>io</code> attribute + since 0.8.8</span> + <ul> + <li> + If the hypervisor supports multiple backend drivers, then + the <code>name</code> attribute selects the primary + backend driver name, while the optional <code>type</code> + attribute provides the sub-type. For example, xen + supports a name of "tap", "tap2", "phy", or "file", with a + type of "aio", while qemu only supports a name of "qemu", + but multiple types including "raw", "bochs", "qcow2", and + "qed". + </li> + <li> + The optional <code>cache</code> attribute controls the + cache mechanism, possible values are "default", "none", + "writethrough" and "writeback". + </li> + <li> + The optional <code>error_policy</code> attribute controls + how the hypervisor will behave on an error, possible + values are "stop", "ignore", and "enospace". + </li> + <li> + The optional <code>io</code> attribute controls specific + policies on I/O; qemu guests support "threads" and + "native". + </li> + </ul> </dd> <dt><code>encryption</code></dt> <dd>If present, specifies how the volume is encrypted. See diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index a79ca6a..e110627 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -693,6 +693,9 @@ <optional> <ref name="driverErrorPolicy"/> </optional> + <optional> + <ref name="driverIO"/> + </optional> <empty/> </element> </define> @@ -724,6 +727,14 @@ </choice> </attribute> </define> + <define name="driverIO"> + <attribute name="io"> + <choice> + <value>threads</value> + <value>native</value> + </choice> + </attribute> + </define> <define name="controller"> <element name="controller"> <choice> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c7de054..41ffd0a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -148,6 +148,11 @@ VIR_ENUM_IMPL(virDomainDiskProtocol, VIR_DOMAIN_DISK_PROTOCOL_LAST, "rbd", "sheepdog") +VIR_ENUM_IMPL(virDomainDiskIo, VIR_DOMAIN_DISK_IO_LAST, + "default", + "native", + "threads") + VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST, "ide", "fdc", @@ -1629,6 +1634,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *bus = NULL; char *cachetag = NULL; char *error_policy = NULL; + char *iotag = NULL; char *devaddr = NULL; virStorageEncryptionPtr encryption = NULL; char *serial = NULL; @@ -1743,6 +1749,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, driverType = virXMLPropString(cur, "type"); cachetag = virXMLPropString(cur, "cache"); error_policy = virXMLPropString(cur, "error_policy"); + iotag = virXMLPropString(cur, "io"); } else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) { def->readonly = 1; } else if (xmlStrEqual(cur->name, BAD_CAST "shareable")) { @@ -1866,6 +1873,15 @@ virDomainDiskDefParseXML(virCapsPtr caps, goto error; } + if (iotag) { + if ((def->iomode = virDomainDiskIoTypeFromString(iotag)) < 0 || + def->iomode == VIR_DOMAIN_DISK_IO_DEFAULT) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown disk io mode '%s'"), iotag); + goto error; + } + } + if (devaddr) { if (virDomainParseLegacyDeviceAddress(devaddr, &def->info.addr.pci) < 0) { @@ -1927,6 +1943,7 @@ cleanup: VIR_FREE(driverName); VIR_FREE(cachetag); VIR_FREE(error_policy); + VIR_FREE(iotag); VIR_FREE(devaddr); VIR_FREE(serial); virStorageEncryptionFree(encryption); @@ -6055,6 +6072,7 @@ virDomainDiskDefFormat(virBufferPtr buf, const char *bus = virDomainDiskBusTypeToString(def->bus); const char *cachemode = virDomainDiskCacheTypeToString(def->cachemode); const char *error_policy = virDomainDiskErrorPolicyTypeToString(def->error_policy); + const char *iomode = virDomainDiskIoTypeToString(def->iomode); if (!type) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -6076,6 +6094,11 @@ virDomainDiskDefFormat(virBufferPtr buf, _("unexpected disk cache mode %d"), def->cachemode); return -1; } + if (!iomode) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected disk io mode %d"), def->iomode); + return -1; + } virBufferVSprintf(buf, " <disk type='%s' device='%s'>\n", @@ -6091,6 +6114,8 @@ virDomainDiskDefFormat(virBufferPtr buf, virBufferVSprintf(buf, " cache='%s'", cachemode); if (def->error_policy) virBufferVSprintf(buf, " error_policy='%s'", error_policy); + if (def->iomode) + virBufferVSprintf(buf, " io='%s'", iomode); virBufferVSprintf(buf, "/>\n"); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d4c8e87..7ddb375 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -180,6 +180,14 @@ struct _virDomainDiskHostDef { char *port; }; +enum virDomainDiskIo { + VIR_DOMAIN_DISK_IO_DEFAULT, + VIR_DOMAIN_DISK_IO_NATIVE, + VIR_DOMAIN_DISK_IO_THREADS, + + VIR_DOMAIN_DISK_IO_LAST +}; + /* Stores the virtual disk configuration */ typedef struct _virDomainDiskDef virDomainDiskDef; typedef virDomainDiskDef *virDomainDiskDefPtr; @@ -197,6 +205,7 @@ struct _virDomainDiskDef { char *serial; int cachemode; int error_policy; + int iomode; unsigned int readonly : 1; unsigned int shared : 1; virDomainDeviceInfo info; @@ -1281,6 +1290,7 @@ VIR_ENUM_DECL(virDomainDiskBus) VIR_ENUM_DECL(virDomainDiskCache) VIR_ENUM_DECL(virDomainDiskErrorPolicy) VIR_ENUM_DECL(virDomainDiskProtocol) +VIR_ENUM_DECL(virDomainDiskIo) VIR_ENUM_DECL(virDomainController) VIR_ENUM_DECL(virDomainControllerModel) VIR_ENUM_DECL(virDomainFS) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2ce4bed..22e98e3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -232,9 +232,12 @@ virDomainDiskDefAssignAddress; virDomainDiskDefForeachPath; virDomainDiskDefFree; virDomainDiskDeviceTypeToString; +virDomainDiskErrorPolicyTypeFromString; virDomainDiskErrorPolicyTypeToString; virDomainDiskInsert; virDomainDiskInsertPreAlloced; +virDomainDiskIoTypeFromString; +virDomainDiskIoTypeToString; virDomainDiskRemove; virDomainDiskTypeFromString; virDomainDiskTypeToString; -- 1.7.3.4

On Fri, Jan 14, 2011 at 03:58:08PM -0700, Eric Blake wrote:
From: Matthias Dahl <mdvirt@designassembly.de>
Allows io={threads|native} as an optional attribute to <driver>.
Signed-off-by: Eric Blake <eblake@redhat.com> --- AUTHORS | 1 + docs/formatdomain.html.in | 40 +++++++++++++++++++++++++++++++++------- docs/schemas/domain.rng | 11 +++++++++++ src/conf/domain_conf.c | 25 +++++++++++++++++++++++++ src/conf/domain_conf.h | 10 ++++++++++ src/libvirt_private.syms | 3 +++ 6 files changed, 83 insertions(+), 7 deletions(-)
I still don't really like this conceptually, not least because the latest idea of using coroutines in QEMU means the 'aio' toggle might go away completely. I've failed to come up with any viable alternatives though. ACK. Daniel

From: Matthias Dahl <mdvirt@designassembly.de> Signed-off-by: Eric Blake <eblake@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 3 ++- tests/qemuhelptest.c | 12 ++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index f967255..59b4d2c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -803,6 +803,8 @@ qemuCapsComputeCmdFlags(const char *help, flags |= QEMUD_CMD_FLAG_DRIVE_FORMAT; if (strstr(help, "readonly=")) flags |= QEMUD_CMD_FLAG_DRIVE_READONLY; + if (strstr(help, "aio=threads|native")) + flags |= QEMUD_CMD_FLAG_DRIVE_AIO; } if ((p = strstr(help, "-vga")) && !strstr(help, "-std-vga")) { const char *nl = strstr(p, "\n"); diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 8057479..40a3e48 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -1,7 +1,7 @@ /* * qemu_capabilities.h: QEMU capabilities generation * - * Copyright (C) 2006-2007, 2009-2010 Red Hat, Inc. + * Copyright (C) 2006-2011 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -83,6 +83,7 @@ enum qemuCapsFlags { QEMUD_CMD_FLAG_SPICE = (1LL << 46), /* Is -spice avail */ QEMUD_CMD_FLAG_VGA_NONE = (1LL << 47), /* The 'none' arg for '-vga' */ QEMUD_CMD_FLAG_MIGRATE_QEMU_FD = (1LL << 48), /* -incoming fd:n */ + QEMUD_CMD_FLAG_DRIVE_AIO = (1LL << 49), /* -drive aio= supported */ }; virCapsPtr qemuCapsInit(virCapsPtr old_caps); diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 5d78e2d..e9579de 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -309,7 +309,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_NAME_PROCESS | QEMUD_CMD_FLAG_SMBIOS_TYPE | QEMUD_CMD_FLAG_VGA_NONE | - QEMUD_CMD_FLAG_MIGRATE_QEMU_FD, + QEMUD_CMD_FLAG_MIGRATE_QEMU_FD | + QEMUD_CMD_FLAG_DRIVE_AIO, 12001, 0, 0); DO_TEST("qemu-kvm-0.12.1.2-rhel60", QEMUD_CMD_FLAG_VNC_COLON | @@ -349,7 +350,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_VGA_QXL | QEMUD_CMD_FLAG_SPICE | QEMUD_CMD_FLAG_VGA_NONE | - QEMUD_CMD_FLAG_MIGRATE_QEMU_FD, + QEMUD_CMD_FLAG_MIGRATE_QEMU_FD | + QEMUD_CMD_FLAG_DRIVE_AIO, 12001, 1, 0); DO_TEST("qemu-kvm-0.12.3", QEMUD_CMD_FLAG_VNC_COLON | @@ -386,7 +388,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_NAME_PROCESS | QEMUD_CMD_FLAG_SMBIOS_TYPE | QEMUD_CMD_FLAG_VGA_NONE | - QEMUD_CMD_FLAG_MIGRATE_QEMU_FD, + QEMUD_CMD_FLAG_MIGRATE_QEMU_FD | + QEMUD_CMD_FLAG_DRIVE_AIO, 12003, 1, 0); DO_TEST("qemu-kvm-0.13.0", QEMUD_CMD_FLAG_VNC_COLON | @@ -431,7 +434,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_SMBIOS_TYPE | QEMUD_CMD_FLAG_SPICE | QEMUD_CMD_FLAG_VGA_NONE | - QEMUD_CMD_FLAG_MIGRATE_QEMU_FD, + QEMUD_CMD_FLAG_MIGRATE_QEMU_FD | + QEMUD_CMD_FLAG_DRIVE_AIO, 13000, 1, 0); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; -- 1.7.3.4

On Fri, Jan 14, 2011 at 03:58:09PM -0700, Eric Blake wrote:
From: Matthias Dahl <mdvirt@designassembly.de>
Signed-off-by: Eric Blake <eblake@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 3 ++- tests/qemuhelptest.c | 12 ++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-)
ACK Daniel

qemu allows the user to choose what io storage api should be used, either the default (threads) or native (linux aio) which in the latter case can result in better performance. Based on a patch originally by Matthias Dahl. Red Hat Bugzilla #591703 Signed-off-by: Eric Blake <eblake@redhat.com> --- src/qemu/qemu_command.c | 17 +++++++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 33 +++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/qemuxml2xmltest.c | 1 + 5 files changed, 54 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fff1f74..c93de0b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1328,6 +1328,18 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, } } + if (disk->iomode) { + if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_AIO) { + virBufferVSprintf(&opt, ",aio=%s", + virDomainDiskIoTypeToString(disk->iomode)); + } else { + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disk aio mode not supported with this " + "QEMU binary")); + goto error; + } + } + if (virBufferError(&opt)) { virReportOOMError(); goto error; @@ -4426,6 +4438,11 @@ qemuParseCommandLineDisk(virCapsPtr caps, } else if (STREQ(keywords[i], "readonly")) { if ((values[i] == NULL) || STREQ(values[i], "on")) def->readonly = 1; + } else if (STREQ(keywords[i], "aio")) { + if ((def->iomode = virDomainDiskIoTypeFromString(values[i])) < 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot parse io mode '%s'"), values[i]); + } } } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args new file mode 100644 index 0000000..15d2a1b --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -drive file=/dev/HostVG/QEMUGuest1,if=ide,bus=0,unit=0,format=qcow2,cache=none,aio=native -drive file=/dev/HostVG/QEMUGuest2,if=ide,media=cdrom,bus=1,unit=0,format=raw,aio=threads -net none -serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml new file mode 100644 index 0000000..d893736 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -0,0 +1,33 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219200</memory> + <currentMemory>219200</currentMemory> + <vcpu>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='block' device='disk'> + <driver name='qemu' type='qcow2' cache='none' io='native'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <disk type='block' device='cdrom'> + <driver name='qemu' type='raw' io='threads'/> + <source dev='/dev/HostVG/QEMUGuest2'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index d7951df..07f8b60 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -314,6 +314,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_DEVICE | QEMUD_CMD_FLAG_NODEFCONFIG, false); DO_TEST("disk-scsi-device-auto", QEMUD_CMD_FLAG_DRIVE | QEMUD_CMD_FLAG_DEVICE | QEMUD_CMD_FLAG_NODEFCONFIG, false); + DO_TEST("disk-aio", QEMUD_CMD_FLAG_DRIVE | QEMUD_CMD_FLAG_DRIVE_AIO | + QEMUD_CMD_FLAG_DRIVE_CACHE_V2 | QEMUD_CMD_FLAG_DRIVE_FORMAT, false); DO_TEST("graphics-vnc", 0, false); driver.vncSASL = 1; diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 326a1f1..fd981e8 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -131,6 +131,7 @@ mymain(int argc, char **argv) DO_TEST("clock-utc"); DO_TEST("clock-localtime"); DO_TEST("hugepages"); + DO_TEST("disk-aio"); DO_TEST("disk-cdrom"); DO_TEST("disk-floppy"); DO_TEST("disk-many"); -- 1.7.3.4

On Fri, Jan 14, 2011 at 03:58:10PM -0700, Eric Blake wrote:
qemu allows the user to choose what io storage api should be used, either the default (threads) or native (linux aio) which in the latter case can result in better performance.
Based on a patch originally by Matthias Dahl.
Red Hat Bugzilla #591703 Signed-off-by: Eric Blake <eblake@redhat.com> --- src/qemu/qemu_command.c | 17 +++++++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 33 +++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/qemuxml2xmltest.c | 1 + 5 files changed, 54 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml
ACK Daniel

On 01/28/2011 08:19 AM, Daniel P. Berrange wrote:
On Fri, Jan 14, 2011 at 03:58:10PM -0700, Eric Blake wrote:
qemu allows the user to choose what io storage api should be used, either the default (threads) or native (linux aio) which in the latter case can result in better performance.
Based on a patch originally by Matthias Dahl.
Red Hat Bugzilla #591703 Signed-off-by: Eric Blake <eblake@redhat.com> --- src/qemu/qemu_command.c | 17 +++++++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 33 +++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/qemuxml2xmltest.c | 1 + 5 files changed, 54 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml
ACK
Thanks; I've pushed the series now. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On 01/14/2011 03:58 PM, Eric Blake wrote:
I've taken the patch that Matthias Dahl originally posted _months_ ago: https://www.redhat.com/archives/libvir-list/2010-April/msg00888.html
and updated it by splitting into three patches, adding more testsuite coverage, improving documentation, and altering the names slightly.
Ping. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (2)
-
Daniel P. Berrange
-
Eric Blake