FAILED: patch "[PATCH] btrfs: zoned: cache reported zone during mount" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 16beac87e95e2fb278b552397c8260637f8a63f7 Mon Sep 17 00:00:00 2001
From: Naohiro Aota <[email protected]>
Date: Thu, 11 Nov 2021 14:14:38 +0900
Subject: [PATCH] btrfs: zoned: cache reported zone during mount
When mounting a device, we are reporting the zones twice: once for checking the zone attributes in btrfs_get_dev_zone_info and once for loading block groups' zone info in btrfs_load_block_group_zone_info(). With a lot of block groups, that leads to a lot of REPORT ZONE commands and slows down the mount process.
This patch introduces a zone info cache in struct btrfs_zoned_device_info. The cache is populated while in btrfs_get_dev_zone_info() and used for btrfs_load_block_group_zone_info() to reduce the number of REPORT ZONE commands. The zone cache is then released after loading the block groups, as it will not be much effective during the run time.
Benchmark: Mount an HDD with 57,007 block groups
Before patch: 171.368 seconds
After patch: 64.064 seconds
While it still takes a minute due to the slowness of loading all the block groups, the patch reduces the mount time by 1/3.
fs/btrfs/dev-replace.c +1 -1
@@ -322,7 +322,7 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,set_blocksize (device->bdev,BTRFS_BDEV_BLOCKSIZE ); device->fs_devices = fs_info->fs_devices; - ret =btrfs_get_dev_zone_info (device); + ret =btrfs_get_dev_zone_info (device, false);if (ret) goto error;
fs/btrfs/disk-io.c +2 -0
@@ -3570,6 +3570,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device goto fail_sysfs; } +btrfs_free_zone_cache (fs_info); +if (!sb_rdonly (sb) && fs_info->fs_devices->missing_devices && !btrfs_check_rw_degradable (fs_info,NULL )) { btrfs_warn(fs_info,
fs/btrfs/volumes.c +1 -1
@@ -2669,7 +2669,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path device->fs_info = fs_info; device->bdev = bdev; - ret =btrfs_get_dev_zone_info (device); + ret =btrfs_get_dev_zone_info (device, false);if (ret) goto error_free_device;
fs/btrfs/zoned.c +77 -9
155 lines not on this page · raw message
fs/btrfs/zoned.h +6 -2
@@ -28,6 +28,7 @@ struct btrfs_zoned_device_info {unsigned long *seq_zones;unsigned long *empty_zones;unsigned long *active_zones; +struct blk_zone *zone_cache;struct blk_zone sb_zones[2 *BTRFS_SUPER_MIRROR_MAX ]; };
@@ -35,7 +36,7 @@ struct btrfs_zoned_device_info {int btrfs_get_dev_zone (struct btrfs_device *device,u64 pos,struct blk_zone *zone);int btrfs_get_dev_zone_info_all_devices (struct btrfs_fs_info *fs_info); -int btrfs_get_dev_zone_info (struct btrfs_device *device); +int btrfs_get_dev_zone_info (struct btrfs_device *device,bool populate_cache);void btrfs_destroy_dev_zone_info (struct btrfs_device *device);int btrfs_check_zoned_mode (struct btrfs_fs_info *fs_info);int btrfs_check_mountopts_zoned (struct btrfs_fs_info *info);
@@ -76,6 +77,7 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices,void btrfs_zone_finish_endio (struct btrfs_fs_info *fs_info,u64 logical,u64 length);void btrfs_clear_data_reloc_bg (struct btrfs_block_group *bg); +void btrfs_free_zone_cache (struct btrfs_fs_info *fs_info);#else /* CONFIG_BLK_DEV_ZONED */ static inline int btrfs_get_dev_zone (struct btrfs_device *device,u64 pos,struct blk_zone *zone)
@@ -88,7 +90,8 @@ static inline int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_ireturn 0 ; } -static inline int btrfs_get_dev_zone_info (struct btrfs_device *device) +static inline int btrfs_get_dev_zone_info (struct btrfs_device *device, +bool populate_cache) {return 0 ; }
@@ -232,6 +235,7 @@ static inline void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info,static inline void btrfs_clear_data_reloc_bg (struct btrfs_block_group *bg) { } +static inline void btrfs_free_zone_cache (struct btrfs_fs_info *fs_info) { }#endif static inline bool btrfs_dev_is_sequential (struct btrfs_device *device,u64 pos)