On Mon, Sep 28, 2020 at 02:38:34PM -0700, Jacob Pan wrote: > Users of an ioasid_set may not keep track of all the IOASIDs allocated > under the set. When collective actions are needed for each IOASIDs, it > is useful to iterate over all the IOASIDs within the set. For example, > when the ioasid_set is freed, the user might perform the same cleanup > operation on each IOASID. > > This patch adds an API to iterate all the IOASIDs within the set. > > Signed-off-by: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> Could add a short description of the function parameters, but Reviewed-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> > --- > drivers/iommu/ioasid.c | 17 +++++++++++++++++ > include/linux/ioasid.h | 9 +++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/iommu/ioasid.c b/drivers/iommu/ioasid.c > index cf8c7d34e2de..9628e78b2ab4 100644 > --- a/drivers/iommu/ioasid.c > +++ b/drivers/iommu/ioasid.c > @@ -701,6 +701,23 @@ int ioasid_adjust_set(struct ioasid_set *set, int quota) > EXPORT_SYMBOL_GPL(ioasid_adjust_set); > > /** > + * ioasid_set_for_each_ioasid - Iterate over all the IOASIDs within the set > + * > + * Caller must hold a reference of the set and handles its own locking. > + */ > +void ioasid_set_for_each_ioasid(struct ioasid_set *set, > + void (*fn)(ioasid_t id, void *data), > + void *data) > +{ > + struct ioasid_data *entry; > + unsigned long index; > + > + xa_for_each(&set->xa, index, entry) > + fn(index, data); > +} > +EXPORT_SYMBOL_GPL(ioasid_set_for_each_ioasid); > + > +/** > * ioasid_find - Find IOASID data > * @set: the IOASID set > * @ioasid: the IOASID to find > diff --git a/include/linux/ioasid.h b/include/linux/ioasid.h > index 0a5e82148eb9..aab58bc26714 100644 > --- a/include/linux/ioasid.h > +++ b/include/linux/ioasid.h > @@ -75,6 +75,9 @@ int ioasid_register_allocator(struct ioasid_allocator_ops *allocator); > void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator); > int ioasid_attach_data(ioasid_t ioasid, void *data); > void ioasid_detach_data(ioasid_t ioasid); > +void ioasid_set_for_each_ioasid(struct ioasid_set *sdata, > + void (*fn)(ioasid_t id, void *data), > + void *data); > #else /* !CONFIG_IOASID */ > static inline void ioasid_install_capacity(ioasid_t total) > { > @@ -131,5 +134,11 @@ static inline int ioasid_attach_data(ioasid_t ioasid, void *data) > static inline void ioasid_detach_data(ioasid_t ioasid) > { > } > + > +static inline void ioasid_set_for_each_ioasid(struct ioasid_set *sdata, > + void (*fn)(ioasid_t id, void *data), > + void *data) > +{ > +} > #endif /* CONFIG_IOASID */ > #endif /* __LINUX_IOASID_H */ > -- > 2.7.4 >