On Thu, Mar 31, 2022 at 09:58:41AM -0300, Jason Gunthorpe wrote: > 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. Right.. this is vital and needs to be front and centre in the comments/docs here. Really, I think an interface that *doesn't* have magically changing status would be better (which is why I was advocating that the user set the constraints, and the kernel supplied or failed outright). Still I recognize that has its own problems. > 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. I think you need to be even more explicit about this: which exact operations on the fd can invalidate exactly which items in the information from this call? Can it only ever be narrowed, or can it be broadened with any operations? > > > +#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. If that's the only purpose, then that needs to be right here in the comments too. So is expected best practice to IOAS_MAP everything you might want to map into a sort of "scratch" IOAS, then IOAS_COPY the mappings you actually end up wanting into the "real" IOASes for use? Seems like it would be nicer for the interface to just figure it out for you: I can see there being sufficient complications with that to have this slightly awkward interface, but I think it needs a rationale to accompany it. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson