[PATCH] btrfs: skip the extent map tree lock for inodes without extent maps
Breno Leitao <[email protected]>
| Newsgroups | org.kernel.vger.linux-btrfs,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The shrinker (find_first_inode_to_shrink()) takes inode->extent_tree.lock in write mode on every inode it walks, only to find out whether that inode has any extent maps. Most have none, from what I understand, so, avoid the lock by testing the tree with a plain read before taking the lock. tree->root is only modified with the tree lock held for write, so the unlocked read is a benign race: a false negative just defers the inode to a later scan. On my tests, find_first_inode_to_shrink() was a bit faster, so, if this patch is correct, I think it is worth having to reduce lock contention. Signed-off-by: Breno Leitao <[email protected]> --- fs/btrfs/extent_map.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 6ad7b39ae358b..cdcd2b779050d 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1219,6 +1219,9 @@ static struct btrfs_inode *find_first_inode_to_shrink(struct btrfs_root *root, tree = &inode->extent_tree; + if (!READ_ONCE(tree->root.rb_node)) + goto next; + /* * We want to be fast so if the lock is busy we don't want to * spend time waiting for it (some task is about to do IO for --- base-commit: 6a746cd265aed59107ebdaa9ce039bb832922969 change-id: 20260820-b4-btrfs-em-shrinker-7382d7f0dd05 Best regards, -- Breno Leitao <[email protected]>