[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>
signature.asc
Description: PGP signature