diff mbox series

[RFC,1/3] btrfs: zoned: traverse device list in should reclaim under rcu_read_lock

Message ID 20240328-hans-v1-1-4cd558959407@kernel.org (mailing list archive)
State New, archived
Headers show
Series btrfs: zoned: reclaim block-groups more aggressively | expand

Commit Message

Johannes Thumshirn March 28, 2024, 1:56 p.m. UTC
From: Johannes Thumshirn <johannes.thumshirn@wdc.com>

As btrfs_zoned_should_reclaim() traverses the device list with the
device_list_mutex held. But we're never changing the device list. All we
do is gathering the used and total bytes.

So change the list traversal from the holding the device_list_mutex to
rcu_read_lock(). This also opens up the possibilities to call
btrfs_zoned_should_reclaim() with the chunk_mutex held.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 fs/btrfs/zoned.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

David Sterba April 4, 2024, 7:35 p.m. UTC | #1
Subject: btrfs: zoned: traverse device list in should reclaim under rcu_read_lock

Please use the function name in the subject instead of the description,
so like

btrfs: zoned: traverse device list under RCU lock in btrfs_zoned_should_reclaim()

On Thu, Mar 28, 2024 at 02:56:31PM +0100, Johannes Thumshirn wrote:
> From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> 
> As btrfs_zoned_should_reclaim() traverses the device list with the
> device_list_mutex held. But we're never changing the device list. All we
> do is gathering the used and total bytes.
> 
> So change the list traversal from the holding the device_list_mutex to
> rcu_read_lock(). This also opens up the possibilities to call
> btrfs_zoned_should_reclaim() with the chunk_mutex held.

You can add this patch independently, the device_list_mutex does not
seem to be needed for strong consistency of the values you read.

There are several other places where devices are under RCU only, like
btrfs_commit_device_sizes (though this is also in the transaction
context), various ioctls and btrfs_calc_avail_data_space().
diff mbox series

Patch

diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 4cba80b34387..d51faf7f4162 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -2446,7 +2446,7 @@  bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info)
 	if (fs_info->bg_reclaim_threshold == 0)
 		return false;
 
-	mutex_lock(&fs_devices->device_list_mutex);
+	rcu_read_lock();
 	list_for_each_entry(device, &fs_devices->devices, dev_list) {
 		if (!device->bdev)
 			continue;
@@ -2454,7 +2454,7 @@  bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info)
 		total += device->disk_total_bytes;
 		used += device->bytes_used;
 	}
-	mutex_unlock(&fs_devices->device_list_mutex);
+	rcu_read_unlock();
 
 	factor = div64_u64(used * 100, total);
 	return factor >= fs_info->bg_reclaim_threshold;