* [Qemu-devel] [PATCH 0/2] qemu_agent: Switch to event driven impl @ 2012-06-15 16:10 Michal Privoznik 2012-06-15 16:10 ` [Qemu-devel] [PATCH 1/2] qemu_agent: Add some more debug prints Michal Privoznik 2012-06-15 16:10 ` [Qemu-devel] [PATCH 2/2] qemu_agent: Wait for events instead of agent response Michal Privoznik 0 siblings, 2 replies; 6+ messages in thread From: Michal Privoznik @ 2012-06-15 16:10 UTC (permalink / raw) To: libvir-list; +Cc: mdroth, qemu-devel, lcapitulino Qemu fixed some qemu-ga commands reporting bogus success: http://www.mail-archive.com/qemu-devel@nongnu.org/msg110261.html Therefore we need an implementation which won't wait for qemu-ga to reply and hence block indefinitely. Fortunately, we can take events on qemu monitor as indication of success. Michal Privoznik (2): qemu_agent: Add some more debug prints qemu_agent: Wait for events instead of agent response src/qemu/qemu_agent.c | 52 +++++++++++++++++++++++++++++++++++++++++----- src/qemu/qemu_agent.h | 9 ++++++++ src/qemu/qemu_process.c | 9 ++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) -- 1.7.8.5 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/2] qemu_agent: Add some more debug prints 2012-06-15 16:10 [Qemu-devel] [PATCH 0/2] qemu_agent: Switch to event driven impl Michal Privoznik @ 2012-06-15 16:10 ` Michal Privoznik 2012-06-15 17:09 ` [Qemu-devel] [libvirt] " Eric Blake 2012-06-15 16:10 ` [Qemu-devel] [PATCH 2/2] qemu_agent: Wait for events instead of agent response Michal Privoznik 1 sibling, 1 reply; 6+ messages in thread From: Michal Privoznik @ 2012-06-15 16:10 UTC (permalink / raw) To: libvir-list; +Cc: mdroth, qemu-devel, lcapitulino for agent ref count and qemuProcessHandleAgentDestroy --- src/qemu/qemu_agent.c | 3 ++- src/qemu/qemu_process.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index bc4ceff..36610c2 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -155,13 +155,14 @@ static void qemuAgentFree(qemuAgentPtr mon) int qemuAgentRef(qemuAgentPtr mon) { mon->refs++; + VIR_DEBUG("%d", mon->refs); return mon->refs; } int qemuAgentUnref(qemuAgentPtr mon) { mon->refs--; - + VIR_DEBUG("%d", mon->refs); if (mon->refs == 0) { qemuAgentUnlock(mon); qemuAgentFree(mon); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 544eed5..2b47bf6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -167,6 +167,8 @@ static void qemuProcessHandleAgentDestroy(qemuAgentPtr agent, { qemuDomainObjPrivatePtr priv; + VIR_DEBUG("Received destroy agent=%p vm=%p", agent, vm); + virDomainObjLock(vm); priv = vm->privateData; if (priv->agent == agent) -- 1.7.8.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [libvirt] [PATCH 1/2] qemu_agent: Add some more debug prints 2012-06-15 16:10 ` [Qemu-devel] [PATCH 1/2] qemu_agent: Add some more debug prints Michal Privoznik @ 2012-06-15 17:09 ` Eric Blake 0 siblings, 0 replies; 6+ messages in thread From: Eric Blake @ 2012-06-15 17:09 UTC (permalink / raw) To: Michal Privoznik; +Cc: libvir-list, qemu-devel [-- Attachment #1: Type: text/plain, Size: 362 bytes --] On 06/15/2012 10:10 AM, Michal Privoznik wrote: > for agent ref count and qemuProcessHandleAgentDestroy > --- > src/qemu/qemu_agent.c | 3 ++- > src/qemu/qemu_process.c | 2 ++ > 2 files changed, 4 insertions(+), 1 deletions(-) ACK. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 620 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/2] qemu_agent: Wait for events instead of agent response 2012-06-15 16:10 [Qemu-devel] [PATCH 0/2] qemu_agent: Switch to event driven impl Michal Privoznik 2012-06-15 16:10 ` [Qemu-devel] [PATCH 1/2] qemu_agent: Add some more debug prints Michal Privoznik @ 2012-06-15 16:10 ` Michal Privoznik 2012-06-15 17:16 ` [Qemu-devel] [libvirt] " Eric Blake 1 sibling, 1 reply; 6+ messages in thread From: Michal Privoznik @ 2012-06-15 16:10 UTC (permalink / raw) To: libvir-list; +Cc: mdroth, qemu-devel, lcapitulino With latest changes to qemu-ga success on some commands is not reported anymore, e.g. guest-shutdown or guest-suspend-*. However, errors are still being reported. Therefore, we need to find different source of indication if operation was successful. Events. --- src/qemu/qemu_agent.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- src/qemu/qemu_agent.h | 9 ++++++++ src/qemu/qemu_process.c | 7 ++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 36610c2..95aec67 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -107,6 +107,11 @@ struct _qemuAgent { /* If anything went wrong, this will be fed back * the next monitor msg */ virError lastError; + + /* Some guest agent commands don't return anything + * but fire up an event on qemu monitor instead. + * Take that as indication of successful completion */ + qemuAgentEvent await_event; }; #if DEBUG_RAW_IO @@ -826,6 +831,13 @@ void qemuAgentClose(qemuAgentPtr mon) VIR_FORCE_CLOSE(mon->fd); } + /* If there is somebody waiting for a message + * wake him up. No message will arrive anyway. */ + if (mon->msg && !mon->msg->finished) { + mon->msg->finished = 1; + virCondSignal(&mon->notify); + } + if (qemuAgentUnref(mon) > 0) qemuAgentUnlock(mon); } @@ -982,6 +994,7 @@ qemuAgentCommand(qemuAgentPtr mon, int ret = -1; qemuAgentMessage msg; char *cmdstr = NULL; + int await_event = mon->await_event; *reply = NULL; @@ -1010,10 +1023,16 @@ qemuAgentCommand(qemuAgentPtr mon, ret, msg.rxObject); if (ret == 0) { + /* If we haven't obtained any reply but we wait for an + * event, then don't report this as error */ if (!msg.rxObject) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Missing monitor reply object")); - ret = -1; + if (await_event) { + VIR_DEBUG("Woken up by event %d", await_event); + } else { + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing monitor reply object")); + ret = -1; + } } else { *reply = msg.rxObject; } @@ -1238,6 +1257,24 @@ error: return NULL; } +void qemuAgentNotifyEvent(qemuAgentPtr mon, + qemuAgentEvent event) +{ + VIR_DEBUG("mon=%p event=%d", mon, event); + if (mon->await_event == event) { + VIR_DEBUG("Wakening up a tragedian"); + mon->await_event = QEMU_AGENT_EVENT_NONE; + /* somebody waiting for this event, wake him up. */ + if (mon->msg && !mon->msg->finished) { + mon->msg->finished = 1; + virCondSignal(&mon->notify); + } + } else { + /* shouldn't happen but one never knows */ + VIR_WARN("Received unexpected event %d", event); + } +} + VIR_ENUM_DECL(qemuAgentShutdownMode); VIR_ENUM_IMPL(qemuAgentShutdownMode, @@ -1257,9 +1294,10 @@ int qemuAgentShutdown(qemuAgentPtr mon, if (!cmd) return -1; + mon->await_event = QEMU_AGENT_EVENT_SHUTDOWN; ret = qemuAgentCommand(mon, cmd, &reply); - if (ret == 0) + if (reply && ret == 0) ret = qemuAgentCheckError(cmd, reply); virJSONValueFree(cmd); @@ -1362,9 +1400,10 @@ qemuAgentSuspend(qemuAgentPtr mon, if (!cmd) return -1; + mon->await_event = QEMU_AGENT_EVENT_SUSPEND; ret = qemuAgentCommand(mon, cmd, &reply); - if (ret == 0) + if (reply && ret == 0) ret = qemuAgentCheckError(cmd, reply); virJSONValueFree(cmd); diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index 98c23b0..0816d90 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -56,6 +56,15 @@ int qemuAgentUnref(qemuAgentPtr mon) ATTRIBUTE_RETURN_CHECK; void qemuAgentClose(qemuAgentPtr mon); typedef enum { + QEMU_AGENT_EVENT_NONE = 0, + QEMU_AGENT_EVENT_SHUTDOWN, + QEMU_AGENT_EVENT_SUSPEND +} qemuAgentEvent; + +void qemuAgentNotifyEvent(qemuAgentPtr mon, + qemuAgentEvent event); + +typedef enum { QEMU_AGENT_SHUTDOWN_POWERDOWN, QEMU_AGENT_SHUTDOWN_REBOOT, QEMU_AGENT_SHUTDOWN_HALT, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2b47bf6..1df3637 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -665,6 +665,9 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, vm->def->name); } + if (priv->agent) + qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_SHUTDOWN); + qemuProcessShutdownOrReboot(driver, vm); unlock: @@ -1118,6 +1121,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, event = virDomainEventPMSuspendNewFromObj(vm); if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { + qemuDomainObjPrivatePtr priv = vm->privateData; VIR_DEBUG("Transitioned guest %s to pmsuspended state due to " "QMP suspend event", vm->def->name); @@ -1128,6 +1132,9 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_WARN("Unable to save status on vm %s after suspend event", vm->def->name); } + + if (priv->agent) + qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_SUSPEND); } virDomainObjUnlock(vm); -- 1.7.8.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [libvirt] [PATCH 2/2] qemu_agent: Wait for events instead of agent response 2012-06-15 16:10 ` [Qemu-devel] [PATCH 2/2] qemu_agent: Wait for events instead of agent response Michal Privoznik @ 2012-06-15 17:16 ` Eric Blake 2012-06-16 7:51 ` Michal Privoznik 0 siblings, 1 reply; 6+ messages in thread From: Eric Blake @ 2012-06-15 17:16 UTC (permalink / raw) To: Michal Privoznik; +Cc: libvir-list, qemu-devel [-- Attachment #1: Type: text/plain, Size: 1007 bytes --] On 06/15/2012 10:10 AM, Michal Privoznik wrote: > With latest changes to qemu-ga success on some commands is not reported > anymore, e.g. guest-shutdown or guest-suspend-*. However, errors are > still being reported. Therefore, we need to find different source of > indication if operation was successful. Events. > --- > src/qemu/qemu_agent.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- > src/qemu/qemu_agent.h | 9 ++++++++ > src/qemu/qemu_process.c | 7 ++++++ > 3 files changed, 60 insertions(+), 5 deletions(-) > > @@ -1238,6 +1257,24 @@ error: > return NULL; > } > > +void qemuAgentNotifyEvent(qemuAgentPtr mon, > + qemuAgentEvent event) > +{ > + VIR_DEBUG("mon=%p event=%d", mon, event); > + if (mon->await_event == event) { > + VIR_DEBUG("Wakening up a tragedian"); s/Wakening/Waking/ ACK. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 620 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [libvirt] [PATCH 2/2] qemu_agent: Wait for events instead of agent response 2012-06-15 17:16 ` [Qemu-devel] [libvirt] " Eric Blake @ 2012-06-16 7:51 ` Michal Privoznik 0 siblings, 0 replies; 6+ messages in thread From: Michal Privoznik @ 2012-06-16 7:51 UTC (permalink / raw) To: Eric Blake; +Cc: libvir-list, qemu-devel On 15.06.2012 19:16, Eric Blake wrote: > On 06/15/2012 10:10 AM, Michal Privoznik wrote: >> With latest changes to qemu-ga success on some commands is not reported >> anymore, e.g. guest-shutdown or guest-suspend-*. However, errors are >> still being reported. Therefore, we need to find different source of >> indication if operation was successful. Events. >> --- >> src/qemu/qemu_agent.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- >> src/qemu/qemu_agent.h | 9 ++++++++ >> src/qemu/qemu_process.c | 7 ++++++ >> 3 files changed, 60 insertions(+), 5 deletions(-) >> > >> @@ -1238,6 +1257,24 @@ error: >> return NULL; >> } >> >> +void qemuAgentNotifyEvent(qemuAgentPtr mon, >> + qemuAgentEvent event) >> +{ >> + VIR_DEBUG("mon=%p event=%d", mon, event); >> + if (mon->await_event == event) { >> + VIR_DEBUG("Wakening up a tragedian"); > > s/Wakening/Waking/ > > ACK. > > Fixed and pushed. Thanks. Michal ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-06-16 7:51 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-06-15 16:10 [Qemu-devel] [PATCH 0/2] qemu_agent: Switch to event driven impl Michal Privoznik 2012-06-15 16:10 ` [Qemu-devel] [PATCH 1/2] qemu_agent: Add some more debug prints Michal Privoznik 2012-06-15 17:09 ` [Qemu-devel] [libvirt] " Eric Blake 2012-06-15 16:10 ` [Qemu-devel] [PATCH 2/2] qemu_agent: Wait for events instead of agent response Michal Privoznik 2012-06-15 17:16 ` [Qemu-devel] [libvirt] " Eric Blake 2012-06-16 7:51 ` Michal Privoznik
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).