From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Cc: mark.rutland@arm.com, virtio-dev@lists.oasis-open.org,
lorenzo.pieralisi@arm.com, tnowicki@caviumnetworks.com,
devicetree@vger.kernel.org, marc.zyngier@arm.com,
linux-pci@vger.kernel.org, joro@8bytes.org, will.deacon@arm.com,
virtualization@lists.linux-foundation.org, eric.auger@redhat.com,
iommu@lists.linux-foundation.org, robh+dt@kernel.org,
bhelgaas@google.com, robin.murphy@arm.com,
kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH v5 5/7] iommu: Add virtio-iommu driver
Date: Tue, 27 Nov 2018 13:04:08 -0500 [thread overview]
Message-ID: <20181127125424-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <fd221210-7e12-1d15-0c80-52a761f6893d@arm.com>
On Tue, Nov 27, 2018 at 05:50:50PM +0000, Jean-Philippe Brucker wrote:
> On 23/11/2018 22:02, Michael S. Tsirkin wrote:
> >> +/*
> >> + * __viommu_sync_req - Complete all in-flight requests
> >> + *
> >> + * Wait for all added requests to complete. When this function returns, all
> >> + * requests that were in-flight at the time of the call have completed.
> >> + */
> >> +static int __viommu_sync_req(struct viommu_dev *viommu)
> >> +{
> >> + int ret = 0;
> >> + unsigned int len;
> >> + size_t write_len;
> >> + struct viommu_request *req;
> >> + struct virtqueue *vq = viommu->vqs[VIOMMU_REQUEST_VQ];
> >> +
> >> + assert_spin_locked(&viommu->request_lock);
> >> +
> >> + virtqueue_kick(vq);
> >> +
> >> + while (!list_empty(&viommu->requests)) {
> >> + len = 0;
> >> + req = virtqueue_get_buf(vq, &len);
> >> + if (!req)
> >> + continue;
> >> +
> >> + if (!len)
> >> + viommu_set_req_status(req->buf, req->len,
> >> + VIRTIO_IOMMU_S_IOERR);
> >> +
> >> + write_len = req->len - req->write_offset;
> >> + if (req->writeback && len == write_len)
> >> + memcpy(req->writeback, req->buf + req->write_offset,
> >> + write_len);
> >> +
> >> + list_del(&req->list);
> >> + kfree(req);
> >> + }
> >
> > I didn't notice this in the past but it seems this will spin
> > with interrupts disabled until host handles the request.
> > Please do not do this - host execution can be another
> > task that needs the same host CPU. This will then disable
> > interrupts for a very very long time.
>
> In the guest yes, but that doesn't prevent the host from running another
> task right?
Doesn't prevent it but it will delay it significantly
until scheduler decides to kick the VCPU task out.
> My tests run fine when QEMU is bound to a single CPU, even
> though vcpu and viommu run in different threads
>
> > What to do then? Queue in software and wake up task.
>
> Unfortunately I can't do anything here, because IOMMU drivers can't
> sleep in the iommu_map() or iommu_unmap() path.
>
> The problem is the same
> for all IOMMU drivers. That's because the DMA API allows drivers to call
> some functions with interrupts disabled. For example
> Documentation/DMA-API-HOWTO.txt allows dma_alloc_coherent() and
> dma_unmap_single() to be called in interrupt context.
In fact I don't really understand how it's supposed to
work at all: you only sync when ring is full.
So host may not have seen your map request if ring
is not full.
Why is it safe to use the address with a device then?
> > As kick is vm exit, kick under interrupts disabled is discouraged too:
> > better to prepare for kick enable interrupts then kick.
>
> That was on my list of things to look at, because it could relax
> things for device drivers that don't call us with interrupts disabled. I
> just tried it and I can see some performance improvement (7% and 4% on
> tcp_stream and tcp_maerts respectively, +/-2.5%).
>
> Since it's an optimization I'll leave it for later (ACPI and module
> support is higher on my list). The resulting change is complicated
> because we now need to deal with threads adding new requests while
> sync() is running. With my current prototype one thread could end up
> staying in sync() while other threads add new async requests, so I need
> to find a way to bound it.
>
> Thanks,
> Jean
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Cc: mark.rutland@arm.com, virtio-dev@lists.oasis-open.org,
lorenzo.pieralisi@arm.com, tnowicki@caviumnetworks.com,
devicetree@vger.kernel.org, marc.zyngier@arm.com,
linux-pci@vger.kernel.org, joro@8bytes.org, will.deacon@arm.com,
virtualization@lists.linux-foundation.org, eric.auger@redhat.com,
iommu@lists.linux-foundation.org, robh+dt@kernel.org,
bhelgaas@google.com, robin.murphy@arm.com,
kvmarm@lists.cs.columbia.edu
Subject: [virtio-dev] Re: [PATCH v5 5/7] iommu: Add virtio-iommu driver
Date: Tue, 27 Nov 2018 13:04:08 -0500 [thread overview]
Message-ID: <20181127125424-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <fd221210-7e12-1d15-0c80-52a761f6893d@arm.com>
On Tue, Nov 27, 2018 at 05:50:50PM +0000, Jean-Philippe Brucker wrote:
> On 23/11/2018 22:02, Michael S. Tsirkin wrote:
> >> +/*
> >> + * __viommu_sync_req - Complete all in-flight requests
> >> + *
> >> + * Wait for all added requests to complete. When this function returns, all
> >> + * requests that were in-flight at the time of the call have completed.
> >> + */
> >> +static int __viommu_sync_req(struct viommu_dev *viommu)
> >> +{
> >> + int ret = 0;
> >> + unsigned int len;
> >> + size_t write_len;
> >> + struct viommu_request *req;
> >> + struct virtqueue *vq = viommu->vqs[VIOMMU_REQUEST_VQ];
> >> +
> >> + assert_spin_locked(&viommu->request_lock);
> >> +
> >> + virtqueue_kick(vq);
> >> +
> >> + while (!list_empty(&viommu->requests)) {
> >> + len = 0;
> >> + req = virtqueue_get_buf(vq, &len);
> >> + if (!req)
> >> + continue;
> >> +
> >> + if (!len)
> >> + viommu_set_req_status(req->buf, req->len,
> >> + VIRTIO_IOMMU_S_IOERR);
> >> +
> >> + write_len = req->len - req->write_offset;
> >> + if (req->writeback && len == write_len)
> >> + memcpy(req->writeback, req->buf + req->write_offset,
> >> + write_len);
> >> +
> >> + list_del(&req->list);
> >> + kfree(req);
> >> + }
> >
> > I didn't notice this in the past but it seems this will spin
> > with interrupts disabled until host handles the request.
> > Please do not do this - host execution can be another
> > task that needs the same host CPU. This will then disable
> > interrupts for a very very long time.
>
> In the guest yes, but that doesn't prevent the host from running another
> task right?
Doesn't prevent it but it will delay it significantly
until scheduler decides to kick the VCPU task out.
> My tests run fine when QEMU is bound to a single CPU, even
> though vcpu and viommu run in different threads
>
> > What to do then? Queue in software and wake up task.
>
> Unfortunately I can't do anything here, because IOMMU drivers can't
> sleep in the iommu_map() or iommu_unmap() path.
>
> The problem is the same
> for all IOMMU drivers. That's because the DMA API allows drivers to call
> some functions with interrupts disabled. For example
> Documentation/DMA-API-HOWTO.txt allows dma_alloc_coherent() and
> dma_unmap_single() to be called in interrupt context.
In fact I don't really understand how it's supposed to
work at all: you only sync when ring is full.
So host may not have seen your map request if ring
is not full.
Why is it safe to use the address with a device then?
> > As kick is vm exit, kick under interrupts disabled is discouraged too:
> > better to prepare for kick enable interrupts then kick.
>
> That was on my list of things to look at, because it could relax
> things for device drivers that don't call us with interrupts disabled. I
> just tried it and I can see some performance improvement (7% and 4% on
> tcp_stream and tcp_maerts respectively, +/-2.5%).
>
> Since it's an optimization I'll leave it for later (ACPI and module
> support is higher on my list). The resulting change is complicated
> because we now need to deal with threads adding new requests while
> sync() is running. With my current prototype one thread could end up
> staying in sync() while other threads add new async requests, so I need
> to find a way to bound it.
>
> Thanks,
> Jean
---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
next prev parent reply other threads:[~2018-11-27 18:04 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-22 19:37 [PATCH v5 0/7] Add virtio-iommu driver Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:37 ` [PATCH v5 1/7] dt-bindings: virtio-mmio: Add IOMMU description Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:37 ` Jean-Philippe Brucker
2018-11-22 19:37 ` [PATCH v5 2/7] dt-bindings: virtio: Add virtio-pci-iommu node Jean-Philippe Brucker
2018-11-22 19:37 ` Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:37 ` [PATCH v5 3/7] of: Allow the iommu-map property to omit untranslated devices Jean-Philippe Brucker
2018-11-22 19:37 ` Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:37 ` [PATCH v5 4/7] PCI: OF: Initialize dev->fwnode appropriately Jean-Philippe Brucker
2018-11-22 19:37 ` Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:37 ` [PATCH v5 5/7] iommu: Add virtio-iommu driver Jean-Philippe Brucker
2018-11-22 19:37 ` [virtio-dev] " Jean-Philippe Brucker
[not found] ` <20181122193801.50510-6-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-11-23 8:27 ` Auger Eric
2018-11-23 8:27 ` [virtio-dev] " Auger Eric
2018-11-23 8:27 ` Auger Eric
2018-11-23 8:27 ` Auger Eric
2018-11-23 21:48 ` Michael S. Tsirkin
2018-11-23 21:48 ` Michael S. Tsirkin
2018-11-23 21:48 ` [virtio-dev] " Michael S. Tsirkin
2018-11-23 21:48 ` Michael S. Tsirkin
2018-11-27 17:58 ` Jean-Philippe Brucker
2018-11-27 17:58 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-27 18:10 ` Michael S. Tsirkin
2018-11-27 18:10 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 18:10 ` Michael S. Tsirkin
2018-11-27 17:58 ` Jean-Philippe Brucker
2018-11-23 21:56 ` Michael S. Tsirkin
2018-11-23 21:56 ` Michael S. Tsirkin
2018-11-23 21:56 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 17:55 ` Jean-Philippe Brucker
2018-11-27 17:55 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-27 18:10 ` Michael S. Tsirkin
2018-11-27 18:10 ` Michael S. Tsirkin
2018-11-27 18:10 ` [virtio-dev] " Michael S. Tsirkin
2018-12-07 18:52 ` Jean-Philippe Brucker
2018-12-07 18:52 ` Jean-Philippe Brucker
2018-12-07 18:52 ` [virtio-dev] " Jean-Philippe Brucker
2018-12-07 18:52 ` Jean-Philippe Brucker
2018-12-12 14:56 ` Michael S. Tsirkin
[not found] ` <e1dde79c-0bc4-ea99-1bb0-9e70b56955fb-5wv7dgnIgG8@public.gmane.org>
2018-12-12 14:56 ` Michael S. Tsirkin
2018-12-12 14:56 ` Michael S. Tsirkin
2018-12-12 14:56 ` Michael S. Tsirkin
2018-12-12 15:27 ` Auger Eric
[not found] ` <20181212093709-mutt-send-email-mst-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2018-12-12 15:27 ` Auger Eric
2018-12-12 15:27 ` Auger Eric
2018-12-12 15:27 ` Auger Eric
2018-12-13 12:37 ` Robin Murphy
2018-12-13 12:37 ` Robin Murphy
2018-12-13 12:37 ` Robin Murphy
2018-12-13 14:13 ` Auger Eric
2018-12-13 14:13 ` [virtio-dev] " Auger Eric
2018-12-13 14:13 ` Auger Eric
2018-12-13 14:13 ` Auger Eric
2018-11-27 17:55 ` Jean-Philippe Brucker
2018-11-23 22:02 ` Michael S. Tsirkin
2018-11-23 22:02 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 17:50 ` Jean-Philippe Brucker
2018-11-27 17:50 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-27 18:04 ` Michael S. Tsirkin [this message]
2018-11-27 18:04 ` Michael S. Tsirkin
2018-11-27 18:10 ` Jean-Philippe Brucker
2018-11-27 18:10 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-27 18:53 ` Michael S. Tsirkin
2018-11-27 18:53 ` [virtio-dev] " Michael S. Tsirkin
2018-12-10 15:06 ` Jean-Philippe Brucker
2018-12-10 15:06 ` Jean-Philippe Brucker
2018-12-10 15:06 ` [virtio-dev] " Jean-Philippe Brucker
2018-12-10 22:53 ` Michael S. Tsirkin
2018-12-10 22:53 ` Michael S. Tsirkin
2018-12-10 22:53 ` [virtio-dev] " Michael S. Tsirkin
[not found] ` <20181210175132-mutt-send-email-mst-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2018-12-11 16:29 ` Jean-Philippe Brucker
2018-12-11 16:29 ` [virtio-dev] " Jean-Philippe Brucker
2018-12-11 16:29 ` Jean-Philippe Brucker
2018-12-11 16:29 ` Jean-Philippe Brucker
2018-11-27 18:53 ` Michael S. Tsirkin
2018-11-27 18:10 ` Jean-Philippe Brucker
2018-11-27 18:13 ` Michael S. Tsirkin
2018-11-27 18:13 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 18:13 ` Michael S. Tsirkin
2018-11-27 17:50 ` Jean-Philippe Brucker
2018-11-23 22:02 ` Michael S. Tsirkin
2018-11-22 19:37 ` Jean-Philippe Brucker
2018-11-22 19:38 ` [PATCH v5 6/7] iommu/virtio: Add probe request Jean-Philippe Brucker
2018-11-22 19:38 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-22 19:38 ` Jean-Philippe Brucker
2018-11-22 19:38 ` [PATCH v5 7/7] iommu/virtio: Add event queue Jean-Philippe Brucker
2018-11-22 19:38 ` Jean-Philippe Brucker
2018-11-22 19:38 ` [virtio-dev] " Jean-Philippe Brucker
2018-11-23 8:28 ` [PATCH v5 0/7] Add virtio-iommu driver Auger Eric
2018-11-23 8:28 ` Auger Eric
2018-11-23 8:28 ` [virtio-dev] " Auger Eric
2018-11-27 7:09 ` Bharat Bhushan
2018-11-27 7:09 ` [virtio-dev] " Bharat Bhushan
2018-11-27 7:09 ` Bharat Bhushan
2018-11-27 16:53 ` Michael S. Tsirkin
[not found] ` <20181122193801.50510-1-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-11-27 16:53 ` Michael S. Tsirkin
2018-11-27 16:53 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 16:53 ` Michael S. Tsirkin
2018-11-27 17:09 ` Auger Eric
2018-11-27 17:09 ` Auger Eric
2018-11-27 17:09 ` [virtio-dev] " Auger Eric
2018-11-27 17:16 ` Michael S. Tsirkin
[not found] ` <6c061729-c404-ac25-f86f-7fe222bf5bc7-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2018-11-27 17:16 ` Michael S. Tsirkin
2018-11-27 17:16 ` [virtio-dev] " Michael S. Tsirkin
2018-11-27 17:16 ` Michael S. Tsirkin
2018-11-27 18:02 ` Auger Eric
2018-11-27 18:02 ` Auger Eric
2018-11-27 18:02 ` [virtio-dev] " Auger Eric
2018-12-03 13:27 ` Auger Eric
2018-12-03 13:27 ` Auger Eric
2018-12-03 13:27 ` [virtio-dev] " Auger Eric
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=20181127125424-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=bhelgaas@google.com \
--cc=devicetree@vger.kernel.org \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jean-philippe.brucker@arm.com \
--cc=joro@8bytes.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-pci@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=marc.zyngier@arm.com \
--cc=mark.rutland@arm.com \
--cc=robh+dt@kernel.org \
--cc=robin.murphy@arm.com \
--cc=tnowicki@caviumnetworks.com \
--cc=virtio-dev@lists.oasis-open.org \
--cc=virtualization@lists.linux-foundation.org \
--cc=will.deacon@arm.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.