Message ID | 1398956086-20171-14-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
Il 01/05/2014 16:54, Stefan Hajnoczi ha scritto: > Drop the assumption that we're using the main AioContext for Linux AIO. > Convert the Linux AIO event notifier to use aio_set_event_notifier(). > > The .bdrv_detach/attach_aio_context() interfaces also need to be > implemented to move the event notifier handler from the old to the new > AioContext. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Is the same needed for raw-win32? Paolo > --- > block/linux-aio.c | 16 ++++++++++++++-- > block/raw-aio.h | 2 ++ > block/raw-posix.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 59 insertions(+), 2 deletions(-) > > diff --git a/block/linux-aio.c b/block/linux-aio.c > index 53434e2..7ff3897 100644 > --- a/block/linux-aio.c > +++ b/block/linux-aio.c > @@ -177,6 +177,20 @@ out_free_aiocb: > return NULL; > } > > +void laio_detach_aio_context(void *s_, AioContext *old_context) > +{ > + struct qemu_laio_state *s = s_; > + > + aio_set_event_notifier(old_context, &s->e, NULL); > +} > + > +void laio_attach_aio_context(void *s_, AioContext *new_context) > +{ > + struct qemu_laio_state *s = s_; > + > + aio_set_event_notifier(new_context, &s->e, qemu_laio_completion_cb); > +} > + > void *laio_init(void) > { > struct qemu_laio_state *s; > @@ -190,8 +204,6 @@ void *laio_init(void) > goto out_close_efd; > } > > - qemu_aio_set_event_notifier(&s->e, qemu_laio_completion_cb); > - > return s; > > out_close_efd: > diff --git a/block/raw-aio.h b/block/raw-aio.h > index 7ad0a8a..9a761ee 100644 > --- a/block/raw-aio.h > +++ b/block/raw-aio.h > @@ -37,6 +37,8 @@ void *laio_init(void); > BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd, > int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, > BlockDriverCompletionFunc *cb, void *opaque, int type); > +void laio_detach_aio_context(void *s, AioContext *old_context); > +void laio_attach_aio_context(void *s, AioContext *new_context); > #endif > > #ifdef _WIN32 > diff --git a/block/raw-posix.c b/block/raw-posix.c > index 1688e16..9fef157 100644 > --- a/block/raw-posix.c > +++ b/block/raw-posix.c > @@ -304,6 +304,29 @@ static void raw_parse_flags(int bdrv_flags, int *open_flags) > } > } > > +static void raw_detach_aio_context(BlockDriverState *bs) > +{ > +#ifdef CONFIG_LINUX_AIO > + BDRVRawState *s = bs->opaque; > + > + if (s->use_aio) { > + laio_detach_aio_context(s->aio_ctx, bdrv_get_aio_context(bs)); > + } > +#endif > +} > + > +static void raw_attach_aio_context(BlockDriverState *bs, > + AioContext *new_context) > +{ > +#ifdef CONFIG_LINUX_AIO > + BDRVRawState *s = bs->opaque; > + > + if (s->use_aio) { > + laio_attach_aio_context(s->aio_ctx, new_context); > + } > +#endif > +} > + > #ifdef CONFIG_LINUX_AIO > static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags) > { > @@ -444,6 +467,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, > } > #endif > > + raw_attach_aio_context(bs, bdrv_get_aio_context(bs)); > + > ret = 0; > fail: > qemu_opts_del(opts); > @@ -1053,6 +1078,9 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs, > static void raw_close(BlockDriverState *bs) > { > BDRVRawState *s = bs->opaque; > + > + raw_detach_aio_context(bs); > + > if (s->fd >= 0) { > qemu_close(s->fd); > s->fd = -1; > @@ -1448,6 +1476,9 @@ static BlockDriver bdrv_file = { > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > > + .bdrv_detach_aio_context = raw_detach_aio_context, > + .bdrv_attach_aio_context = raw_attach_aio_context, > + > .create_options = raw_create_options, > }; > > @@ -1848,6 +1879,9 @@ static BlockDriver bdrv_host_device = { > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > > + .bdrv_detach_aio_context = raw_detach_aio_context, > + .bdrv_attach_aio_context = raw_attach_aio_context, > + > /* generic scsi device */ > #ifdef __linux__ > .bdrv_ioctl = hdev_ioctl, > @@ -1990,6 +2024,9 @@ static BlockDriver bdrv_host_floppy = { > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > > + .bdrv_detach_aio_context = raw_detach_aio_context, > + .bdrv_attach_aio_context = raw_attach_aio_context, > + > /* removable device support */ > .bdrv_is_inserted = floppy_is_inserted, > .bdrv_media_changed = floppy_media_changed, > @@ -2115,6 +2152,9 @@ static BlockDriver bdrv_host_cdrom = { > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > > + .bdrv_detach_aio_context = raw_detach_aio_context, > + .bdrv_attach_aio_context = raw_attach_aio_context, > + > /* removable device support */ > .bdrv_is_inserted = cdrom_is_inserted, > .bdrv_eject = cdrom_eject, > @@ -2246,6 +2286,9 @@ static BlockDriver bdrv_host_cdrom = { > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > > + .bdrv_detach_aio_context = raw_detach_aio_context, > + .bdrv_attach_aio_context = raw_attach_aio_context, > + > /* removable device support */ > .bdrv_is_inserted = cdrom_is_inserted, > .bdrv_eject = cdrom_eject, >
On Fri, May 2, 2014 at 9:39 AM, Paolo Bonzini <pbonzini@redhat.com> wrote: > Il 01/05/2014 16:54, Stefan Hajnoczi ha scritto: > >> Drop the assumption that we're using the main AioContext for Linux AIO. >> Convert the Linux AIO event notifier to use aio_set_event_notifier(). >> >> The .bdrv_detach/attach_aio_context() interfaces also need to be >> implemented to move the event notifier handler from the old to the new >> AioContext. >> >> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > > > Is the same needed for raw-win32? You are right, I will add raw-win32 support in v2. Stefan
diff --git a/block/linux-aio.c b/block/linux-aio.c index 53434e2..7ff3897 100644 --- a/block/linux-aio.c +++ b/block/linux-aio.c @@ -177,6 +177,20 @@ out_free_aiocb: return NULL; } +void laio_detach_aio_context(void *s_, AioContext *old_context) +{ + struct qemu_laio_state *s = s_; + + aio_set_event_notifier(old_context, &s->e, NULL); +} + +void laio_attach_aio_context(void *s_, AioContext *new_context) +{ + struct qemu_laio_state *s = s_; + + aio_set_event_notifier(new_context, &s->e, qemu_laio_completion_cb); +} + void *laio_init(void) { struct qemu_laio_state *s; @@ -190,8 +204,6 @@ void *laio_init(void) goto out_close_efd; } - qemu_aio_set_event_notifier(&s->e, qemu_laio_completion_cb); - return s; out_close_efd: diff --git a/block/raw-aio.h b/block/raw-aio.h index 7ad0a8a..9a761ee 100644 --- a/block/raw-aio.h +++ b/block/raw-aio.h @@ -37,6 +37,8 @@ void *laio_init(void); BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque, int type); +void laio_detach_aio_context(void *s, AioContext *old_context); +void laio_attach_aio_context(void *s, AioContext *new_context); #endif #ifdef _WIN32 diff --git a/block/raw-posix.c b/block/raw-posix.c index 1688e16..9fef157 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -304,6 +304,29 @@ static void raw_parse_flags(int bdrv_flags, int *open_flags) } } +static void raw_detach_aio_context(BlockDriverState *bs) +{ +#ifdef CONFIG_LINUX_AIO + BDRVRawState *s = bs->opaque; + + if (s->use_aio) { + laio_detach_aio_context(s->aio_ctx, bdrv_get_aio_context(bs)); + } +#endif +} + +static void raw_attach_aio_context(BlockDriverState *bs, + AioContext *new_context) +{ +#ifdef CONFIG_LINUX_AIO + BDRVRawState *s = bs->opaque; + + if (s->use_aio) { + laio_attach_aio_context(s->aio_ctx, new_context); + } +#endif +} + #ifdef CONFIG_LINUX_AIO static int raw_set_aio(void **aio_ctx, int *use_aio, int bdrv_flags) { @@ -444,6 +467,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, } #endif + raw_attach_aio_context(bs, bdrv_get_aio_context(bs)); + ret = 0; fail: qemu_opts_del(opts); @@ -1053,6 +1078,9 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs, static void raw_close(BlockDriverState *bs) { BDRVRawState *s = bs->opaque; + + raw_detach_aio_context(bs); + if (s->fd >= 0) { qemu_close(s->fd); s->fd = -1; @@ -1448,6 +1476,9 @@ static BlockDriver bdrv_file = { .bdrv_get_allocated_file_size = raw_get_allocated_file_size, + .bdrv_detach_aio_context = raw_detach_aio_context, + .bdrv_attach_aio_context = raw_attach_aio_context, + .create_options = raw_create_options, }; @@ -1848,6 +1879,9 @@ static BlockDriver bdrv_host_device = { .bdrv_get_allocated_file_size = raw_get_allocated_file_size, + .bdrv_detach_aio_context = raw_detach_aio_context, + .bdrv_attach_aio_context = raw_attach_aio_context, + /* generic scsi device */ #ifdef __linux__ .bdrv_ioctl = hdev_ioctl, @@ -1990,6 +2024,9 @@ static BlockDriver bdrv_host_floppy = { .bdrv_get_allocated_file_size = raw_get_allocated_file_size, + .bdrv_detach_aio_context = raw_detach_aio_context, + .bdrv_attach_aio_context = raw_attach_aio_context, + /* removable device support */ .bdrv_is_inserted = floppy_is_inserted, .bdrv_media_changed = floppy_media_changed, @@ -2115,6 +2152,9 @@ static BlockDriver bdrv_host_cdrom = { .bdrv_get_allocated_file_size = raw_get_allocated_file_size, + .bdrv_detach_aio_context = raw_detach_aio_context, + .bdrv_attach_aio_context = raw_attach_aio_context, + /* removable device support */ .bdrv_is_inserted = cdrom_is_inserted, .bdrv_eject = cdrom_eject, @@ -2246,6 +2286,9 @@ static BlockDriver bdrv_host_cdrom = { .bdrv_get_allocated_file_size = raw_get_allocated_file_size, + .bdrv_detach_aio_context = raw_detach_aio_context, + .bdrv_attach_aio_context = raw_attach_aio_context, + /* removable device support */ .bdrv_is_inserted = cdrom_is_inserted, .bdrv_eject = cdrom_eject,
Drop the assumption that we're using the main AioContext for Linux AIO. Convert the Linux AIO event notifier to use aio_set_event_notifier(). The .bdrv_detach/attach_aio_context() interfaces also need to be implemented to move the event notifier handler from the old to the new AioContext. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- block/linux-aio.c | 16 ++++++++++++++-- block/raw-aio.h | 2 ++ block/raw-posix.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-)