From: Stefan Hajnoczi <stefanha@redhat.com>
To: John Levon <john.levon@nutanix.com>
Cc: "Elena Ufimtseva" <elena.ufimtseva@oracle.com>,
"John Johnson" <john.g.johnson@oracle.com>,
"thuth@redhat.com" <thuth@redhat.com>,
"Jag Raman" <jag.raman@oracle.com>,
"bleal@redhat.com" <bleal@redhat.com>,
"Swapnil Ingle" <swapnil.ingle@nutanix.com>,
"alex.bennee@linaro.org" <alex.bennee@linaro.org>,
"crosa@redhat.com" <crosa@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>,
"wainersm@redhat.com" <wainersm@redhat.com>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@gmail.com>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"Thanos Makatos" <thanos.makatos@nutanix.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: Re: [PATCH v4 07/14] vfio-user: run vfio-user context
Date: Tue, 11 Jan 2022 09:36:35 +0000 [thread overview]
Message-ID: <Yd1Po1Wv6T3AELBF@stefanha-x1.localdomain> (raw)
In-Reply-To: <YdxzRoyD5gZDduYr@movementarian.org>
[-- Attachment #1: Type: text/plain, Size: 4119 bytes --]
On Mon, Jan 10, 2022 at 05:56:25PM +0000, John Levon wrote:
> On Thu, Jan 06, 2022 at 01:35:32PM +0000, Stefan Hajnoczi wrote:
>
> > > > >> +static void vfu_object_attach_ctx(void *opaque)
> > > > >> +{
> > > > >> + VfuObject *o = opaque;
> > > > >> + GPollFD pfds[1];
> > > > >> + int ret;
> > > > >> +
> > > > >> + qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL);
> > > > >> +
> > > > >> + pfds[0].fd = o->vfu_poll_fd;
> > > > >> + pfds[0].events = G_IO_IN | G_IO_HUP | G_IO_ERR;
> > > > >> +
> > > > >> +retry_attach:
> > > > >> + ret = vfu_attach_ctx(o->vfu_ctx);
> > > > >> + if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
> > > > >> + qemu_poll_ns(pfds, 1, 500 * (int64_t)SCALE_MS);
> > > > >> + goto retry_attach;
> > > > >
> > > > > This can block the thread indefinitely. Other events like monitor
> > > > > commands are not handled in this loop. Please make this asynchronous
> > > > > (set an fd handler and return from this function so we can try again
> > > > > later).
> > > > >
> > > > > The vfu_attach_ctx() implementation synchronously negotiates the
> > > > > vfio-user connection :(. That's a shame because even if accept(2) is
> > > > > handled asynchronously, the negotiation can still block. It would be
> > > > > cleanest to have a fully async libvfio-user's vfu_attach_ctx() API to
> > > > > avoid blocking. Is that possible?
> > > >
> > > > Thanos / John,
> > > >
> > > > Any thoughts on this?
> > >
> > > I'm discussing this with John and FYI there are other places where libvfio-user can block, e.g. sending a response or receiving a command. Is it just the negotiation you want it to be asynchronous or _all_ libvfio-user operations? Making libvfio-user fully asynchronous might require a substantial API rewrite.
> >
> > I see at least two reasons for a fully async API:
> >
> > 1. The program wants to handle other events (e.g. a management REST API)
> > from the same event loop thread that invokes libvfio-user. If
> > libvfio-user blocks then the other events cannot be handled within a
> > reasonable time frame.
> >
> > The workaround for this is to use multi-threading and ignore the
> > event-driven architecture implied by vfu_get_poll_fd().
> >
> > 2. The program handles multiple clients that do not trust each other.
> > This could be a software-defined network switch or storage appliance.
> > A malicious client can cause a denial-of-service by making a
> > libvfio-user call block.
> >
> > Again, the program needs separate threads instead of an event loop to
> > work around this.
>
> Hi Stefan, we're certainly aware of the rationale. Ultimately we just haven't
> yet found resources to fix this: in practice, we don't really hit problems from
> the parts that are still synchronous. Of course, that's not a good argument when
> it comes to your second issue, and indeed the library is not currently suitable
> for multiple untrusted clients.
>
> For Jag but: patches are welcome. But it's not just negotiate(): all sorts of
> things are potentially synchronous - for example, it's expected that the region
> read/write callbacks are done synchronously. Any other client reply, or
> server->client message, is also synchronous.
>
> It's partly why we haven't yet stabilised the API.
From the QEMU side it's okay to have blocking code in this experimental
feature if users are aware of the limitation (e.g. the monitor is
unresponsive if vfio-user blocks) and multiple untrusted clients are not
supported. The QEMU code should also make its limitations clear so
readers are aware of them and know the author chose this approach
intentionally rather than due to an oversight.
Jag: Please mention this in the documentation and add a comment to
vfu_object_attach_ctx() explaining that this code currently blocks.
I think in the long run it will be necessary to address it, e.g. in the
multi-client case. That can either be done with threads or by making
libvfio-user fully async.
Stefan
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2022-01-11 9:39 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-15 15:35 [PATCH v4 00/14] vfio-user server in QEMU Jagannathan Raman
2021-12-15 15:35 ` [PATCH v4 01/14] configure, meson: override C compiler for cmake Jagannathan Raman
2021-12-15 15:35 ` [PATCH v4 02/14] tests/avocado: Specify target VM argument to helper routines Jagannathan Raman
2021-12-15 15:54 ` Philippe Mathieu-Daudé
2021-12-15 22:04 ` Beraldo Leal
2021-12-16 21:28 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 03/14] vfio-user: build library Jagannathan Raman
2021-12-15 15:35 ` [PATCH v4 04/14] vfio-user: define vfio-user-server object Jagannathan Raman
2021-12-16 9:33 ` Stefan Hajnoczi
2021-12-17 2:17 ` Jag Raman
2021-12-16 9:58 ` Stefan Hajnoczi
2021-12-17 2:31 ` Jag Raman
2021-12-17 8:28 ` Stefan Hajnoczi
2021-12-15 15:35 ` [PATCH v4 05/14] vfio-user: instantiate vfio-user context Jagannathan Raman
2021-12-16 9:55 ` Stefan Hajnoczi
2021-12-16 21:32 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 06/14] vfio-user: find and init PCI device Jagannathan Raman
2021-12-16 10:39 ` Stefan Hajnoczi
2021-12-17 3:12 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 07/14] vfio-user: run vfio-user context Jagannathan Raman
2021-12-16 11:17 ` Stefan Hajnoczi
2021-12-17 17:59 ` Jag Raman
2021-12-20 8:29 ` Stefan Hajnoczi
2021-12-21 3:04 ` Jag Raman
2022-01-05 10:38 ` Thanos Makatos
2022-01-06 13:35 ` Stefan Hajnoczi
2022-01-10 17:56 ` John Levon
2022-01-11 9:36 ` Stefan Hajnoczi [this message]
2022-01-11 13:12 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 08/14] vfio-user: handle PCI config space accesses Jagannathan Raman
2021-12-16 11:30 ` Stefan Hajnoczi
2021-12-16 11:47 ` John Levon
2021-12-16 16:00 ` Stefan Hajnoczi
2021-12-15 15:35 ` [PATCH v4 09/14] vfio-user: handle DMA mappings Jagannathan Raman
2021-12-16 13:24 ` Stefan Hajnoczi
2021-12-17 19:11 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 10/14] vfio-user: handle PCI BAR accesses Jagannathan Raman
2021-12-16 14:10 ` Stefan Hajnoczi
2021-12-17 19:12 ` Jag Raman
2021-12-15 15:35 ` [PATCH v4 11/14] vfio-user: IOMMU support for remote device Jagannathan Raman
2021-12-16 14:40 ` Stefan Hajnoczi
2021-12-17 20:00 ` Jag Raman
2021-12-20 14:36 ` Stefan Hajnoczi
2021-12-21 4:32 ` Jag Raman
2022-01-06 13:10 ` Stefan Hajnoczi
2021-12-15 15:35 ` [PATCH v4 12/14] vfio-user: handle device interrupts Jagannathan Raman
2021-12-16 15:56 ` Stefan Hajnoczi
2021-12-15 15:35 ` [PATCH v4 13/14] vfio-user: register handlers to facilitate migration Jagannathan Raman
2021-12-15 15:35 ` [PATCH v4 14/14] vfio-user: avocado tests for vfio-user Jagannathan Raman
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=Yd1Po1Wv6T3AELBF@stefanha-x1.localdomain \
--to=stefanha@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=alex.williamson@redhat.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=elena.ufimtseva@oracle.com \
--cc=jag.raman@oracle.com \
--cc=john.g.johnson@oracle.com \
--cc=john.levon@nutanix.com \
--cc=marcandre.lureau@gmail.com \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=swapnil.ingle@nutanix.com \
--cc=thanos.makatos@nutanix.com \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).