Implement bdrv_detach_aio_context & bdrv_attach_aio_context (should fix migration with iothread)
This commit is contained in:
@@ -705,6 +705,54 @@ static void vitastor_close(BlockDriverState *bs)
|
|||||||
client->last_bitmap = NULL;
|
client->last_bitmap = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unregister all event sources from the current AioContext. Called by the
|
||||||
|
// block layer before bs is moved to a different AioContext (e.g. during live
|
||||||
|
// migration, drain, dataplane switching). The block layer guarantees that no
|
||||||
|
// requests are in flight at this point.
|
||||||
|
static void vitastor_detach_aio_context(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
VitastorClient *client = bs->opaque;
|
||||||
|
int i;
|
||||||
|
#if defined VITASTOR_C_API_VERSION && VITASTOR_C_API_VERSION >= 2
|
||||||
|
if (client->uring_eventfd >= 0)
|
||||||
|
{
|
||||||
|
universal_aio_set_fd_handler(client->ctx, client->uring_eventfd, NULL, NULL, NULL);
|
||||||
|
// Wait until any scheduled B/H is processed before switching contexts:
|
||||||
|
// it would otherwise fire on the old context with stale state.
|
||||||
|
if (client->bh_uring_scheduled)
|
||||||
|
{
|
||||||
|
BDRV_POLL_WHILE(bs, client->bh_uring_scheduled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (i = 0; i < client->fd_count; i++)
|
||||||
|
{
|
||||||
|
universal_aio_set_fd_handler(client->ctx, client->fds[i]->fd, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// (Re-)register all event sources on the new AioContext.
|
||||||
|
static void vitastor_attach_aio_context(BlockDriverState *bs, AioContext *new_ctx)
|
||||||
|
{
|
||||||
|
VitastorClient *client = bs->opaque;
|
||||||
|
int i;
|
||||||
|
client->ctx = new_ctx;
|
||||||
|
#if defined VITASTOR_C_API_VERSION && VITASTOR_C_API_VERSION >= 2
|
||||||
|
if (client->uring_eventfd >= 0)
|
||||||
|
{
|
||||||
|
universal_aio_set_fd_handler(new_ctx, client->uring_eventfd, vitastor_uring_handler, NULL, client);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (i = 0; i < client->fd_count; i++)
|
||||||
|
{
|
||||||
|
VitastorFdData *fdd = client->fds[i];
|
||||||
|
universal_aio_set_fd_handler(new_ctx, fdd->fd,
|
||||||
|
fdd->fd_read ? vitastor_aio_fd_read : NULL,
|
||||||
|
fdd->fd_write ? vitastor_aio_fd_write : NULL,
|
||||||
|
fdd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 2
|
#if QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 2
|
||||||
static void vitastor_refresh_filename(BlockDriverState *bs)
|
static void vitastor_refresh_filename(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
@@ -1188,6 +1236,9 @@ static BlockDriver bdrv_vitastor = {
|
|||||||
#endif
|
#endif
|
||||||
.bdrv_close = vitastor_close,
|
.bdrv_close = vitastor_close,
|
||||||
|
|
||||||
|
.bdrv_detach_aio_context = vitastor_detach_aio_context,
|
||||||
|
.bdrv_attach_aio_context = vitastor_attach_aio_context,
|
||||||
|
|
||||||
// Option list for the create operation
|
// Option list for the create operation
|
||||||
#if QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR > 0
|
#if QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR > 0
|
||||||
.create_opts = &vitastor_create_opts,
|
.create_opts = &vitastor_create_opts,
|
||||||
|
|||||||
Reference in New Issue
Block a user