From: Kevin Wolf <kwolf@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: "Emanuele Giuseppe Esposito" <eesposit@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
qemu-block@nongnu.org,
"Stefan Berger" <stefanb@linux.vnet.ibm.com>,
"Hanna Reitz" <hreitz@redhat.com>, "Stefan Weil" <sw@weilnetz.de>,
"Aarushi Mehta" <mehta.aaru20@gmail.com>,
"Julia Suvorova" <jusual@redhat.com>,
"Stefano Garzarella" <sgarzare@redhat.com>,
"Greg Kurz" <groug@kaod.org>,
"Christian Schoenebeck" <qemu_oss@crudebyte.com>,
"Daniel Henrique Barboza" <danielhb413@gmail.com>,
"Cédric Le Goater" <clg@kaod.org>,
"David Gibson" <david@gibson.dropbear.id.au>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Fam Zheng" <fam@euphon.net>,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org
Subject: Re: [PATCH v5 1/4] linux-aio: use LinuxAioState from the running thread
Date: Wed, 8 Mar 2023 12:42:11 +0100 [thread overview]
Message-ID: <ZAh0k8xbUIQqELMi@redhat.com> (raw)
In-Reply-To: <20230307141806.GB124259@fedora>
[-- Attachment #1: Type: text/plain, Size: 6322 bytes --]
Am 07.03.2023 um 15:18 hat Stefan Hajnoczi geschrieben:
> On Tue, Mar 07, 2023 at 09:48:51AM +0100, Kevin Wolf wrote:
> > Am 01.03.2023 um 17:16 hat Stefan Hajnoczi geschrieben:
> > > On Fri, Feb 03, 2023 at 08:17:28AM -0500, Emanuele Giuseppe Esposito wrote:
> > > > Remove usage of aio_context_acquire by always submitting asynchronous
> > > > AIO to the current thread's LinuxAioState.
> > > >
> > > > In order to prevent mistakes from the caller side, avoid passing LinuxAioState
> > > > in laio_io_{plug/unplug} and laio_co_submit, and document the functions
> > > > to make clear that they work in the current thread's AioContext.
> > > >
> > > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
> > > > ---
> > > > include/block/aio.h | 4 ----
> > > > include/block/raw-aio.h | 18 ++++++++++++------
> > > > include/sysemu/block-backend-io.h | 6 ++++++
> > > > block/file-posix.c | 10 +++-------
> > > > block/linux-aio.c | 29 +++++++++++++++++------------
> > > > 5 files changed, 38 insertions(+), 29 deletions(-)
> > > >
> > > > diff --git a/include/block/aio.h b/include/block/aio.h
> > > > index 8fba6a3584..b6b396cfcb 100644
> > > > --- a/include/block/aio.h
> > > > +++ b/include/block/aio.h
> > > > @@ -208,10 +208,6 @@ struct AioContext {
> > > > struct ThreadPool *thread_pool;
> > > >
> > > > #ifdef CONFIG_LINUX_AIO
> > > > - /*
> > > > - * State for native Linux AIO. Uses aio_context_acquire/release for
> > > > - * locking.
> > > > - */
> > > > struct LinuxAioState *linux_aio;
> > > > #endif
> > > > #ifdef CONFIG_LINUX_IO_URING
> > > > diff --git a/include/block/raw-aio.h b/include/block/raw-aio.h
> > > > index f8cda9df91..db614472e6 100644
> > > > --- a/include/block/raw-aio.h
> > > > +++ b/include/block/raw-aio.h
> > > > @@ -49,14 +49,20 @@
> > > > typedef struct LinuxAioState LinuxAioState;
> > > > LinuxAioState *laio_init(Error **errp);
> > > > void laio_cleanup(LinuxAioState *s);
> > > > -int coroutine_fn laio_co_submit(BlockDriverState *bs, LinuxAioState *s, int fd,
> > > > - uint64_t offset, QEMUIOVector *qiov, int type,
> > > > - uint64_t dev_max_batch);
> > > > +
> > > > +/* laio_co_submit: submit I/O requests in the thread's current AioContext. */
> > > > +int coroutine_fn laio_co_submit(int fd, uint64_t offset, QEMUIOVector *qiov,
> > > > + int type, uint64_t dev_max_batch);
> > > > +
> > > > void laio_detach_aio_context(LinuxAioState *s, AioContext *old_context);
> > > > void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context);
> > > > -void laio_io_plug(BlockDriverState *bs, LinuxAioState *s);
> > > > -void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s,
> > > > - uint64_t dev_max_batch);
> > > > +
> > > > +/*
> > > > + * laio_io_plug/unplug work in the thread's current AioContext, therefore the
> > > > + * caller must ensure that they are paired in the same IOThread.
> > > > + */
> > > > +void laio_io_plug(void);
> > > > +void laio_io_unplug(uint64_t dev_max_batch);
> > > > #endif
> > > > /* io_uring.c - Linux io_uring implementation */
> > > > #ifdef CONFIG_LINUX_IO_URING
> > > > diff --git a/include/sysemu/block-backend-io.h b/include/sysemu/block-backend-io.h
> > > > index 031a27ba10..d41698ccc5 100644
> > > > --- a/include/sysemu/block-backend-io.h
> > > > +++ b/include/sysemu/block-backend-io.h
> > > > @@ -74,8 +74,14 @@ void blk_iostatus_set_err(BlockBackend *blk, int error);
> > > > int blk_get_max_iov(BlockBackend *blk);
> > > > int blk_get_max_hw_iov(BlockBackend *blk);
> > > >
> > > > +/*
> > > > + * blk_io_plug/unplug are thread-local operations. This means that multiple
> > > > + * IOThreads can simultaneously call plug/unplug, but the caller must ensure
> > > > + * that each unplug() is called in the same IOThread of the matching plug().
> > > > + */
> > > > void blk_io_plug(BlockBackend *blk);
> > > > void blk_io_unplug(BlockBackend *blk);
> > > > +
> > > > AioContext *blk_get_aio_context(BlockBackend *blk);
> > > > BlockAcctStats *blk_get_stats(BlockBackend *blk);
> > > > void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
> > > > diff --git a/block/file-posix.c b/block/file-posix.c
> > > > index fa227d9d14..fa99d1c25a 100644
> > > > --- a/block/file-posix.c
> > > > +++ b/block/file-posix.c
> > > > @@ -2095,10 +2095,8 @@ static int coroutine_fn raw_co_prw(BlockDriverState *bs, uint64_t offset,
> > > > #endif
> > > > #ifdef CONFIG_LINUX_AIO
> > > > } else if (s->use_linux_aio) {
> > > > - LinuxAioState *aio = aio_get_linux_aio(bdrv_get_aio_context(bs));
> > > > assert(qiov->size == bytes);
> > > > - return laio_co_submit(bs, aio, s->fd, offset, qiov, type,
> > > > - s->aio_max_batch);
> > > > + return laio_co_submit(s->fd, offset, qiov, type, s->aio_max_batch);
> > >
> > > I'm having second thoughts here. This is correct in an IOThread today,
> > > but the main loop thread case concerns me:
> > >
> > > This patch changes behavior when the main loop or vCPU thread submits
> > > I/O. Before, the IOThread's LinuxAioState would be used. Now the main
> > > loop's LinuxAioState will be used instead and aio callbacks will be
> > > invoked in the main loop thread instead of the IOThread.
> >
> > You mean we have a device that has a separate iothread, but a request is
> > submitted from the main thread? This isn't even allowed today; if a node
> > is in an iothread, all I/O must be submitted from that iothread. Do you
> > know any code that does submit I/O from the main thread instead?
>
> I think you're right. My mental model was outdated. Both the coroutine
> and non-coroutine code paths schedule coroutines in the AioContext.
>
> However, I think this patch series is still risky because it could
> reveal latent bugs. Let's merge it in the next development cycle (soft
> freeze is today!) to avoid destabilizing 8.0.
Makes sense, I've already started a block-next anyway.
So is this an R-b or A-b or nothing for now?
Kevin
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2023-03-08 11:43 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-03 13:17 [PATCH v5 0/4] AioContext removal: LinuxAioState and ThreadPool Emanuele Giuseppe Esposito
2023-02-03 13:17 ` [PATCH v5 1/4] linux-aio: use LinuxAioState from the running thread Emanuele Giuseppe Esposito
2023-03-01 16:16 ` Stefan Hajnoczi
2023-03-07 8:48 ` Kevin Wolf
2023-03-07 10:58 ` Paolo Bonzini
2023-03-07 12:17 ` Kevin Wolf
2023-03-07 14:18 ` Stefan Hajnoczi
2023-03-08 11:42 ` Kevin Wolf [this message]
2023-03-08 17:24 ` Stefan Hajnoczi
2023-02-03 13:17 ` [PATCH v5 2/4] io_uring: use LuringState " Emanuele Giuseppe Esposito
2023-02-03 13:17 ` [PATCH v5 3/4] thread-pool: use ThreadPool " Emanuele Giuseppe Esposito
2023-02-03 13:17 ` [PATCH v5 4/4] thread-pool: avoid passing the pool parameter every time Emanuele Giuseppe Esposito
2023-03-02 19:58 ` [PATCH v5 0/4] AioContext removal: LinuxAioState and ThreadPool Stefan Hajnoczi
2023-03-14 20:34 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZAh0k8xbUIQqELMi@redhat.com \
--to=kwolf@redhat.com \
--cc=clg@kaod.org \
--cc=danielhb413@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=eesposit@redhat.com \
--cc=fam@euphon.net \
--cc=groug@kaod.org \
--cc=hreitz@redhat.com \
--cc=jusual@redhat.com \
--cc=mehta.aaru20@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu_oss@crudebyte.com \
--cc=sgarzare@redhat.com \
--cc=stefanb@linux.vnet.ibm.com \
--cc=stefanha@redhat.com \
--cc=sw@weilnetz.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.