From: Luiz Capitulino <lcapitulino@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 5/9] Monitor: Return before exiting with 'quit'
Date: Mon, 26 Apr 2010 15:53:03 -0300 [thread overview]
Message-ID: <20100426155303.2c381ff7@redhat.com> (raw)
In-Reply-To: <4BD5DAA2.4050206@codemonkey.ws>
On Mon, 26 Apr 2010 13:25:38 -0500
Anthony Liguori <anthony@codemonkey.ws> wrote:
> On 04/26/2010 01:22 PM, Luiz Capitulino wrote:
> > On Mon, 26 Apr 2010 12:49:40 -0500
> > Anthony Liguori<anthony@codemonkey.ws> wrote:
> >
> >
> >> On 04/26/2010 10:47 AM, Luiz Capitulino wrote:
> >>
> >>> The 'quit' Monitor command (implemented by do_quit()) calls
> >>> exit() directly, this is problematic under QMP because QEMU
> >>> exits before having a chance to send the ok response.
> >>>
> >>> Clients don't know if QEMU exited because of a problem or
> >>> because the 'quit' command has been executed.
> >>>
> >>> This commit fixes that by moving the exit() call to the main
> >>> loop, so that do_quit() requests the system to quit, instead
> >>> of calling exit() directly.
> >>>
> >>>
> >> Does this also have the effect of printing out a (qemu) prompt after
> >> quit before an EOF appears on that socket?
> >>
> > Ah, right..
> >
>
> It's not necessarily a bad thing if it does. I just wanted to raise
> that because it's possible that someone depends on the behavior.
Yes, and it's also a bit ugly if you do '-monitor stdio':
~/stuff/virt/ ./qemu-qmp -monitor stdio
QEMU 0.12.50 monitor - type 'help' for more information
(qemu) quit
(qemu) ~/stuff/virt/
So, I'd like to fix it.
> I'm not sure it matters to me if we change this behavior though.
It's very easy to fix, the following patch does it.
I have (tested and) rebased the for-anthony branch with it.
From 14ecef47d1989f9b646fc0fe7a4bf42c091d1432 Mon Sep 17 00:00:00 2001
From: Luiz Capitulino <lcapitulino@redhat.com>
Date: Tue, 6 Apr 2010 18:55:54 -0300
Subject: [PATCH 5/9] Monitor: Return before exiting with 'quit'
The 'quit' Monitor command (implemented by do_quit()) calls
exit() directly, this is problematic under QMP because QEMU
exits before having a chance to send the ok response.
Clients don't know if QEMU exited because of a problem or
because the 'quit' command has been executed.
This commit fixes that by moving the exit() call to the main
loop, so that do_quit() requests the system to quit, instead
of calling exit() directly.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
monitor.c | 7 ++++++-
sysemu.h | 2 ++
vl.c | 18 ++++++++++++++++++
3 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/monitor.c b/monitor.c
index ef84298..5b0258f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1017,7 +1017,12 @@ static void do_info_cpu_stats(Monitor *mon)
*/
static int do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
{
- exit(0);
+ if (monitor_ctrl_mode(mon)) {
+ qemu_system_exit_request();
+ } else {
+ exit(0);
+ }
+
return 0;
}
diff --git a/sysemu.h b/sysemu.h
index d0effa0..fa921df 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -45,9 +45,11 @@ void cpu_disable_ticks(void);
void qemu_system_reset_request(void);
void qemu_system_shutdown_request(void);
void qemu_system_powerdown_request(void);
+void qemu_system_exit_request(void);
int qemu_shutdown_requested(void);
int qemu_reset_requested(void);
int qemu_powerdown_requested(void);
+int qemu_exit_requested(void);
extern qemu_irq qemu_system_powerdown;
void qemu_system_reset(void);
diff --git a/vl.c b/vl.c
index a5a0f41..9ef6f2c 100644
--- a/vl.c
+++ b/vl.c
@@ -1697,6 +1697,7 @@ static int shutdown_requested;
static int powerdown_requested;
int debug_requested;
int vmstop_requested;
+static int exit_requested;
int qemu_shutdown_requested(void)
{
@@ -1719,6 +1720,12 @@ int qemu_powerdown_requested(void)
return r;
}
+int qemu_exit_requested(void)
+{
+ /* just return it, we'll exit() anyway */
+ return exit_requested;
+}
+
static int qemu_debug_requested(void)
{
int r = debug_requested;
@@ -1789,6 +1796,12 @@ void qemu_system_powerdown_request(void)
qemu_notify_event();
}
+void qemu_system_exit_request(void)
+{
+ exit_requested = 1;
+ qemu_notify_event();
+}
+
#ifdef _WIN32
static void host_main_loop_wait(int *timeout)
{
@@ -1925,6 +1938,8 @@ static int vm_can_run(void)
return 0;
if (debug_requested)
return 0;
+ if (exit_requested)
+ return 0;
return 1;
}
@@ -1977,6 +1992,9 @@ static void main_loop(void)
if ((r = qemu_vmstop_requested())) {
vm_stop(r);
}
+ if (qemu_exit_requested()) {
+ exit(0);
+ }
}
pause_all_vcpus();
}
--
1.7.1.rc1.12.ga6018
next prev parent reply other threads:[~2010-04-26 18:53 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-26 15:47 [Qemu-devel] [PATCH 0/9][PULL]: QMP/Monitor queue Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 1/9] QError: New QERR_QMP_BAD_INPUT_OBJECT_MEMBER Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 2/9] QMP: Use QERR_QMP_BAD_INPUT_OBJECT_MEMBER Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 3/9] QError: Improve QERR_QMP_BAD_INPUT_OBJECT desc Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 4/9] QMP: Check "arguments" member's type Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 5/9] Monitor: Return before exiting with 'quit' Luiz Capitulino
2010-04-26 17:49 ` Anthony Liguori
2010-04-26 18:22 ` Luiz Capitulino
2010-04-26 18:25 ` Anthony Liguori
2010-04-26 18:53 ` Luiz Capitulino [this message]
2010-04-26 19:00 ` Anthony Liguori
2010-04-26 19:10 ` [Qemu-devel] " Jan Kiszka
2010-04-26 19:13 ` Anthony Liguori
2010-04-26 19:44 ` Luiz Capitulino
2010-04-27 11:52 ` Paolo Bonzini
2010-04-27 13:20 ` Luiz Capitulino
2010-04-27 13:52 ` Paolo Bonzini
2010-04-26 15:47 ` [Qemu-devel] [PATCH 6/9] monitor: Cleanup ID assignment for compat switch Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 7/9] monitor: Reorder intialization to drop initial mux focus Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 8/9] chardev: Document mux option Luiz Capitulino
2010-04-26 15:47 ` [Qemu-devel] [PATCH 9/9] stash away SCM_RIGHTS fd until a getfd command arrives Luiz Capitulino
2010-04-26 21:32 ` [Qemu-devel] [PATCH 0/9][PULL]: QMP/Monitor queue Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100426155303.2c381ff7@redhat.com \
--to=lcapitulino@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.