On 30.07.2020 16:56, Matthew Wilcox wrote: > 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? No, I just I will add this in separate patch. >>>> +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(). How is it embedded to check ns->count that it knows nothing?