mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 09:02:00 +00:00
7fe6d45e40
Non-block group destruction discarding currently only had a single list with no minimum discard length. This can lead to caravaning more meaningful discards behind a heavily fragmented block group. This adds support for multiple lists with minimum discard lengths to prevent the caravan effect. We promote block groups back up when we exceed the BTRFS_ASYNC_DISCARD_MAX_FILTER size, currently we support only 2 lists with filters of 1MB and 32KB respectively. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Dennis Zhou <dennis@kernel.org> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
42 lines
1.4 KiB
C
42 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#ifndef BTRFS_DISCARD_H
|
|
#define BTRFS_DISCARD_H
|
|
|
|
#include <linux/sizes.h>
|
|
|
|
struct btrfs_fs_info;
|
|
struct btrfs_discard_ctl;
|
|
struct btrfs_block_group;
|
|
|
|
/* Discard size limits */
|
|
#define BTRFS_ASYNC_DISCARD_DEFAULT_MAX_SIZE (SZ_64M)
|
|
#define BTRFS_ASYNC_DISCARD_MAX_FILTER (SZ_1M)
|
|
#define BTRFS_ASYNC_DISCARD_MIN_FILTER (SZ_32K)
|
|
|
|
/* List operations */
|
|
void btrfs_discard_check_filter(struct btrfs_block_group *block_group, u64 bytes);
|
|
|
|
/* Work operations */
|
|
void btrfs_discard_cancel_work(struct btrfs_discard_ctl *discard_ctl,
|
|
struct btrfs_block_group *block_group);
|
|
void btrfs_discard_queue_work(struct btrfs_discard_ctl *discard_ctl,
|
|
struct btrfs_block_group *block_group);
|
|
void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
|
|
bool override);
|
|
bool btrfs_run_discard_work(struct btrfs_discard_ctl *discard_ctl);
|
|
|
|
/* Update operations */
|
|
void btrfs_discard_calc_delay(struct btrfs_discard_ctl *discard_ctl);
|
|
void btrfs_discard_update_discardable(struct btrfs_block_group *block_group,
|
|
struct btrfs_free_space_ctl *ctl);
|
|
|
|
/* Setup/cleanup operations */
|
|
void btrfs_discard_punt_unused_bgs_list(struct btrfs_fs_info *fs_info);
|
|
void btrfs_discard_resume(struct btrfs_fs_info *fs_info);
|
|
void btrfs_discard_stop(struct btrfs_fs_info *fs_info);
|
|
void btrfs_discard_init(struct btrfs_fs_info *fs_info);
|
|
void btrfs_discard_cleanup(struct btrfs_fs_info *fs_info);
|
|
|
|
#endif
|