On Thu, Jul 30, 2020 at 04:32:22PM +0300, Kirill Tkhai wrote: > On 30.07.2020 15:23, Matthew Wilcox wrote: > > xa_erase_irqsave(); > > static inline void *xa_erase_irqsave(struct xarray *xa, unsigned long index) > { > unsigned long flags; > void *entry; > > xa_lock_irqsave(xa, flags); > entry = __xa_erase(xa, index); > xa_unlock_irqrestore(xa, flags); > > return entry; > } was there a question here? > >> +struct ns_common *ns_get_next(unsigned int *id) > >> +{ > >> + struct ns_common *ns; > >> + > >> + if (*id < PROC_NS_MIN_INO - 1) > >> + *id = PROC_NS_MIN_INO - 1; > >> + > >> + *id += 1; > >> + *id -= PROC_NS_MIN_INO; > >> + > >> + rcu_read_lock(); > >> + do { > >> + ns = idr_get_next(&ns_idr, id); > >> + if (!ns) > >> + break; > > > > xa_find_after(); > > > > You'll want a temporary unsigned long to work with ... > > > >> + if (!refcount_inc_not_zero(&ns->count)) { > >> + ns = NULL; > >> + *id += 1; > > > > you won't need this increment. > > Why? I don't see a way xarray allows to avoid this. It's embedded in xa_find_after().