Message ID | 20230904080451.424731-3-eric.auger@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | VIRTIO-IOMMU/VFIO: Don't assume 64b IOVA space | expand |
On Mon, Sep 04, 2023 at 10:03:45AM +0200, Eric Auger wrote: > This helper will allow to convey information about valid > IOVA ranges to virtual IOMMUS. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com>
On 04.09.23 10:03, Eric Auger wrote: > This helper will allow to convey information about valid > IOVA ranges to virtual IOMMUS. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > --- > include/exec/memory.h | 26 ++++++++++++++++++++++++++ > softmmu/memory.c | 15 +++++++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index 184cb3a01b..f6fb99dd3f 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -519,6 +519,27 @@ struct IOMMUMemoryRegionClass { > int (*iommu_set_page_size_mask)(IOMMUMemoryRegion *iommu, > uint64_t page_size_mask, > Error **errp); > + /** > + * @iommu_set_iova_ranges: > + * > + * Propagate information about the usable IOVA ranges for a given IOMMU > + * memory region. Used for example to propagate host physical device > + * reserved memory region constraints to the virtual IOMMU. > + * > + * Optional method: if this method is not provided, then the default IOVA > + * aperture is used. > + * > + * @nr_ranges: number of IOVA ranges > + * > + * @iova_ranges: an array of @nr_ranges usable IOVA ranges > + * > + * Returns 0 on success, or a negative error. In case of failure, the error > + * object must be created. > + */ > + int (*iommu_set_iova_ranges)(IOMMUMemoryRegion *iommu, > + uint32_t nr_ranges, > + struct Range *iova_ranges, > + Error **errp); > }; > > typedef struct RamDiscardListener RamDiscardListener; > @@ -1845,6 +1866,11 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, > uint64_t page_size_mask, > Error **errp); > > +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu, > + uint32_t nr_ranges, > + struct Range *iova_ranges, > + Error **errp); > + > /** > * memory_region_name: get a memory region's name > * > diff --git a/softmmu/memory.c b/softmmu/memory.c > index 7d9494ce70..07499457aa 100644 > --- a/softmmu/memory.c > +++ b/softmmu/memory.c > @@ -1905,6 +1905,21 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, > return ret; > } > > +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu_mr, > + uint32_t nr_ranges, > + struct Range *iova_ranges, > + Error **errp) > +{ > + IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr); > + int ret = 0; > + > + if (imrc->iommu_set_iova_ranges) { > + ret = imrc->iommu_set_iova_ranges(iommu_mr, nr_ranges, > + iova_ranges, errp); > + } > + return ret; > +} > + > int memory_region_register_iommu_notifier(MemoryRegion *mr, > IOMMUNotifier *n, Error **errp) > { Reviewed-by: David Hildenbrand <david@redhat.com>
diff --git a/include/exec/memory.h b/include/exec/memory.h index 184cb3a01b..f6fb99dd3f 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -519,6 +519,27 @@ struct IOMMUMemoryRegionClass { int (*iommu_set_page_size_mask)(IOMMUMemoryRegion *iommu, uint64_t page_size_mask, Error **errp); + /** + * @iommu_set_iova_ranges: + * + * Propagate information about the usable IOVA ranges for a given IOMMU + * memory region. Used for example to propagate host physical device + * reserved memory region constraints to the virtual IOMMU. + * + * Optional method: if this method is not provided, then the default IOVA + * aperture is used. + * + * @nr_ranges: number of IOVA ranges + * + * @iova_ranges: an array of @nr_ranges usable IOVA ranges + * + * Returns 0 on success, or a negative error. In case of failure, the error + * object must be created. + */ + int (*iommu_set_iova_ranges)(IOMMUMemoryRegion *iommu, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp); }; typedef struct RamDiscardListener RamDiscardListener; @@ -1845,6 +1866,11 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, uint64_t page_size_mask, Error **errp); +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp); + /** * memory_region_name: get a memory region's name * diff --git a/softmmu/memory.c b/softmmu/memory.c index 7d9494ce70..07499457aa 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -1905,6 +1905,21 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, return ret; } +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu_mr, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp) +{ + IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr); + int ret = 0; + + if (imrc->iommu_set_iova_ranges) { + ret = imrc->iommu_set_iova_ranges(iommu_mr, nr_ranges, + iova_ranges, errp); + } + return ret; +} + int memory_region_register_iommu_notifier(MemoryRegion *mr, IOMMUNotifier *n, Error **errp) {
This helper will allow to convey information about valid IOVA ranges to virtual IOMMUS. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- include/exec/memory.h | 26 ++++++++++++++++++++++++++ softmmu/memory.c | 15 +++++++++++++++ 2 files changed, 41 insertions(+)