From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43624) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wg84h-0005cV-58 for qemu-devel@nongnu.org; Fri, 02 May 2014 03:40:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wg84X-00088l-V0 for qemu-devel@nongnu.org; Fri, 02 May 2014 03:40:03 -0400 Received: from mail-ee0-x234.google.com ([2a00:1450:4013:c00::234]:41044) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wg84X-00088V-Jo for qemu-devel@nongnu.org; Fri, 02 May 2014 03:39:53 -0400 Received: by mail-ee0-f52.google.com with SMTP id e53so2835766eek.39 for ; Fri, 02 May 2014 00:39:52 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <53634BBC.2070207@redhat.com> Date: Fri, 02 May 2014 09:39:40 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1398956086-20171-1-git-send-email-stefanha@redhat.com> <1398956086-20171-14-git-send-email-stefanha@redhat.com> In-Reply-To: <1398956086-20171-14-git-send-email-stefanha@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 13/22] block/raw-posix: implement .bdrv_detach/attach_aio_context() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi , qemu-devel@nongnu.org Cc: Kevin Wolf , "Shergill, Gurinder" , "Vinod, Chegu" 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 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, >