btrfs: zoned: tweak reclaim threshold for zone capacity
authorNaohiro Aota <naohiro.aota@wdc.com>
Thu, 19 Aug 2021 12:19:11 +0000 (21:19 +0900)
committerDavid Sterba <dsterba@suse.com>
Tue, 26 Oct 2021 17:07:59 +0000 (19:07 +0200)
With the introduction of zone capacity, the range [capacity, length] is
always zone unusable. Counting this region as a reclaim target will
cause reclaiming too early. Reclaim block groups based on bytes that can
be usable after resetting.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/free-space-cache.c

index b76b608b081f1aa4c57f0f669da06c01919f769e..9ce0f9b238128c6308f27674144b1b08af064ba1 100644 (file)
@@ -2540,6 +2540,7 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group,
        u64 to_free, to_unusable;
        const int bg_reclaim_threshold = READ_ONCE(fs_info->bg_reclaim_threshold);
        bool initial = (size == block_group->length);
+       u64 reclaimable_unusable;
 
        WARN_ON(!initial && offset + size > block_group->zone_capacity);
 
@@ -2570,12 +2571,15 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group,
                spin_unlock(&block_group->lock);
        }
 
+       reclaimable_unusable = block_group->zone_unusable -
+                              (block_group->length - block_group->zone_capacity);
        /* All the region is now unusable. Mark it as unused and reclaim */
        if (block_group->zone_unusable == block_group->length) {
                btrfs_mark_bg_unused(block_group);
        } else if (bg_reclaim_threshold &&
-                  block_group->zone_unusable >=
-                  div_factor_fine(block_group->length, bg_reclaim_threshold)) {
+                  reclaimable_unusable >=
+                  div_factor_fine(block_group->zone_capacity,
+                                  bg_reclaim_threshold)) {
                btrfs_mark_bg_to_reclaim(block_group);
        }