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 <pbonz...@redhat.com> > Signed-off-by: Daniel Henrique Barboza <danielhb...@gmail.com> > --- > softmmu/vl.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-)
Acked-by: Stefan Hajnoczi <stefa...@redhat.com>
signature.asc
Description: PGP signature