From 819269c4f0aa8a3117d30cd12d01eb401bdf585a Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Wed, 21 Apr 2010 16:28:21 +0200 Subject: [PATCH] qemu aio: enable support 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 --- src/qemu/qemu_command.c | 17 ++++++++++ .../qemuxml2argv-disk-aio.args | 1 + .../qemuxml2argv-disk-aio.xml | 33 +++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 54 insertions(+) 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 1ce894107f..c0ec00b782 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; @@ -4545,6 +4557,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 0000000000..15d2a1b76d --- /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 0000000000..d8937360ca --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -0,0 +1,33 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219200 + 219200 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + +
+ + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 0c0693b7be..0a39791d54 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -320,6 +320,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); DO_TEST("graphics-vnc-socket", 0, false); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index ab82d36520..dad91d4e77 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -132,6 +132,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");