Linux KVM/arm64 development list
 help / color / mirror / Atom feed
From: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
To: Auger Eric <eric.auger@redhat.com>,
	"iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>,
	"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"virtualization@lists.linux-foundation.org"
	<virtualization@lists.linux-foundation.org>,
	"virtio-dev@lists.oasis-open.org"
	<virtio-dev@lists.oasis-open.org>,
	"joro@8bytes.org" <joro@8bytes.org>,
	"mst@redhat.com" <mst@redhat.com>
Cc: Mark Rutland <Mark.Rutland@arm.com>,
	Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
	"tnowicki@caviumnetworks.com" <tnowicki@caviumnetworks.com>,
	Marc Zyngier <Marc.Zyngier@arm.com>,
	Robin Murphy <Robin.Murphy@arm.com>,
	Will Deacon <Will.Deacon@arm.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"bhelgaas@google.com" <bhelgaas@google.com>,
	"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>
Subject: Re: Re: [PATCH v4 5/7] iommu: Add virtio-iommu driver
Date: Tue, 20 Nov 2018 17:30:45 +0000	[thread overview]
Message-ID: <6d003fde-9574-0ff9-0bf8-7901d1a4aa5c@arm.com> (raw)
In-Reply-To: <41460260-417b-762f-f007-ccfd5ac1e8a5@arm.com>

On 16/11/2018 18:46, Jean-Philippe Brucker 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)
>> I don't get "len >= write_len". Is it valid for the device to write more
>> than write_len? If it writes less than write_len, the status is not set,
>> is it?

Actually, len could well be three bytes smaller than write_len. The spec
doesn't require the device to write the three padding bytes in
virtio_iommu_req_tail, after the status byte.

Here the driver just assumes that the device wrote the reserved field.
The QEMU device seems to write uninitialized data in there...

Any objection to changing the spec to require the device to initialize
those bytes to zero? I think it makes things nicer overall and shouldn't
have any performance impact.

[...]
>>> +static struct iommu_domain *viommu_domain_alloc(unsigned type)
>>> +{
>>> +	struct viommu_domain *vdomain;
>>> +
>>> +	if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
>> smmu drivers also support the IDENTITY type. Don't we want to support it
>> as well?
> 
> Eventually yes. The IDENTITY domain is useful when an IOMMU has been
> forced upon you and gets in the way of performance, in which case you
> get rid of it with CONFIG_IOMMU_DEFAULT_PASSTHROUGH=y or
> iommu.passthrough=y. For virtio-iommu though, you could simply not
> instantiate the device.
> 
> I don't think it's difficult to add: if the device supports
> VIRTIO_IOMMU_F_BYPASS, then we simply don't send an ATTACH request.
> Otherwise after ATTACH we send a MAP for the whole input range. If the
> change isn't bigger than this, I'll add it to v5.

Not as straightforward as I hoped, when the device doesn't support
VIRTIO_IOMMU_F_BYPASS:

* We can't simply create an ID map for the whole input range, we need to
carve out the resv_mem regions.

* For a VFIO device, the host has no way of forwarding the identity
mapping. For example the guest will attempt to map [0; 0xffffffffffff]
-> [0; 0xffffffffffff], but VFIO only allows to map RAM and cannot take
such request. One solution is to only create ID mapping for RAM, and
register a notifier for memory hotplug, like intel-iommu does for IOMMUs
that don't support HW pass-through.

Since it's not completely trivial and - I think - not urgent, I'll leave
this for later.

Thanks,
Jean

  reply	other threads:[~2018-11-20 17:30 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-15 16:52 [PATCH v4 0/7] Add virtio-iommu driver Jean-Philippe Brucker
2018-11-15 16:52 ` [PATCH v4 1/7] dt-bindings: virtio-mmio: Add IOMMU description Jean-Philippe Brucker
2018-11-15 16:52 ` [PATCH v4 2/7] dt-bindings: virtio: Add virtio-pci-iommu node Jean-Philippe Brucker
2018-11-15 16:52 ` [PATCH v4 3/7] of: Allow the iommu-map property to omit untranslated devices Jean-Philippe Brucker
     [not found]   ` <20181115165234.43990-4-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-11-16 23:26     ` Rob Herring
2018-11-15 16:52 ` [PATCH v4 4/7] PCI: OF: Initialize dev->fwnode appropriately Jean-Philippe Brucker
2018-11-15 16:52 ` [PATCH v4 5/7] iommu: Add virtio-iommu driver Jean-Philippe Brucker
2018-11-16  6:08   ` Auger Eric
2018-11-16 18:46     ` Jean-Philippe Brucker
2018-11-20 17:30       ` Jean-Philippe Brucker [this message]
2018-11-21 12:21         ` Auger Eric
2018-11-15 16:52 ` [PATCH v4 6/7] iommu/virtio: Add probe request Jean-Philippe Brucker
2018-11-16  8:56   ` Auger Eric
2018-11-15 16:52 ` [PATCH v4 7/7] iommu/virtio: Add event queue Jean-Philippe Brucker
2018-11-16  6:40   ` Auger Eric
2018-11-16 13:00 ` [PATCH v4 0/7] Add virtio-iommu driver 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=6d003fde-9574-0ff9-0bf8-7901d1a4aa5c@arm.com \
    --to=jean-philippe.brucker@arm.com \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=Marc.Zyngier@arm.com \
    --cc=Mark.Rutland@arm.com \
    --cc=Robin.Murphy@arm.com \
    --cc=Will.Deacon@arm.com \
    --cc=bhelgaas@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=eric.auger@redhat.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-pci@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=robh+dt@kernel.org \
    --cc=tnowicki@caviumnetworks.com \
    --cc=virtio-dev@lists.oasis-open.org \
    --cc=virtualization@lists.linux-foundation.org \
    /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