qemu-e2k/include
Stefan Hajnoczi bc19a0a6e4 throttle-groups: fix restart coroutine iothread race
The following QMP command leads to a crash when iothreads are used:

  { 'execute': 'device_del', 'arguments': {'id': 'data'} }

The backtrace involves the queue restart coroutine where
tgm->throttle_state is a NULL pointer because
throttle_group_unregister_tgm() has already been called:

  (gdb) bt full
  #0  0x00005585a7a3b378 in qemu_mutex_lock_impl (mutex=0xffffffffffffffd0, file=0x5585a7bb3d54 "block/throttle-groups.c", line=412) at util/qemu-thread-posix.c:64
        err = <optimized out>
        __PRETTY_FUNCTION__ = "qemu_mutex_lock_impl"
        __func__ = "qemu_mutex_lock_impl"
  #1  0x00005585a79be074 in throttle_group_restart_queue_entry (opaque=0x5585a9de4eb0) at block/throttle-groups.c:412
        _f = <optimized out>
        data = 0x5585a9de4eb0
        tgm = 0x5585a9079440
        ts = 0x0
        tg = 0xffffffffffffff98
        is_write = false
        empty_queue = 255

This coroutine should not execute in the iothread after the throttle
group member has been unregistered!

The root cause is that the device_del code path schedules the restart
coroutine in the iothread while holding the AioContext lock.  Therefore
the iothread cannot execute the coroutine until after device_del
releases the lock - by this time it's too late.

This patch adds a reference count to ThrottleGroupMember so we can
synchronously wait for restart coroutines to complete.  Once they are
done it is safe to unregister the ThrottleGroupMember.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-id: 20190114133257.30299-2-stefanha@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2019-01-24 10:02:28 +00:00
..
block throttle-groups: fix restart coroutine iothread race 2019-01-24 10:02:28 +00:00
chardev char: add a QEMU_CHAR_FEATURE_GCONTEXT flag 2018-12-12 09:55:57 +01:00
crypto crypto: support multiple threads accessing one QCryptoBlock 2018-12-12 11:16:49 +00:00
disas target/mips: Add disassembler support for nanoMIPS 2018-10-25 22:13:33 +02:00
exec qemu/queue.h: simplify reverse access to QTAILQ 2019-01-11 15:46:55 +01:00
fpu softfloat: add float{32,64}_is_zero_or_normal 2018-12-17 08:25:25 +00:00
hw virtio-net: Fix VirtIONet typedef redefinition 2019-01-22 06:26:05 +01:00
io io: return 0 for EOF in TLS session read after shutdown 2018-11-19 11:16:46 -06:00
libdecnumber
migration migration: Add post_save function to VMStateDescription 2019-01-21 10:38:55 +00:00
monitor monitor: Remove "x-oob", offer capability "oob" unconditionally 2018-12-12 10:28:27 +01:00
net virtio-net: support RSC v4/v6 tcp traffic for Windows HCK 2019-01-17 21:10:57 -05:00
qapi qapi: Rewrite string-input-visitor's integer and list parsing 2018-12-13 19:10:06 +01:00
qemu linux-user: Fix compilation with clang 3.4 2019-01-22 06:26:31 +01:00
qom qemu/queue.h: typedef QTAILQ heads 2019-01-11 15:46:55 +01:00
scsi avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
standard-headers
sysemu hw/bt: Remove HCIInfo from "qemu/typedefs.h" 2019-01-22 05:14:32 +01:00
ui ui: highres logo for sdl and gtk, bugfixes for vnc and egl. 2019-01-23 17:57:47 +00:00
elf.h avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
glib-compat.h glib-compat: add g_spawn_async_with_fds() fallback 2019-01-14 00:44:29 +01:00
qemu-common.h qemu-common.h: update copyright date to 2018 2018-10-16 17:52:06 +02:00
qemu-io.h
trace-tcg.h