qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/1] vl.c: do not execute trace_init_backends() before dae


From: Stefan Hajnoczi
Subject: Re: [PATCH v2 1/1] vl.c: do not execute trace_init_backends() before daemonizing
Date: Wed, 6 Jan 2021 16:59:14 +0000

On Tue, Jan 05, 2021 at 03:14:37PM -0300, Daniel Henrique Barboza wrote:
> Commit v5.2.0-190-g0546c0609c ("vl: split various early command line
> options to a separate function") moved the trace backend init code to
> the qemu_process_early_options(). Which is now being called before
> os_daemonize() via qemu_maybe_daemonize().
> 
> Turns out that this change of order causes a problem when executing
> QEMU in daemon mode and with CONFIG_TRACE_SIMPLE. The trace thread
> is now being created by the parent, and the parent is left waiting for
> a trace file flush that was registered via st_init(). The result is
> that the parent process never exits.
> 
> To reproduce, fire up a QEMU process with -daemonize and with
> CONFIG_TRACE_SIMPLE enabled. Two QEMU process will be left in the
> host:
> 
> $ sudo ./x86_64-softmmu/qemu-system-x86_64 -S -no-user-config -nodefaults \
>   -nographic -machine none,accel=kvm:tcg -daemonize
> 
> $ ps axf | grep qemu
>  529710 pts/3    S+     0:00  |       \_ grep --color=auto qemu
>  529697 ?        Ssl    0:00  \_ ./x86_64-softmmu/qemu-system-x86_64 -S 
> -no-user-config -nodefaults -nographic -machine none,accel=kvm:tcg -daemonize
>  529699 ?        Sl     0:00      \_ ./x86_64-softmmu/qemu-system-x86_64 -S 
> -no-user-config -nodefaults -nographic -machine none,accel=kvm:tcg -daemonize
> 
> The parent thread is hang in flush_trace_file:
> 
> $ sudo gdb ./x86_64-softmmu/qemu-system-x86_64 529697
> (..)
> (gdb) bt
>  #0  0x00007f9dac6a137d in syscall () at /lib64/libc.so.6
>  #1  0x00007f9dacc3c4f3 in g_cond_wait () at /lib64/libglib-2.0.so.0
>  #2  0x0000555d12f952da in flush_trace_file (wait=true) at 
> ../trace/simple.c:140
>  #3  0x0000555d12f95b4c in st_flush_trace_buffer () at ../trace/simple.c:383
>  #4  0x00007f9dac5e43a7 in __run_exit_handlers () at /lib64/libc.so.6
>  #5  0x00007f9dac5e4550 in on_exit () at /lib64/libc.so.6
>  #6  0x0000555d12d454de in os_daemonize () at ../os-posix.c:255
>  #7  0x0000555d12d0bd5c in qemu_maybe_daemonize (pid_file=0x0) at 
> ../softmmu/vl.c:2408
>  #8  0x0000555d12d0e566 in qemu_init (argc=8, argv=0x7fffc594d9b8, 
> envp=0x7fffc594da00) at ../softmmu/vl.c:3459
>  #9  0x0000555d128edac1 in main (argc=8, argv=0x7fffc594d9b8, 
> envp=0x7fffc594da00) at ../softmmu/main.c:49
> (gdb)
> 
> Aside from the 'zombie' process in the host, this is directly impacting
> Libvirt. Libvirt waits for the parent process to exit to be sure that the
> QMP monitor is available in the daemonized process to fetch QEMU
> capabilities, and as is now Libvirt hangs at daemon start waiting
> for the parent thread to exit.
> 
> The fix is simple: just move the trace backend related code back to
> be executed after daemonizing.
> 
> Fixes: 0546c0609cb5a8d90c1cbac8e0d64b5a048bbb19
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> ---
>  softmmu/vl.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)

Acked-by: Stefan Hajnoczi <stefanha@redhat.com>

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]