From: Wen Congyang <wency@cn.fujitsu.com>
To: "Andreas Färber" <andreas.faerber@web.de>,
qemu-devel <qemu-devel@nongnu.org>,
"Luiz Capitulino" <lcapitulino@redhat.com>,
"Anthony Liguori" <anthony@codemonkey.ws>
Subject: [Qemu-devel] [PATCH v2] disable sigcld handling before calling pclose()
Date: Tue, 21 Dec 2010 12:05:41 +0800 [thread overview]
Message-ID: <4D102795.9040107@cn.fujitsu.com> (raw)
In-Reply-To: <29897010-A575-4C94-8016-C0FC03652B64@web.de>
When I use the command 'virsh save' to save the domain state,
I receive the following error message:
operation failed: Migration unexpectedly failed.
I debug the qemu by adding some printf(), and find the function
pclose() returns -1.
I use strace to trace qemu, the log is as the following:
======
close(17) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, NULL, WNOHANG, NULL) = 22016
rt_sigreturn(0) = 0
wait4(22016, 0x7fff7f1034fc, 0, NULL) = -1 ECHILD (No child processes)
======
We wait the child twice: one is in signal SIGCHLD handling and the other
one is in pclose().
We should disable sigcld handling before calling pclose().
v2:
- Add stub functions for Win32
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
os-posix.c | 19 +++++++++++++++++++
qemu-os-posix.h | 2 ++
qemu-os-win32.h | 2 ++
savevm.c | 2 ++
4 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/os-posix.c b/os-posix.c
index 38c29d1..b163995 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -86,6 +86,25 @@ void os_setup_signal_handling(void)
sigaction(SIGCHLD, &act, NULL);
}
+void os_stop_sigchld_handling(void)
+{
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = SIG_DFL;
+ sigaction(SIGCHLD, &act, NULL);
+}
+
+void os_resume_sigchld_handling(void)
+{
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sigchld_handler;
+ act.sa_flags = SA_NOCLDSTOP;
+ sigaction(SIGCHLD, &act, NULL);
+}
+
/* Find a likely location for support files using the location of the binary.
For installed binaries this will be "$bindir/../share/qemu". When
running from the build tree this will be "$bindir/../pc-bios". */
diff --git a/qemu-os-posix.h b/qemu-os-posix.h
index 81fd9ab..1c317f1 100644
--- a/qemu-os-posix.h
+++ b/qemu-os-posix.h
@@ -33,6 +33,8 @@ static inline void os_host_main_loop_wait(int *timeout)
void os_set_line_buffering(void);
void os_set_proc_name(const char *s);
void os_setup_signal_handling(void);
+void os_stop_sigchld_handling(void);
+void os_resume_sigchld_handling(void);
void os_daemonize(void);
void os_setup_post(void);
diff --git a/qemu-os-win32.h b/qemu-os-win32.h
index 1a07e5e..f31c5ef 100644
--- a/qemu-os-win32.h
+++ b/qemu-os-win32.h
@@ -43,6 +43,8 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque);
void os_host_main_loop_wait(int *timeout);
static inline void os_setup_signal_handling(void) {}
+static inline void os_stop_sigchld_handling(void) {}
+static inline void os_resume_sigchld_handling(void) {}
static inline void os_daemonize(void) {}
static inline void os_setup_post(void) {}
void os_set_line_buffering(void);
diff --git a/savevm.c b/savevm.c
index 90aa237..387b70b 100644
--- a/savevm.c
+++ b/savevm.c
@@ -234,7 +234,9 @@ static int stdio_pclose(void *opaque)
{
QEMUFileStdio *s = opaque;
int ret;
+ os_stop_sigchld_handling();
ret = pclose(s->stdio_file);
+ os_resume_sigchld_handling();
qemu_free(s);
return ret;
}
--
1.7.1
next prev parent reply other threads:[~2010-12-21 4:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-09 3:41 [Qemu-devel] [PATCH] disable sigcld handling before calling pclose() Wen Congyang
2010-12-14 9:23 ` Wen Congyang
2010-12-20 1:25 ` Wen Congyang
2010-12-20 6:33 ` Andreas Färber
2010-12-21 2:44 ` Wen Congyang
2010-12-21 4:05 ` Wen Congyang [this message]
2011-01-05 2:15 ` [Qemu-devel] [PATCH v2] " Wen Congyang
2011-01-05 9:21 ` [Qemu-devel] " Paolo Bonzini
2011-03-03 3:10 ` [Qemu-devel] " Wen Congyang
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=4D102795.9040107@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=andreas.faerber@web.de \
--cc=anthony@codemonkey.ws \
--cc=lcapitulino@redhat.com \
--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 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).