On Mon, Aug 25, 2014 at 08:38:07PM -0400, John Ferlan wrote:
Add a new capability to ensure the iothreads feature exists for the
qemu
emulator being run - requires the "query-iothreads" QMP command. Using the
domain XML add correspoding command argument in order to generate the
threads. The iothreads will use a name space "libvirtIothread#" where, the
future patch to add support for using an iothread to a disk definition to
merely define which of the available threads to use.
Add tests to ensure the xml/argv processing is correct. Note that no
change was made to qemuargv2xmltest.c as processing the -object element
would require knowing more than just iothreads.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 13 ++++++++++
tests/qemuxml2argvdata/qemuxml2argv-iothreads.args | 8 ++++++
tests/qemuxml2argvdata/qemuxml2argv-iothreads.xml | 29 ++++++++++++++++++++++
tests/qemuxml2argvtest.c | 2 ++
tests/qemuxml2xmltest.c | 1 +
7 files changed, 56 insertions(+)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads.xml
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 410086b..b331be7 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -268,6 +268,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
"rtc-reset-reinjection",
"splash-timeout", /* 175 */
+ "query-iothreads",
Why "query-" when the capability is _OBJECT_? Or is this just a typo?
</bikeshed>
);
@@ -1430,6 +1431,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
{ "nbd-server-start", QEMU_CAPS_NBD_SERVER },
{ "change-backing-file", QEMU_CAPS_CHANGE_BACKING_FILE },
{ "rtc-reset-reinjection", QEMU_CAPS_RTC_RESET_REINJECTION },
+ { "query-iothreads", QEMU_CAPS_OBJECT_IOTHREAD},
We have virQEMUCapsObjectTypes[] where you can just stick the name of
the object you want to test, and not rely on a related command to
probe for it.
};
struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 48a4eaa..0980c00 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -215,6 +215,7 @@ typedef enum {
QEMU_CAPS_OBJECT_USB_AUDIO = 173, /* usb-audio device support */
QEMU_CAPS_RTC_RESET_REINJECTION = 174, /* rtc-reset-reinjection monitor command */
QEMU_CAPS_SPLASH_TIMEOUT = 175, /* -boot splash-time */
+ QEMU_CAPS_OBJECT_IOTHREAD = 176, /* -object iothread */
QEMU_CAPS_LAST, /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 6dac9d3..287a3f3 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7510,6 +7510,19 @@ qemuBuildCommandLine(virConnectPtr conn,
virCommandAddArg(cmd, smp);
VIR_FREE(smp);
+ if (def->iothreads > 0 &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) {
+ /* Create named iothread objects starting with 1. These may be used
+ * by a disk definition which will associate to an iothread by
+ * supplying a value of 1 up to the number of iothreads available
+ * (since 0 would indicate to not use the feature).
+ */
+ for (i = 1; i <= def->iothreads; i++) {
+ virCommandAddArg(cmd, "-object");
+ virCommandAddArgFormat(cmd, "iothread,id=libvirtIothread%zu", i);
I don't see we would use 'libvirt*' naming for any other IDs,
'iothread%zu' would be enough, I guess (and the command-line wouldn't
be so long as well).
Martin