Re: [PATCH 2/4] bdi: Add bdi->id
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2019-08-06 23:01:06
Also in:
cgroups, linux-mm, lkml
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2019-08-06 23:01:06
Also in:
cgroups, linux-mm, lkml
On Sat, 3 Aug 2019 07:01:53 -0700 Tejun Heo [off-list ref] 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;
+}
+
...