mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
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>
This commit is contained in:
parent
ff82b7835b
commit
ab61335025
4 changed files with 67 additions and 58 deletions
|
@ -483,19 +483,19 @@ struct test_iothread_data {
|
|||
BlockDriverState *bs;
|
||||
enum drain_type drain_type;
|
||||
int *aio_ret;
|
||||
bool co_done;
|
||||
};
|
||||
|
||||
static void test_iothread_drain_entry(void *opaque)
|
||||
static void coroutine_fn test_iothread_drain_co_entry(void *opaque)
|
||||
{
|
||||
struct test_iothread_data *data = opaque;
|
||||
|
||||
aio_context_acquire(bdrv_get_aio_context(data->bs));
|
||||
do_drain_begin(data->drain_type, data->bs);
|
||||
g_assert_cmpint(*data->aio_ret, ==, 0);
|
||||
do_drain_end(data->drain_type, data->bs);
|
||||
aio_context_release(bdrv_get_aio_context(data->bs));
|
||||
|
||||
qemu_event_set(&done_event);
|
||||
data->co_done = true;
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
static void test_iothread_aio_cb(void *opaque, int ret)
|
||||
|
@ -531,6 +531,7 @@ static void test_iothread_common(enum drain_type drain_type, int drain_thread)
|
|||
BlockDriverState *bs;
|
||||
BDRVTestState *s;
|
||||
BlockAIOCB *acb;
|
||||
Coroutine *co;
|
||||
int aio_ret;
|
||||
struct test_iothread_data data;
|
||||
|
||||
|
@ -609,8 +610,9 @@ static void test_iothread_common(enum drain_type drain_type, int drain_thread)
|
|||
}
|
||||
break;
|
||||
case 1:
|
||||
aio_bh_schedule_oneshot(ctx_a, test_iothread_drain_entry, &data);
|
||||
qemu_event_wait(&done_event);
|
||||
co = qemu_coroutine_create(test_iothread_drain_co_entry, &data);
|
||||
aio_co_enter(ctx_a, co);
|
||||
AIO_WAIT_WHILE_UNLOCKED(NULL, !data.co_done);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue