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>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2] disable sigcld handling before calling pclose()
Date: Thu, 03 Mar 2011 11:10:00 +0800 [thread overview]
Message-ID: <4D6F0688.10402@cn.fujitsu.com> (raw)
In-Reply-To: <4D102795.9040107@cn.fujitsu.com>
At 12/21/2010 12:05 PM, Wen Congyang Write:
> 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;
> }
Ping Again... :)
This is a bug fix.
2 months has gone, but I do not receive any comment.
Should we remove SIGCHLD handling as Paolo said?
prev parent reply other threads:[~2011-03-03 3:11 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 ` [Qemu-devel] [PATCH v2] " Wen Congyang
2011-01-05 2:15 ` Wen Congyang
2011-01-05 9:21 ` [Qemu-devel] " Paolo Bonzini
2011-03-03 3:10 ` Wen Congyang [this message]
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=4D6F0688.10402@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=andreas.faerber@web.de \
--cc=anthony@codemonkey.ws \
--cc=lcapitulino@redhat.com \
--cc=pbonzini@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 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.