mirror of https://github.com/xemu-project/xemu.git
test-bdrv-drain: Don't call bdrv_graph_wrlock() in coroutine context
AIO callbacks are effectively coroutine_mixed_fn. If AIO requests don't return immediately, their callback is called from the request coroutine. This means that in AIO callbacks, we can't call no_coroutine_fns such as bdrv_graph_wrlock(). Unfortunately test-bdrv-drain does so. Change the test to use a BH to drop out of coroutine context, and add coroutine_mixed_fn and no_coroutine_fn markers to clarify the context each function runs in. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20230929145157.45443-2-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
cc32399773
commit
903df115aa
|
@ -1168,7 +1168,7 @@ struct detach_by_parent_data {
|
|||
};
|
||||
static struct detach_by_parent_data detach_by_parent_data;
|
||||
|
||||
static void detach_indirect_bh(void *opaque)
|
||||
static void no_coroutine_fn detach_indirect_bh(void *opaque)
|
||||
{
|
||||
struct detach_by_parent_data *data = opaque;
|
||||
|
||||
|
@ -1184,14 +1184,15 @@ static void detach_indirect_bh(void *opaque)
|
|||
bdrv_graph_wrunlock();
|
||||
}
|
||||
|
||||
static void detach_by_parent_aio_cb(void *opaque, int ret)
|
||||
static void coroutine_mixed_fn detach_by_parent_aio_cb(void *opaque, int ret)
|
||||
{
|
||||
struct detach_by_parent_data *data = &detach_by_parent_data;
|
||||
|
||||
g_assert_cmpint(ret, ==, 0);
|
||||
if (data->by_parent_cb) {
|
||||
bdrv_inc_in_flight(data->child_b->bs);
|
||||
detach_indirect_bh(data);
|
||||
aio_bh_schedule_oneshot(qemu_get_current_aio_context(),
|
||||
detach_indirect_bh, &detach_by_parent_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue