aboutsummaryrefslogtreecommitdiff
path: root/include/sysemu/block-backend-common.h
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2023-05-16 15:02:28 -0400
committerKevin Wolf <kwolf@redhat.com>2023-05-30 17:32:02 +0200
commitab61335025b1274bd7042219203524045b23e0d3 (patch)
tree209b7456df64d36079bc4eb6a43b8287a2436e33 /include/sysemu/block-backend-common.h
parentff82b7835b2fbbd0a17d616f6929601a97a6497d (diff)
downloadqemu-ab61335025b1274bd7042219203524045b23e0d3.zip
qemu-ab61335025b1274bd7042219203524045b23e0d3.tar.gz
qemu-ab61335025b1274bd7042219203524045b23e0d3.tar.bz2
block: drain from main loop thread in bdrv_co_yield_to_drain()
For simplicity, always run BlockDevOps .drained_begin/end/poll() callbacks in the main loop thread. This makes it easier to implement the callbacks and avoids extra locks. Move the function pointer declarations from the I/O Code section to the Global State section for BlockDevOps, BdrvChildClass, and BlockDriver. Narrow IO_OR_GS_CODE() to GLOBAL_STATE_CODE() where appropriate. The test-bdrv-drain test case calls bdrv_drain() from an IOThread. This is now only allowed from coroutine context, so update the test case to run in a coroutine. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230516190238.8401-11-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'include/sysemu/block-backend-common.h')
-rw-r--r--include/sysemu/block-backend-common.h25
1 files changed, 13 insertions, 12 deletions
diff --git a/include/sysemu/block-backend-common.h b/include/sysemu/block-backend-common.h
index 2391679..780cea7 100644
--- a/include/sysemu/block-backend-common.h
+++ b/include/sysemu/block-backend-common.h
@@ -60,6 +60,19 @@ typedef struct BlockDevOps {
bool (*is_medium_locked)(void *opaque);
/*
+ * Runs when the backend receives a drain request.
+ */
+ void (*drained_begin)(void *opaque);
+ /*
+ * Runs when the backend's last drain request ends.
+ */
+ void (*drained_end)(void *opaque);
+ /*
+ * Is the device still busy?
+ */
+ bool (*drained_poll)(void *opaque);
+
+ /*
* I/O API functions. These functions are thread-safe.
*
* See include/block/block-io.h for more information about
@@ -76,18 +89,6 @@ typedef struct BlockDevOps {
* Runs when the size changed (e.g. monitor command block_resize)
*/
void (*resize_cb)(void *opaque);
- /*
- * Runs when the backend receives a drain request.
- */
- void (*drained_begin)(void *opaque);
- /*
- * Runs when the backend's last drain request ends.
- */
- void (*drained_end)(void *opaque);
- /*
- * Is the device still busy?
- */
- bool (*drained_poll)(void *opaque);
} BlockDevOps;
/*