From 1b21351b93248c80bd545d8e268849c8bf76df95 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 13 Sep 2012 15:54:02 +0100 Subject: [PATCH] Move command/event capabilities detection out of QEMU monitor code The qemuMonitorSetCapabilities() API is used to initialize the QMP protocol capabilities. It has since been abused to initialize some libvirt internal capabilities based on command/event existance too. Move the latter code out into qemuCapsProbeQMP() in the QEMU capabilities source file instead Signed-off-by: Daniel P. Berrange --- src/qemu/qemu_capabilities.c | 70 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 4 +++ src/qemu/qemu_monitor.c | 11 +----- src/qemu/qemu_monitor.h | 4 +-- src/qemu/qemu_monitor_json.c | 59 ------------------------------ src/qemu/qemu_monitor_json.h | 5 --- src/qemu/qemu_process.c | 5 ++- 7 files changed, 80 insertions(+), 78 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 54458db93b..c21949ba73 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1688,6 +1688,76 @@ const char *qemuCapsGetCanonicalMachine(qemuCapsPtr caps, } +static int +qemuCapsProbeQMPCommands(qemuCapsPtr caps, + qemuMonitorPtr mon) +{ + char **commands = NULL; + int ncommands; + size_t i; + + if ((ncommands = qemuMonitorGetCommands(mon, &commands)) < 0) + return -1; + + for (i = 0 ; i < ncommands ; i++) { + char *name = commands[i]; + if (STREQ(name, "system_wakeup")) + qemuCapsSet(caps, QEMU_CAPS_WAKEUP); + else if (STREQ(name, "transaction")) + qemuCapsSet(caps, QEMU_CAPS_TRANSACTION); + else if (STREQ(name, "block_job_cancel")) + qemuCapsSet(caps, QEMU_CAPS_BLOCKJOB_SYNC); + else if (STREQ(name, "block-job-cancel")) + qemuCapsSet(caps, QEMU_CAPS_BLOCKJOB_ASYNC); + else if (STREQ(name, "dump-guest-memory")) + qemuCapsSet(caps, QEMU_CAPS_DUMP_GUEST_MEMORY); + VIR_FREE(name); + } + VIR_FREE(commands); + + return 0; +} + + +static int +qemuCapsProbeQMPEvents(qemuCapsPtr caps, + qemuMonitorPtr mon) +{ + char **events = NULL; + int nevents; + size_t i; + + if ((nevents = qemuMonitorGetEvents(mon, &events)) < 0) + return -1; + + for (i = 0 ; i < nevents ; i++) { + char *name = events[i]; + + if (STREQ(name, "BALLOON_CHANGE")) + qemuCapsSet(caps, QEMU_CAPS_BALLOON_EVENT); + VIR_FREE(name); + } + VIR_FREE(events); + + return 0; +} + + +int qemuCapsProbeQMP(qemuCapsPtr caps, + qemuMonitorPtr mon) +{ + VIR_DEBUG("caps=%p mon=%p", caps, mon); + + if (qemuCapsProbeQMPCommands(caps, mon) < 0) + return -1; + + if (qemuCapsProbeQMPEvents(caps, mon) < 0) + return -1; + + return 0; +} + + #define QEMU_SYSTEM_PREFIX "qemu-system-" qemuCapsPtr qemuCapsNewForBinary(const char *binary) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5e8650fdab..109aaf3097 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -28,6 +28,7 @@ # include "capabilities.h" # include "command.h" # include "virobject.h" +# include "qemu_monitor.h" /* Internal flags to keep track of qemu command line capabilities */ enum qemuCapsFlags { @@ -163,6 +164,9 @@ qemuCapsPtr qemuCapsNew(void); qemuCapsPtr qemuCapsNewCopy(qemuCapsPtr caps); qemuCapsPtr qemuCapsNewForBinary(const char *binary); +int qemuCapsProbeQMP(qemuCapsPtr caps, + qemuMonitorPtr mon); + void qemuCapsSet(qemuCapsPtr caps, enum qemuCapsFlags flag) ATTRIBUTE_NONNULL(1); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 152fad8c22..cd41dd7b12 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1126,8 +1126,7 @@ int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon, } -int qemuMonitorSetCapabilities(qemuMonitorPtr mon, - qemuCapsPtr caps) +int qemuMonitorSetCapabilities(qemuMonitorPtr mon) { int ret; VIR_DEBUG("mon=%p", mon); @@ -1142,14 +1141,6 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon, ret = qemuMonitorJSONSetCapabilities(mon); if (ret < 0) goto cleanup; - - ret = qemuMonitorJSONCheckCommands(mon, caps); - if (ret < 0) - goto cleanup; - - ret = qemuMonitorJSONCheckEvents(mon, caps); - if (ret < 0) - goto cleanup; } else { ret = 0; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 3df0840576..54b3a997b8 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -27,7 +27,6 @@ # include "internal.h" -# include "qemu_capabilities.h" # include "domain_conf.h" # include "bitmap.h" # include "virhash.h" @@ -155,8 +154,7 @@ qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm, void qemuMonitorClose(qemuMonitorPtr mon); -int qemuMonitorSetCapabilities(qemuMonitorPtr mon, - qemuCapsPtr caps); +int qemuMonitorSetCapabilities(qemuMonitorPtr mon); void qemuMonitorLock(qemuMonitorPtr mon); void qemuMonitorUnlock(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 43b003dc13..2eb1800f6a 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -968,65 +968,6 @@ qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon) } -/* - * Returns: 0 if human-monitor-command is not supported, +1 if - * human-monitor-command worked or -1 on failure - */ -int -qemuMonitorJSONCheckCommands(qemuMonitorPtr mon, - qemuCapsPtr caps) -{ - char **commands = NULL; - int ncommands; - size_t i; - - if ((ncommands = qemuMonitorJSONGetCommands(mon, &commands)) < 0) - return -1; - - for (i = 0 ; i < ncommands ; i++) { - char *name = commands[i]; - if (STREQ(name, "system_wakeup")) - qemuCapsSet(caps, QEMU_CAPS_WAKEUP); - else if (STREQ(name, "transaction")) - qemuCapsSet(caps, QEMU_CAPS_TRANSACTION); - else if (STREQ(name, "block_job_cancel")) - qemuCapsSet(caps, QEMU_CAPS_BLOCKJOB_SYNC); - else if (STREQ(name, "block-job-cancel")) - qemuCapsSet(caps, QEMU_CAPS_BLOCKJOB_ASYNC); - else if (STREQ(name, "dump-guest-memory")) - qemuCapsSet(caps, QEMU_CAPS_DUMP_GUEST_MEMORY); - VIR_FREE(name); - } - VIR_FREE(commands); - - return 0; -} - - -int -qemuMonitorJSONCheckEvents(qemuMonitorPtr mon, - qemuCapsPtr caps) -{ - char **events = NULL; - int nevents; - size_t i; - - if ((nevents = qemuMonitorJSONGetEvents(mon, &events)) < 0) - return -1; - - for (i = 0 ; i < nevents ; i++) { - char *name = events[i]; - - if (STREQ(name, "BALLOON_CHANGE")) - qemuCapsSet(caps, QEMU_CAPS_BALLOON_EVENT); - VIR_FREE(name); - } - VIR_FREE(events); - - return 0; -} - - int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, virConnectPtr conn ATTRIBUTE_UNUSED) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 546b6afefd..63b84c66f9 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -42,11 +42,6 @@ int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon); -int qemuMonitorJSONCheckCommands(qemuMonitorPtr mon, - qemuCapsPtr caps); -int qemuMonitorJSONCheckEvents(qemuMonitorPtr mon, - qemuCapsPtr caps); - int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, virConnectPtr conn); int qemuMonitorJSONStopCPUs(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 8937c42ef9..31909b7a1a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1250,7 +1250,10 @@ qemuConnectMonitor(struct qemud_driver *driver, virDomainObjPtr vm) qemuDomainObjEnterMonitorWithDriver(driver, vm); - ret = qemuMonitorSetCapabilities(priv->mon, priv->caps); + ret = qemuMonitorSetCapabilities(priv->mon); + if (ret == 0 && + qemuCapsGet(priv->caps, QEMU_CAPS_MONITOR_JSON)) + ret = qemuCapsProbeQMP(priv->caps, priv->mon); qemuDomainObjExitMonitorWithDriver(driver, vm); error: -- GitLab