On Sat, 3 Aug 2019 07:01:53 -0700 Tejun Heo <tj@xxxxxxxxxx> wrote: > There currently is no way to universally identify and lookup a bdi > without holding a reference and pointer to it. This patch adds an > non-recycling bdi->id and implements bdi_get_by_id() which looks up > bdis by their ids. This will be used by memcg foreign inode flushing. Why is the id non-recycling? Presumably to address some lifetime/lookup issues, but what are they? Why was the IDR code not used? > I left bdi_list alone for simplicity and because while rb_tree does > support rcu assignment it doesn't seem to guarantee lossless walk when > walk is racing aginst tree rebalance operations. > > ... > > +/** > + * bdi_get_by_id - lookup and get bdi from its id > + * @id: bdi id to lookup > + * > + * Find bdi matching @id and get it. Returns NULL if the matching bdi > + * doesn't exist or is already unregistered. > + */ > +struct backing_dev_info *bdi_get_by_id(u64 id) > +{ > + struct backing_dev_info *bdi = NULL; > + struct rb_node **p; > + > + spin_lock_irq(&bdi_lock); Why irq-safe? Everywhere else uses spin_lock_bh(&bdi_lock). > + p = bdi_lookup_rb_node(id, NULL); > + if (*p) { > + bdi = rb_entry(*p, struct backing_dev_info, rb_node); > + bdi_get(bdi); > + } > + spin_unlock_irq(&bdi_lock); > + > + return bdi; > +} > + > > ... >