On Fri, 19 Apr 2024 21:43:17 +0800 Yi Liu <yi.l.liu@xxxxxxxxx> wrote: > On 2024/4/19 01:12, Jason Gunthorpe wrote: > > On Thu, Apr 18, 2024 at 10:23:14AM -0600, Alex Williamson wrote: > >>> yep. maybe we can start with the below code, no need for ida_for_each() > >>> today. > >>> > >>> > >>> int id = 0; > >>> > >>> while (!ida_is_empty(&pasid_ida)) { > >>> id = ida_find_first_range(pasid_ida, id, INT_MAX); > >> > >> You've actually already justified the _min function here: > >> > >> static inline int ida_find_first_min(struct ida *ida, unsigned int min) > >> { > >> return ida_find_first_range(ida, min, ~0); > >> } > > > > It should also always start from 0.. > > any special reason to always start from 0? Here we want to loop all the > IDs, and remove them. In this usage, it should be more efficient if we > start from the last found ID. In the above version, there's a possibility of an infinite loop, in the below there's not. I don't think the infinite loop is actually reachable, but given the xarray backend to ida I'm not sure you're gaining much to restart after the previously found id either. Thanks, Alex > > Ideally written more like: > > > > while ((id = ida_find_first(pasid_ida)) != EMPTY_IDA) { > > ida_remove(id); > > } >