On Thu, Jul 30, 2020 at 05:12:09PM +0300, Kirill Tkhai wrote: > 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. Ah, yes. Thanks! > >>>> +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? I meant you won't need to increment '*id'. The refcount is, of course, your business.