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
Subject: Re: [PATCH v2 03/12] vfio: Collect container iova range info
Date: Tue, 19 Sep 2023 09:44:28 -0600 [thread overview]
Message-ID: <20230919094428.2cedaa30.alex.williamson@redhat.com> (raw)
In-Reply-To: <20230913080423.523953-4-eric.auger@redhat.com>
On Wed, 13 Sep 2023 10:01:38 +0200
Eric Auger <eric.auger@redhat.com> wrote:
> Collect iova range information if VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE
> capability is supported.
>
> This allows to propagate the information though the IOMMU MR
> set_iova_ranges() callback so that virtual IOMMUs
> get aware of those aperture constraints.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> ---
> include/hw/vfio/vfio-common.h | 2 ++
> hw/vfio/common.c | 45 +++++++++++++++++++++++++++++++++--
> 2 files changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index da43d27352..74b9b27270 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -98,6 +98,8 @@ typedef struct VFIOContainer {
> QLIST_HEAD(, VFIOGroup) group_list;
> QLIST_HEAD(, VFIORamDiscardListener) vrdl_list;
> QLIST_ENTRY(VFIOContainer) next;
> + unsigned nr_iovas;
> + struct vfio_iova_range *iova_ranges;
> } VFIOContainer;
>
> typedef struct VFIOGuestIOMMU {
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index 9aac21abb7..26da38de05 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -1157,6 +1157,14 @@ static void vfio_listener_region_add(MemoryListener *listener,
> goto fail;
> }
>
> + ret = memory_region_iommu_set_iova_ranges(giommu->iommu_mr,
> + container->nr_iovas, (struct Range *)container->iova_ranges,
> + &err);
The semantics of calling this with nr_iovas == 0 and the vIOMMU driver
ignoring that it's being told there are no usable iova ranges is rather
strange. Should nr_iovas be initialized to -1 for that or should this
call be conditional on non-zero nr_iovas?
Also, vfio_get_info_iova_range() is only called in the type1 container
path and the IOVA range info capability has only existed since kernel
v5.4. So we need to do something sane even if we don't have the kernel
telling us about the IOVA ranges. I think this precludes the assert in
the final patch of the series or else new QEMU on an old kernel is
broken.
> + if (ret) {
> + g_free(giommu);
> + goto fail;
> + }
> +
> ret = memory_region_register_iommu_notifier(section->mr, &giommu->n,
> &err);
> if (ret) {
> @@ -1981,6 +1989,29 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
> return true;
> }
>
> +static void vfio_get_info_iova_range(struct vfio_iommu_type1_info *info,
> + unsigned int *nr_iovas,
> + struct vfio_iova_range **iova_ranges)
Just pass the VFIOContainer pointer? Thanks,
Alex
> +{
> + struct vfio_info_cap_header *hdr;
> + struct vfio_iommu_type1_info_cap_iova_range *cap;
> +
> + hdr = vfio_get_iommu_type1_info_cap(info,
> + VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE);
> + if (hdr == NULL) {
> + return;
> + }
> +
> + cap = (void *)hdr;
> + *nr_iovas = cap->nr_iovas;
> +
> + if (*nr_iovas == 0) {
> + return;
> + }
> + *iova_ranges = g_memdup2(cap->iova_ranges,
> + *nr_iovas * sizeof(struct vfio_iova_range));
> +}
> +
> static int vfio_setup_region_sparse_mmaps(VFIORegion *region,
> struct vfio_region_info *info)
> {
> @@ -2433,6 +2464,12 @@ static void vfio_get_iommu_info_migration(VFIOContainer *container,
> }
> }
>
> +static void vfio_free_container(VFIOContainer *container)
> +{
> + g_free(container->iova_ranges);
> + g_free(container);
> +}
> +
> static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
> Error **errp)
> {
> @@ -2550,6 +2587,10 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
> if (!vfio_get_info_dma_avail(info, &container->dma_max_mappings)) {
> container->dma_max_mappings = 65535;
> }
> +
> + vfio_get_info_iova_range(info, &container->nr_iovas,
> + &container->iova_ranges);
> +
> vfio_get_iommu_info_migration(container, info);
> g_free(info);
>
> @@ -2663,7 +2704,7 @@ enable_discards_exit:
> vfio_ram_block_discard_disable(container, false);
>
> free_container_exit:
> - g_free(container);
> + vfio_free_container(container);
>
> close_fd_exit:
> close(fd);
> @@ -2717,7 +2758,7 @@ static void vfio_disconnect_container(VFIOGroup *group)
>
> trace_vfio_disconnect_container(container->fd);
> close(container->fd);
> - g_free(container);
> + vfio_free_container(container);
>
> vfio_put_address_space(space);
> }
next prev parent reply other threads:[~2023-09-19 15:45 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-13 8:01 [PATCH v2 00/12] VIRTIO-IOMMU/VFIO: Don't assume 64b IOVA space Eric Auger
2023-09-13 8:01 ` [PATCH v2 01/12] memory: Let ReservedRegion use Range Eric Auger
2023-09-13 12:43 ` Cédric Le Goater
2023-09-13 8:01 ` [PATCH v2 02/12] memory: Introduce memory_region_iommu_set_iova_ranges Eric Auger
2023-09-13 12:43 ` Cédric Le Goater
2023-09-20 7:40 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 03/12] vfio: Collect container iova range info Eric Auger
2023-09-13 12:55 ` Cédric Le Goater
2023-09-20 7:38 ` Eric Auger
2023-09-19 15:44 ` Alex Williamson [this message]
2023-09-20 7:15 ` Eric Auger
2023-09-20 7:39 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 04/12] virtio-iommu: Rename reserved_regions into prop_resv_regions Eric Auger
2023-09-13 13:01 ` Cédric Le Goater
2023-09-13 8:01 ` [PATCH v2 05/12] virtio-iommu: Introduce per IOMMUDevice reserved regions Eric Auger
2023-09-29 15:52 ` Jean-Philippe Brucker
2023-10-03 15:48 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 06/12] range: Introduce range_inverse_array() Eric Auger
2023-09-19 16:29 ` Alex Williamson
2023-09-20 7:24 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 07/12] virtio-iommu: Implement set_iova_ranges() callback Eric Auger
2023-09-29 16:15 ` Jean-Philippe Brucker
2023-10-10 14:36 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 08/12] range: Make range_compare() public Eric Auger
2023-09-13 8:01 ` [PATCH v2 09/12] util/reserved-region: Add new ReservedRegion helpers Eric Auger
2023-09-29 16:16 ` Jean-Philippe Brucker
2023-10-10 13:51 ` Eric Auger
2023-09-13 8:01 ` [PATCH v2 10/12] virtio-iommu: Consolidate host reserved regions and property set ones Eric Auger
2023-09-13 8:01 ` [PATCH v2 11/12] test: Add some tests for range and resv-mem helpers Eric Auger
2023-09-13 8:01 ` [PATCH v2 12/12] vfio: Remove 64-bit IOVA address space assumption Eric Auger
2023-09-19 17:22 ` Alex Williamson
2023-09-20 7:28 ` Eric Auger
2023-09-26 20:00 ` Eric Auger
2023-10-10 17:16 ` Eric Auger
2023-09-20 20:02 ` Alex Williamson
2023-10-11 17:32 ` Eric Auger
2023-09-26 8:06 ` [PATCH v2 00/12] VIRTIO-IOMMU/VFIO: Don't assume 64b IOVA space YangHang Liu
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=20230919094428.2cedaa30.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 \
/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).