Message ID | 20230913080423.523953-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 9/13/23 10:01, 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: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > 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) > {
Hi Cedric, On 9/13/23 14:43, Cédric Le Goater wrote: > On 9/13/23 10:01, 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: Cédric Le Goater <clg@redhat.com> Thanks! Eric > > Thanks, > > C. > >> --- >> 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) >> { >
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(+)