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 |
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 --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;