qemu-e2k/include/qemu
Stefan Hajnoczi 8f5e9a8ee1 block/export: wait for vhost-user-blk requests when draining
Each vhost-user-blk request runs in a coroutine. When the BlockBackend
enters a drained section we need to enter a quiescent state. Currently
any in-flight requests race with bdrv_drained_begin() because it is
unaware of vhost-user-blk requests.

When blk_co_preadv/pwritev()/etc returns it wakes the
bdrv_drained_begin() thread but vhost-user-blk request processing has
not yet finished. The request coroutine continues executing while the
main loop thread thinks it is in a drained section.

One example where this is unsafe is for blk_set_aio_context() where
bdrv_drained_begin() is called before .aio_context_detached() and
.aio_context_attach(). If request coroutines are still running after
bdrv_drained_begin(), then the AioContext could change underneath them
and they race with new requests processed in the new AioContext. This
could lead to virtqueue corruption, for example.

(This example is theoretical, I came across this while reading the
code and have not tried to reproduce it.)

It's easy to make bdrv_drained_begin() wait for in-flight requests: add
a .drained_poll() callback that checks the VuServer's in-flight counter.
VuServer just needs an API that returns true when there are requests in
flight. The in-flight counter needs to be atomic.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20230516190238.8401-7-stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-05-30 17:32:02 +02:00
..
accel.h typedefs: Forward-declare AccelState 2023-01-06 00:50:32 +01:00
async-teardown.h Don't include headers already included by qemu/osdep.h 2023-02-08 07:28:05 +01:00
atomic128.h include/qemu: Move CONFIG_ATOMIC128_OPT handling to atomic128.h 2023-05-23 16:51:18 -07:00
atomic.h qatomic: add smp_mb__before/after_rmw() 2023-03-07 12:38:40 +01:00
base64.h
bcd.h
bitmap.h replace TABs with spaces 2023-03-20 12:43:50 +01:00
bitops.h qemu/bitops.h: Limit rotate amounts 2023-05-02 12:36:46 -07:00
bswap.h qemu/bswap: Add const_le64() 2023-03-02 19:13:52 -05:00
buffer.h Replace GCC_FMT_ATTR with G_GNUC_PRINTF 2022-03-22 14:40:51 +04:00
cacheflush.h
cacheinfo.h include: Move qemu_[id]cache_* declarations to new qemu/cacheinfo.h 2022-02-21 13:30:20 +00:00
clang-tsa.h clang-tsa: Add macros for shared locks 2022-12-15 16:07:43 +01:00
co-shared-resource.h co-shared-resource: protect with a mutex 2021-06-25 14:24:24 +03:00
compiler.h replace TABs with spaces 2023-03-20 12:43:50 +01:00
config-file.h qemu-config: Make config_parse_qdict() return bool 2022-12-14 16:19:35 +01:00
coroutine_int.h
coroutine-core.h coroutine: Split qemu/coroutine-core.h off qemu/coroutine.h 2023-01-20 07:21:46 +01:00
coroutine-tls.h tls: add macros for coroutine-safe TLS variables 2022-03-04 18:14:40 +01:00
coroutine.h coroutine: Split qemu/coroutine-core.h off qemu/coroutine.h 2023-01-20 07:21:46 +01:00
cpu-float.h Clean up ill-advised or unusual header guards 2022-05-11 16:50:01 +02:00
cpuid.h tcg/i386: Add have_atomic16 2023-05-16 15:21:39 -07:00
crc32c.h igb: Implement Rx SCTP CSO 2023-05-23 15:20:15 +08:00
crc-ccitt.h Clean up ill-advised or unusual header guards 2022-05-11 16:50:01 +02:00
ctype.h
cutils.h cutils: Introduce bundle mechanism 2022-07-13 16:58:57 +02:00
datadir.h
dbus.h Don't include headers already included by qemu/osdep.h 2023-02-08 07:28:05 +01:00
drm.h
envlist.h remove unnecessary extern "C" blocks 2023-02-10 14:12:06 +01:00
error-report.h Move error_printf_unless_qmp() with monitor unit 2022-04-21 17:09:09 +04:00
event_notifier.h event_notifier: add event_notifier_get_wfd() 2022-03-06 06:19:47 -05:00
fifo8.h
fifo32.h
filemonitor.h
futex.h
guest-random.h
hbitmap.h hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-17 14:34:24 +01:00
help_option.h
help-texts.h Clean up header guards that don't match their file name 2022-05-11 16:49:06 +02:00
host-utils.h qemu/host-utils.h: Add clz and ctz functions for lower-bit integers 2023-05-02 13:05:45 -07:00
hw-version.h include: Move hardware version declarations to new qemu/hw-version.h 2022-02-21 13:30:20 +00:00
id.h
int128.h qemu/int128: Re-shuffle Int128Alias members 2023-05-02 13:05:45 -07:00
interval-tree.h util: Add interval-tree.c 2022-12-20 17:09:41 -08:00
iov.h
iova-tree.h util: accept iova_tree_remove_parameter by value 2022-09-02 10:22:39 +08:00
jhash.h
job.h job: remove unused functions 2022-10-07 12:11:41 +02:00
keyval.h Clean up ill-advised or unusual header guards 2022-05-11 16:50:01 +02:00
lockable.h coroutine: Split qemu/coroutine-core.h off qemu/coroutine.h 2023-01-20 07:21:46 +01:00
log-for-trace.h util/log: Drop return value from qemu_log 2022-04-20 10:51:11 -07:00
log.h util/log: Support per-thread log files 2022-04-20 10:51:11 -07:00
madvise.h include: Move qemu_madvise() and related #defines to new qemu/madvise.h 2022-02-21 13:30:20 +00:00
main-loop.h async: Add an optional reentrancy guard to the BH API 2023-04-28 11:31:07 +02:00
memalign.h osdep: Move memalign-related functions to their own header 2022-03-07 13:16:49 +00:00
memfd.h
mmap-alloc.h util/mmap-alloc: qemu_fd_getfs() 2023-04-24 11:29:00 +02:00
module.h module: add Error arguments to module_load and module_load_qom 2022-11-06 09:48:50 +01:00
mprotect.h include: Move qemu_mprotect_*() to new qemu/mprotect.h 2022-02-21 13:30:20 +00:00
notify.h
nvdimm-utils.h
option_int.h
option.h include: add qemu/keyval.h 2022-04-21 17:03:51 +04:00
osdep.h include/qemu/osdep.h: Bump _WIN32_WINNT to the Windows 8 API 2023-05-08 16:35:30 +02:00
path.h
plugin-event.h include/qemu: Split out plugin-event.h 2023-03-22 15:06:57 +00:00
plugin-memory.h include: Include headers where needed 2023-01-08 01:54:22 -05:00
plugin.h include/qemu/plugin: Inline qemu_plugin_disable_mem_helpers 2023-03-22 15:06:57 +00:00
pmem.h
processor.h
progress_meter.h coroutine: Clean up superfluous inclusion of qemu/lockable.h 2023-01-19 10:18:28 +01:00
qdist.h
qemu-options.h remove qemu-options* from root directory 2021-05-26 14:49:46 +02:00
qemu-plugin.h include/qemu: add documentation for memory callbacks 2023-03-22 15:06:57 +00:00
qemu-print.h Replace GCC_FMT_ATTR with G_GNUC_PRINTF 2022-03-22 14:40:51 +04:00
qemu-progress.h include: move progress API to qemu-progress.h 2022-04-06 14:31:43 +02:00
qht.h
qsp.h
qtree.h util: import GTree as QTree 2023-03-28 15:23:10 -07:00
queue.h
range.h compiler.h: replace QEMU_WARN_UNUSED_RESULT with G_GNUC_WARN_UNUSED_RESULT 2022-03-22 14:40:51 +04:00
ratelimit.h ratelimit: treat zero speed as unlimited 2021-06-25 14:22:21 +03:00
rcu_queue.h remove unnecessary extern "C" blocks 2023-02-10 14:12:06 +01:00
rcu.h rcu: remove qatomic_mb_set, expand comments 2023-05-08 11:10:48 +02:00
readline.h readline: Extract readline_add_completion_of() from monitor 2023-02-04 07:56:54 +01:00
selfmap.h Clean up decorations and whitespace around header guards 2022-05-11 16:50:32 +02:00
seqlock.h
sockets.h osdep: implement qemu_socketpair() for win32 2023-03-13 15:39:31 +04:00
stats64.h stat64: Add stat64_set() operation 2023-04-27 16:39:43 +02:00
sys_membarrier.h
systemd.h
thread-context.h util: Introduce ThreadContext user-creatable object 2022-10-27 11:00:43 +02:00
thread-posix.h thread-posix: implement Semaphore with QemuCond and QemuMutex 2022-04-06 14:31:56 +02:00
thread-win32.h util: Use real functions for thread-posix QemuRecMutex 2021-06-16 15:03:26 +02:00
thread.h util/qemu-thread-posix: use TSA_NO_TSA to suppress clang TSA warnings in FreeBSD 2023-02-17 11:22:19 +01:00
throttle-options.h
throttle.h
timed-average.h
timer.h Use g_new() & friends where that makes obvious sense 2022-03-21 15:44:44 +01:00
transactions.h transactions: Invoke clean() after everything else 2021-11-16 09:43:44 +01:00
tsan.h
typedefs.h hw/core: Use a callback for target specific query-cpus-fast information 2023-05-16 09:14:18 +02:00
unicode.h
units.h
uri.h replace TABs with spaces 2023-03-20 12:43:50 +01:00
userfaultfd.h migration: Clean up includes 2023-02-08 07:27:20 +01:00
uuid.h qemu/uuid: Add UUID static initializer 2023-03-02 19:13:52 -05:00
vfio-helpers.h util/vfio-helpers: Pass Error handle to qemu_vfio_dma_map() 2021-09-07 09:08:24 +01:00
vhost-user-server.h block/export: wait for vhost-user-blk requests when draining 2023-05-30 17:32:02 +02:00
win_dump_defs.h include/qemu: add 32-bit Windows dump structures 2022-04-22 13:36:04 +04:00
xattr.h qemu/xattr.h: Exclude <sys/xattr.h> for Windows 2022-12-23 11:48:13 +01:00
xxhash.h
yank.h