Message ID | 20201227164236.10143-5-pl@kamp.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block/rbd: migrate to coroutines and add write zeroes support | expand |
On Sun, Dec 27, 2020 at 11:42 AM Peter Lieven <pl@kamp.de> wrote: > > Signed-off-by: Peter Lieven <pl@kamp.de> > --- > block/rbd.c | 21 +++++++++++++++++++-- > 1 file changed, 19 insertions(+), 2 deletions(-) > > diff --git a/block/rbd.c b/block/rbd.c > index a2da70e37f..27b232f4d8 100644 > --- a/block/rbd.c > +++ b/block/rbd.c > @@ -91,6 +91,7 @@ typedef struct BDRVRBDState { > char *namespace; > uint64_t image_size; > uint64_t object_size; > + AioContext *aio_context; > } BDRVRBDState; > > static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx, > @@ -749,6 +750,8 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, > } > } > > + s->aio_context = bdrv_get_aio_context(bs); > + > /* When extending regular files, we get zeros from the OS */ > bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE; > > @@ -839,8 +842,7 @@ static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb) > rcb->ret = rbd_aio_get_return_value(c); > rbd_aio_release(c); > > - replay_bh_schedule_oneshot_event(bdrv_get_aio_context(acb->common.bs), > - rbd_finish_bh, rcb); > + replay_bh_schedule_oneshot_event(acb->s->aio_context, rbd_finish_bh, rcb); > } > > static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, > @@ -1151,6 +1153,18 @@ static const char *const qemu_rbd_strong_runtime_opts[] = { > NULL > }; > > +static void qemu_rbd_attach_aio_context(BlockDriverState *bs, > + AioContext *new_context) > +{ > + BDRVRBDState *s = bs->opaque; > + s->aio_context = new_context; > +} > + > +static void qemu_rbd_detach_aio_context(BlockDriverState *bs) > +{ I don't know enough about the internals of QEMU, but this seems suspicious to be a no-op. > +} > + > static BlockDriver bdrv_rbd = { > .format_name = "rbd", > .instance_size = sizeof(BDRVRBDState), > @@ -1180,6 +1194,9 @@ static BlockDriver bdrv_rbd = { > .bdrv_snapshot_goto = qemu_rbd_snap_rollback, > .bdrv_co_invalidate_cache = qemu_rbd_co_invalidate_cache, > > + .bdrv_attach_aio_context = qemu_rbd_attach_aio_context, > + .bdrv_detach_aio_context = qemu_rbd_detach_aio_context, > + > .strong_runtime_opts = qemu_rbd_strong_runtime_opts, > }; > > -- > 2.17.1 > > -- Jason
Am 14.01.21 um 20:18 schrieb Jason Dillaman: > On Sun, Dec 27, 2020 at 11:42 AM Peter Lieven <pl@kamp.de> wrote: >> Signed-off-by: Peter Lieven <pl@kamp.de> >> --- >> block/rbd.c | 21 +++++++++++++++++++-- >> 1 file changed, 19 insertions(+), 2 deletions(-) >> >> diff --git a/block/rbd.c b/block/rbd.c >> index a2da70e37f..27b232f4d8 100644 >> --- a/block/rbd.c >> +++ b/block/rbd.c >> @@ -91,6 +91,7 @@ typedef struct BDRVRBDState { >> char *namespace; >> uint64_t image_size; >> uint64_t object_size; >> + AioContext *aio_context; >> } BDRVRBDState; >> >> static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx, >> @@ -749,6 +750,8 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, >> } >> } >> >> + s->aio_context = bdrv_get_aio_context(bs); >> + >> /* When extending regular files, we get zeros from the OS */ >> bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE; >> >> @@ -839,8 +842,7 @@ static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb) >> rcb->ret = rbd_aio_get_return_value(c); >> rbd_aio_release(c); >> >> - replay_bh_schedule_oneshot_event(bdrv_get_aio_context(acb->common.bs), >> - rbd_finish_bh, rcb); >> + replay_bh_schedule_oneshot_event(acb->s->aio_context, rbd_finish_bh, rcb); >> } >> >> static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, >> @@ -1151,6 +1153,18 @@ static const char *const qemu_rbd_strong_runtime_opts[] = { >> NULL >> }; >> >> +static void qemu_rbd_attach_aio_context(BlockDriverState *bs, >> + AioContext *new_context) >> +{ >> + BDRVRBDState *s = bs->opaque; >> + s->aio_context = new_context; >> +} >> + >> +static void qemu_rbd_detach_aio_context(BlockDriverState *bs) >> +{ > I don't know enough about the internals of QEMU, but this seems > suspicious to be a no-op. You are right, I was believing attach and detach aio_context functions always needs to be implemented both at the same time. Normally this is the point where internal timers will be deleted or polling an fd will be stopped. We can leave it completely out or set s->aio_context = NULL if we don't want to omit it. Peter
diff --git a/block/rbd.c b/block/rbd.c index a2da70e37f..27b232f4d8 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -91,6 +91,7 @@ typedef struct BDRVRBDState { char *namespace; uint64_t image_size; uint64_t object_size; + AioContext *aio_context; } BDRVRBDState; static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx, @@ -749,6 +750,8 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, } } + s->aio_context = bdrv_get_aio_context(bs); + /* When extending regular files, we get zeros from the OS */ bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE; @@ -839,8 +842,7 @@ static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb) rcb->ret = rbd_aio_get_return_value(c); rbd_aio_release(c); - replay_bh_schedule_oneshot_event(bdrv_get_aio_context(acb->common.bs), - rbd_finish_bh, rcb); + replay_bh_schedule_oneshot_event(acb->s->aio_context, rbd_finish_bh, rcb); } static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, @@ -1151,6 +1153,18 @@ static const char *const qemu_rbd_strong_runtime_opts[] = { NULL }; +static void qemu_rbd_attach_aio_context(BlockDriverState *bs, + AioContext *new_context) +{ + BDRVRBDState *s = bs->opaque; + s->aio_context = new_context; +} + +static void qemu_rbd_detach_aio_context(BlockDriverState *bs) +{ + +} + static BlockDriver bdrv_rbd = { .format_name = "rbd", .instance_size = sizeof(BDRVRBDState), @@ -1180,6 +1194,9 @@ static BlockDriver bdrv_rbd = { .bdrv_snapshot_goto = qemu_rbd_snap_rollback, .bdrv_co_invalidate_cache = qemu_rbd_co_invalidate_cache, + .bdrv_attach_aio_context = qemu_rbd_attach_aio_context, + .bdrv_detach_aio_context = qemu_rbd_detach_aio_context, + .strong_runtime_opts = qemu_rbd_strong_runtime_opts, };
Signed-off-by: Peter Lieven <pl@kamp.de> --- block/rbd.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)