From: Greg Kurz <groug@kaod.org>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Fam Zheng <fam@euphon.net>, Kevin Wolf <kwolf@redhat.com>,
qemu-block@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [RFC 3/8] virtio: Add API to batch set host notifiers
Date: Tue, 30 Mar 2021 12:17:40 +0200 [thread overview]
Message-ID: <20210330121740.73825957@bahia.lan> (raw)
In-Reply-To: <YGIKIUIJbkNTfXKC@stefanha-x1.localdomain>
[-- Attachment #1: Type: text/plain, Size: 5517 bytes --]
On Mon, 29 Mar 2021 18:10:57 +0100
Stefan Hajnoczi <stefanha@redhat.com> wrote:
> On Thu, Mar 25, 2021 at 04:07:30PM +0100, Greg Kurz wrote:
> > Introduce VirtioBusClass methods to begin and commit a transaction
> > of setting/unsetting host notifiers. These handlers will be implemented
> > by virtio-pci to batch addition and deletion of ioeventfds for multiqueue
> > devices like virtio-scsi-pci or virtio-blk-pci.
> >
> > Convert virtio_bus_set_host_notifiers() to use these handlers. Note that
> > virtio_bus_cleanup_host_notifier() closes eventfds, which could still be
> > passed to the KVM_IOEVENTFD ioctl() when the transaction ends and fail
> > with EBADF. The cleanup of the host notifiers is thus pushed to a
> > separate loop in virtio_bus_unset_and_cleanup_host_notifiers(), after
> > transaction commit.
> >
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > ---
> > include/hw/virtio/virtio-bus.h | 4 ++++
> > hw/virtio/virtio-bus.c | 34 ++++++++++++++++++++++++++++++++++
> > 2 files changed, 38 insertions(+)
> >
> > diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h
> > index 6d1e4ee3e886..99704b2c090a 100644
> > --- a/include/hw/virtio/virtio-bus.h
> > +++ b/include/hw/virtio/virtio-bus.h
> > @@ -82,6 +82,10 @@ struct VirtioBusClass {
> > */
> > int (*ioeventfd_assign)(DeviceState *d, EventNotifier *notifier,
> > int n, bool assign);
> > +
> > + void (*ioeventfd_assign_begin)(DeviceState *d);
> > + void (*ioeventfd_assign_commit)(DeviceState *d);
>
> Please add doc comments for these new functions.
>
Will do.
> > +
> > /*
> > * Whether queue number n is enabled.
> > */
> > diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
> > index c9e7cdb5c161..156484c4ca14 100644
> > --- a/hw/virtio/virtio-bus.c
> > +++ b/hw/virtio/virtio-bus.c
> > @@ -295,6 +295,28 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign)
> > return r;
> > }
> >
> > +static void virtio_bus_set_host_notifier_begin(VirtioBusState *bus)
> > +{
> > + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
> > + DeviceState *proxy = DEVICE(BUS(bus)->parent);
> > +
> > + if (k->ioeventfd_assign_begin) {
> > + assert(k->ioeventfd_assign_commit);
> > + k->ioeventfd_assign_begin(proxy);
> > + }
> > +}
> > +
> > +static void virtio_bus_set_host_notifier_commit(VirtioBusState *bus)
> > +{
> > + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
> > + DeviceState *proxy = DEVICE(BUS(bus)->parent);
> > +
> > + if (k->ioeventfd_assign_commit) {
> > + assert(k->ioeventfd_assign_begin);
> > + k->ioeventfd_assign_commit(proxy);
> > + }
> > +}
> > +
> > void virtio_bus_cleanup_host_notifier(VirtioBusState *bus, int n)
> > {
> > VirtIODevice *vdev = virtio_bus_get_device(bus);
> > @@ -308,6 +330,7 @@ void virtio_bus_cleanup_host_notifier(VirtioBusState *bus, int n)
> > event_notifier_cleanup(notifier);
> > }
> >
> > +/* virtio_bus_set_host_notifier_begin() must have been called */
> > static void virtio_bus_unset_and_cleanup_host_notifiers(VirtioBusState *bus,
> > int nvqs, int n_offset)
> > {
> > @@ -315,6 +338,10 @@ static void virtio_bus_unset_and_cleanup_host_notifiers(VirtioBusState *bus,
> >
> > for (i = 0; i < nvqs; i++) {
> > virtio_bus_set_host_notifier(bus, i + n_offset, false);
> > + }
> > + /* Let address_space_update_ioeventfds() run before closing ioeventfds */
>
> assert(memory_region_transaction_depth == 0)?
>
Hmm... appart from the fact that memory_region_transaction_depth is
a memory internal thing that shouldn't be exposed here, it seems to
me that memory_region_transaction_depth can be != 0 when, e.g. when
batching is used... or I'm missing something ?
I was actually thinking of adding some asserts for that in the
memory_region_*_eventfd_full() functions introduced by patch 1.
if (!transaction) {
memory_region_transaction_begin();
}
assert(memory_region_transaction_depth != 0);
> > + virtio_bus_set_host_notifier_commit(bus);
> > + for (i = 0; i < nvqs; i++) {
> > virtio_bus_cleanup_host_notifier(bus, i + n_offset);
> > }
> > }
> > @@ -327,17 +354,24 @@ int virtio_bus_set_host_notifiers(VirtioBusState *bus, int nvqs, int n_offset,
> > int rc;
> >
> > if (assign) {
> > + virtio_bus_set_host_notifier_begin(bus);
> > +
> > for (i = 0; i < nvqs; i++) {
> > rc = virtio_bus_set_host_notifier(bus, i + n_offset, true);
> > if (rc != 0) {
> > warn_report_once("%s: Failed to set host notifier (%s).\n",
> > vdev->name, strerror(-rc));
> >
> > + /* This also calls virtio_bus_set_host_notifier_commit() */
> > virtio_bus_unset_and_cleanup_host_notifiers(bus, i, n_offset);
> > return rc;
> > }
> > }
> > +
> > + virtio_bus_set_host_notifier_commit(bus);
> > } else {
> > + virtio_bus_set_host_notifier_begin(bus);
> > + /* This also calls virtio_bus_set_host_notifier_commit() */
> > virtio_bus_unset_and_cleanup_host_notifiers(bus, nvqs, n_offset);
> > }
> >
> > --
> > 2.26.3
> >
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2021-03-30 10:18 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-25 15:07 [RFC 0/8] virtio: Improve boot time of virtio-scsi-pci and virtio-blk-pci Greg Kurz
2021-03-25 15:07 ` [RFC 1/8] memory: Allow eventfd add/del without starting a transaction Greg Kurz
2021-03-29 17:03 ` Stefan Hajnoczi
2021-03-30 7:47 ` Greg Kurz
2021-03-30 10:16 ` Stefan Hajnoczi
2021-03-25 15:07 ` [RFC 2/8] virtio: Introduce virtio_bus_set_host_notifiers() Greg Kurz
2021-03-29 17:06 ` Stefan Hajnoczi
2021-03-25 15:07 ` [RFC 3/8] virtio: Add API to batch set host notifiers Greg Kurz
2021-03-29 17:10 ` Stefan Hajnoczi
2021-03-30 10:17 ` Greg Kurz [this message]
2021-03-30 13:55 ` Stefan Hajnoczi
2021-03-30 14:17 ` Greg Kurz
2021-03-31 14:47 ` Stefan Hajnoczi
2021-03-31 16:21 ` Greg Kurz
2021-03-25 15:07 ` [RFC 4/8] virtio-pci: Batch add/del ioeventfds in a single MR transaction Greg Kurz
2021-03-29 17:24 ` Stefan Hajnoczi
2021-03-30 10:29 ` Greg Kurz
2021-03-25 15:07 ` [RFC 5/8] virtio-blk: Fix rollback path in virtio_blk_data_plane_start() Greg Kurz
2021-03-29 17:25 ` Stefan Hajnoczi
2021-03-25 15:07 ` [RFC 6/8] virtio-blk: Use virtio_bus_set_host_notifiers() Greg Kurz
2021-03-29 17:26 ` Stefan Hajnoczi
2021-03-25 15:07 ` [RFC 7/8] virtio-scsi: Set host notifiers and callbacks separately Greg Kurz
2021-03-25 15:07 ` [RFC 8/8] virtio-scsi: Use virtio_bus_set_host_notifiers() Greg Kurz
2021-03-29 17:28 ` Stefan Hajnoczi
2021-03-25 17:05 ` [RFC 0/8] virtio: Improve boot time of virtio-scsi-pci and virtio-blk-pci Michael S. Tsirkin
2021-03-25 17:43 ` Stefan Hajnoczi
2021-03-25 20:51 ` Greg Kurz
2021-03-25 18:05 ` Greg Kurz
2021-03-29 17:35 ` Stefan Hajnoczi
2021-03-30 13:15 ` Greg Kurz
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=20210330121740.73825957@bahia.lan \
--to=groug@kaod.org \
--cc=david@gibson.dropbear.id.au \
--cc=fam@euphon.net \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@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 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.