btrfs: track discardable extents for async discard
The number of discardable extents will serve as the rate limiting metric for how often we should discard. This keeps track of discardable extents in the free space caches by maintaining deltas and propagating them to the global count. The deltas are calculated from 2 values stored in PREV and CURR entries, then propagated up to the global discard ctl. The current counter value becomes the previous counter value after update. Signed-off-by: Dennis Zhou <dennis@kernel.org> Reviewed-by: David Sterba <dsterba@suse.com> [ update changelog ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:

committed by
David Sterba

parent
e4faab844a
commit
dfb79ddb13
@@ -342,6 +342,35 @@ bool btrfs_run_discard_work(struct btrfs_discard_ctl *discard_ctl)
|
||||
test_bit(BTRFS_FS_DISCARD_RUNNING, &fs_info->flags));
|
||||
}
|
||||
|
||||
/**
|
||||
* btrfs_discard_update_discardable - propagate discard counters
|
||||
* @block_group: block_group of interest
|
||||
* @ctl: free_space_ctl of @block_group
|
||||
*
|
||||
* This propagates deltas of counters up to the discard_ctl. It maintains a
|
||||
* current counter and a previous counter passing the delta up to the global
|
||||
* stat. Then the current counter value becomes the previous counter value.
|
||||
*/
|
||||
void btrfs_discard_update_discardable(struct btrfs_block_group *block_group,
|
||||
struct btrfs_free_space_ctl *ctl)
|
||||
{
|
||||
struct btrfs_discard_ctl *discard_ctl;
|
||||
s32 extents_delta;
|
||||
|
||||
if (!block_group || !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
|
||||
return;
|
||||
|
||||
discard_ctl = &block_group->fs_info->discard_ctl;
|
||||
|
||||
extents_delta = ctl->discardable_extents[BTRFS_STAT_CURR] -
|
||||
ctl->discardable_extents[BTRFS_STAT_PREV];
|
||||
if (extents_delta) {
|
||||
atomic_add(extents_delta, &discard_ctl->discardable_extents);
|
||||
ctl->discardable_extents[BTRFS_STAT_PREV] =
|
||||
ctl->discardable_extents[BTRFS_STAT_CURR];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* btrfs_discard_punt_unused_bgs_list - punt unused_bgs list to discard lists
|
||||
* @fs_info: fs_info of interest
|
||||
@@ -423,6 +452,8 @@ void btrfs_discard_init(struct btrfs_fs_info *fs_info)
|
||||
|
||||
for (i = 0; i < BTRFS_NR_DISCARD_LISTS; i++)
|
||||
INIT_LIST_HEAD(&discard_ctl->discard_list[i]);
|
||||
|
||||
atomic_set(&discard_ctl->discardable_extents, 0);
|
||||
}
|
||||
|
||||
void btrfs_discard_cleanup(struct btrfs_fs_info *fs_info)
|
||||
|
Reference in New Issue
Block a user