On Thu, Mar 31, 2022 at 03:36:29PM +1100, David Gibson wrote: > > +/** > > + * struct iommu_ioas_iova_ranges - ioctl(IOMMU_IOAS_IOVA_RANGES) > > + * @size: sizeof(struct iommu_ioas_iova_ranges) > > + * @ioas_id: IOAS ID to read ranges from > > + * @out_num_iovas: Output total number of ranges in the IOAS > > + * @__reserved: Must be 0 > > + * @out_valid_iovas: Array of valid IOVA ranges. The array length is the smaller > > + * of out_num_iovas or the length implied by size. > > + * @out_valid_iovas.start: First IOVA in the allowed range > > + * @out_valid_iovas.last: Inclusive last IOVA in the allowed range > > + * > > + * Query an IOAS for ranges of allowed IOVAs. Operation outside these ranges is > > + * not allowed. out_num_iovas will be set to the total number of iovas > > + * and the out_valid_iovas[] will be filled in as space permits. > > + * size should include the allocated flex array. > > + */ > > +struct iommu_ioas_iova_ranges { > > + __u32 size; > > + __u32 ioas_id; > > + __u32 out_num_iovas; > > + __u32 __reserved; > > + struct iommu_valid_iovas { > > + __aligned_u64 start; > > + __aligned_u64 last; > > + } out_valid_iovas[]; > > +}; > > +#define IOMMU_IOAS_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_IOVA_RANGES) > > Is the information returned by this valid for the lifeime of the IOAS, > or can it change? If it can change, what events can change it? > > If it *can't* change, then how do we have enough information to > determine this at ALLOC time, since we don't necessarily know which > (if any) hardware IOMMU will be attached to it. It is a good point worth documenting. It can change. Particularly after any device attachment. I added this: * Query an IOAS for ranges of allowed IOVAs. Mapping IOVA outside these ranges * is not allowed. out_num_iovas will be set to the total number of iovas and * the out_valid_iovas[] will be filled in as space permits. size should include * the allocated flex array. * * The allowed ranges are dependent on the HW path the DMA operation takes, and * can change during the lifetime of the IOAS. A fresh empty IOAS will have a * full range, and each attached device will narrow the ranges based on that * devices HW restrictions. > > +#define IOMMU_IOAS_COPY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_COPY) > > Since it can only copy a single mapping, what's the benefit of this > over just repeating an IOAS_MAP in the new IOAS? It causes the underlying pin accounting to be shared and can avoid calling GUP entirely. Thanks, Jason