qemu/include
Fam Zheng 2e5b887cfc block: Forbid bdrv_set_aio_context outside BQL
Even if the caller has both the old and the new AioContext's, there can
be a deadlock, due to the leading bdrv_drain_all.

Suppose there are four io threads (A, B, A0, B0) with A and B owning a
BDS for each (bs_a, bs_b); Now A wants to move bs_a to iothread A0, and
B wants to move bs_b to B0, at the same time:

  iothread A                           iothread B
--------------------------------------------------------------------------
  aio_context_acquire(A0) /* OK */     aio_context_acquire(B0) /* OK */
  bdrv_set_aio_context(bs_a, A0)       bdrv_set_aio_context(bs_b, B0)
  -> bdrv_drain_all()                  -> bdrv_drain_all()
     -> acquire A /* OK */               -> acquire A /* blocked */
     -> acquire B /* blocked */          -> acquire B
     ...                                 ...

Deadlock happens because A is waiting for B, and B is waiting for A.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1423969591-23646-2-git-send-email-famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2015-02-27 14:43:45 +01:00
..
block block: Forbid bdrv_set_aio_context outside BQL 2015-02-27 14:43:45 +01:00
disas disas: Implement disassembly output for A64 2014-02-08 14:50:48 +00:00
exec - vhost-scsi: add bootindex property 2015-02-24 13:58:18 +00:00
fpu softfloat: expand out STATUS macro 2015-02-06 16:11:38 +00:00
hw hmp: Normalize HMP command handler names 2015-02-25 13:14:37 +00:00
libdecnumber Fix new typos in comments (found by codespell) 2014-07-18 17:45:36 +04:00
migration hmp: Clean up declarations for long-gone info handlers 2015-02-18 11:58:21 +01:00
monitor Clean up around error_get_pretty(), qerror_report_err() 2015-02-26 07:01:08 +00:00
net hmp: Name HMP info handler functions hmp_info_SUBCOMMAND() 2015-02-18 11:58:50 +01:00
qapi error: New convenience function error_report_err() 2015-02-18 10:50:43 +01:00
qemu rcu: add g_free_rcu 2015-02-16 17:30:19 +01:00
qom exec: make iotlb RCU-friendly 2015-02-16 17:30:19 +01:00
sysemu hmp: Normalize HMP command handler names 2015-02-25 13:14:37 +00:00
ui hmp: Normalize HMP command handler names 2015-02-25 13:14:37 +00:00
config.h janitor: move remaining public headers to include/ 2012-12-19 08:32:46 +01:00
elf.h tcg-sparc: Use ADDXC in addsub2_i64 2014-09-29 14:55:27 -04:00
glib-compat.h glib: add compatibility interface for g_strcmp0() 2014-10-16 23:02:31 +01:00
qemu-common.h qemu-common.h: optimise muldiv64 if int128 is available 2015-01-14 10:38:57 +01:00
qemu-io.h qemu-io: Use BlockBackend 2015-02-16 15:07:19 +00:00
qjson.h QJSON: Add JSON writer 2015-02-05 17:16:14 +01:00
trace-tcg.h trace: [tcg] Generate TCG tracing routines 2014-08-12 14:26:12 +01:00
trace.h trace: [tcg] Include event definitions in "trace.h" 2014-08-12 14:26:12 +01:00