From: Alex Williamson <alex.williamson@redhat.com>
To: Eric Auger <eric.auger@redhat.com>
Cc: eric.auger.pro@gmail.com, qemu-devel@nongnu.org,
qemu-arm@nongnu.org, clg@redhat.com, jean-philippe@linaro.org,
mst@redhat.com, pbonzini@redhat.com, peter.maydell@linaro.org,
peterx@redhat.com, david@redhat.com, philmd@linaro.org,
zhenzhong.duan@intel.com, yi.l.liu@intel.com
Subject: Re: [PATCH v3 13/13] vfio: Remove 64-bit IOVA address space assumption
Date: Wed, 18 Oct 2023 15:42:34 -0600 [thread overview]
Message-ID: <20231018154234.4c47801d.alex.williamson@redhat.com> (raw)
In-Reply-To: <20231011175516.541374-14-eric.auger@redhat.com>
On Wed, 11 Oct 2023 19:52:29 +0200
Eric Auger <eric.auger@redhat.com> wrote:
> Now we retrieve the usable IOVA ranges from the host,
> we now the physical IOMMU aperture and we can remove
s/now/use/?
> the assumption of 64b IOVA space when calling
> vfio_host_win_add().
>
> This works fine in general but in case of an IOMMU memory
> region this becomes more tricky. For instance the virtio-iommu
> MR has a 64b aperture by default. If the physical IOMMU has a
> smaller aperture (typically the case for VTD), this means we
> would need to resize the IOMMU MR when this latter is linked
> to a container. However this happens on vfio_listener_region_add()
> when calling the IOMMU MR set_iova_ranges() callback and this
> would mean we would have a recursive call the
> vfio_listener_region_add(). This looks like a wrong usage of
> he memory API causing duplicate IOMMU MR notifier registration
s/he/the/
> for instance.
>
> Until we find a better solution, make sure the vfio_find_hostwin()
> is not called anymore for IOMMU region.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>
> ---
>
> v2 -> v3:
> - take into account the avail IOVA range may not be existing
> - Create as many VFIOHostDMAWindow as valid IOVA ranges
> - rebase on top of vfio-next
>
> I have not found any working solution to the IOMMU MR resizing.
> So I can remove this patch or remove the check for IOMMU MR. Maybe
> this is an issue which can be handled separately?
Am I correct that the only thing we're solving here is the FIXME?
Without this change we assume a 64-bit IOVA address space for the
"hostwin" and the previous patch 03/ already sets the usable IOVA range
for the IOMMU aperture. Kernel code will error on mappings outside of
the usable IOVA ranges regardless, so at best we're making the failure
occur earlier in QEMU rather than at the time of the DMA mapping.
I think the FIXME comment had assumed the hostwin support would be more
universal, but perhaps we're just doubling down on a relic of SPAPR
support that we can safely ignore, and at some point remove. It really
seems to serve the same purpose as the new iova_ranges and if it were
worthwhile to fail the range in QEMU before trying to map it in the
kernel, we could test it against iova_ranges directly.
Unless this serves some purpose that I'm not spotting, maybe we should
drop this patch, consider hostwin to be SPAPR specific, and avoid
further entanglements with it here so that it can be more easily
removed. Thanks,
Alex
> ---
> hw/vfio/common.c | 14 +++++++-------
> hw/vfio/container.c | 23 +++++++++++++++++------
> 2 files changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index 9d804152ba..1447b6fdc4 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -654,13 +654,6 @@ static void vfio_listener_region_add(MemoryListener *listener,
> goto fail;
> }
>
> - hostwin = vfio_find_hostwin(container, iova, end);
> - if (!hostwin) {
> - error_setg(&err, "Container %p can't map guest IOVA region"
> - " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, container, iova, end);
> - goto fail;
> - }
> -
> memory_region_ref(section->mr);
>
> if (memory_region_is_iommu(section->mr)) {
> @@ -720,6 +713,13 @@ static void vfio_listener_region_add(MemoryListener *listener,
> return;
> }
>
> + hostwin = vfio_find_hostwin(container, iova, end);
> + if (!hostwin) {
> + error_setg(&err, "Container %p can't map guest IOVA region"
> + " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, container, iova, end);
> + goto fail;
> + }
> +
> /* Here we assume that memory_region_is_ram(section->mr)==true */
>
> /*
> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
> index 5122ff6d92..eb9d962881 100644
> --- a/hw/vfio/container.c
> +++ b/hw/vfio/container.c
> @@ -693,12 +693,23 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
> vfio_get_iommu_info_migration(container, info);
> g_free(info);
>
> - /*
> - * FIXME: We should parse VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE
> - * information to get the actual window extent rather than assume
> - * a 64-bit IOVA address space.
> - */
> - vfio_host_win_add(container, 0, (hwaddr)-1, container->pgsizes);
> + if (container->nr_iovas == -1) {
> + /*
> + * no available info on usable IOVA ranges,
> + * assume 64b IOVA space
> + */
> + vfio_host_win_add(container, 0, (hwaddr)-1, container->pgsizes);
> + } else {
> + GList *l;
> +
> + g_assert(container->nr_iovas);
> + for (l = container->iova_ranges; l; l = l->next) {
> + Range *r = l->data;
> +
> + vfio_host_win_add(container, range_lob(r), range_upb(r),
> + container->pgsizes);
> + }
> + }
>
> break;
> }
next prev parent reply other threads:[~2023-10-18 21:43 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-11 17:52 [PATCH v3 00/13] VIRTIO-IOMMU/VFIO: Don't assume 64b IOVA space Eric Auger
2023-10-11 17:52 ` [PATCH v3 01/13] memory: Let ReservedRegion use Range Eric Auger
2023-10-11 17:52 ` [PATCH v3 02/13] memory: Introduce memory_region_iommu_set_iova_ranges Eric Auger
2023-10-18 22:07 ` Peter Xu
2023-10-11 17:52 ` [PATCH v3 03/13] vfio: Collect container iova range info Eric Auger
2023-10-18 19:07 ` Alex Williamson
2023-10-19 6:39 ` Eric Auger
2023-10-11 17:52 ` [PATCH v3 04/13] virtio-iommu: Rename reserved_regions into prop_resv_regions Eric Auger
2023-10-11 17:52 ` [PATCH v3 05/13] range: Make range_compare() public Eric Auger
2023-10-11 17:52 ` [PATCH v3 06/13] util/reserved-region: Add new ReservedRegion helpers Eric Auger
2023-10-11 17:52 ` [PATCH v3 07/13] virtio-iommu: Introduce per IOMMUDevice reserved regions Eric Auger
2023-10-11 17:52 ` [PATCH v3 08/13] range: Introduce range_inverse_array() Eric Auger
2023-10-11 17:52 ` [PATCH v3 09/13] virtio-iommu: Record whether a probe request has been issued Eric Auger
2023-10-11 17:52 ` [PATCH v3 10/13] virtio-iommu: Implement set_iova_ranges() callback Eric Auger
2023-10-11 17:52 ` [PATCH v3 11/13] virtio-iommu: Consolidate host reserved regions and property set ones Eric Auger
2023-10-11 17:52 ` [PATCH v3 12/13] test: Add some tests for range and resv-mem helpers Eric Auger
2023-10-30 7:48 ` Cédric Le Goater
2023-10-11 17:52 ` [PATCH v3 13/13] vfio: Remove 64-bit IOVA address space assumption Eric Auger
2023-10-18 21:42 ` Alex Williamson [this message]
2023-10-19 6:37 ` Eric Auger
2023-10-18 13:37 ` [PATCH v3 00/13] VIRTIO-IOMMU/VFIO: Don't assume 64b IOVA space Michael S. Tsirkin
2023-10-19 9:07 ` YangHang Liu
2023-10-19 9:08 ` Eric Auger
2023-10-19 11:07 ` Cédric Le Goater
2023-10-19 11:20 ` Michael S. Tsirkin
2023-10-19 13:51 ` Eric Auger
2023-10-19 17:40 ` Cédric Le Goater
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=20231018154234.4c47801d.alex.williamson@redhat.com \
--to=alex.williamson@redhat.com \
--cc=clg@redhat.com \
--cc=david@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=eric.auger@redhat.com \
--cc=jean-philippe@linaro.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=yi.l.liu@intel.com \
--cc=zhenzhong.duan@intel.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).