Commit 428c8e03 authored by David Sterba's avatar David Sterba

btrfs: simplify percent calculation helpers, rename div_factor

The div_factor* helpers calculate fraction or percentage fraction. The
name is a bit confusing, we use it only for percentage calculations and
there are two helpers.

There's a helper mult_frac that's for general fractions, that tries to
be accurate but we multiply and divide by small numbers so we can use
the div_u64 helper.

Rename the div_factor* helpers and use 1..100 percentage range, also drop
the case checking for percentage == 100, it's never hit.

The conversions:

* div_factor calculates tenths and the numbers need to be adjusted
* div_factor_fine is direct replacement
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 20af93d9
...@@ -1551,7 +1551,7 @@ static bool should_reclaim_block_group(struct btrfs_block_group *bg, u64 bytes_f ...@@ -1551,7 +1551,7 @@ static bool should_reclaim_block_group(struct btrfs_block_group *bg, u64 bytes_f
if (reclaim_thresh == 0) if (reclaim_thresh == 0)
return false; return false;
thresh = div_factor_fine(bg->length, reclaim_thresh); thresh = mult_perc(bg->length, reclaim_thresh);
/* /*
* If we were below the threshold before don't reclaim, we are likely a * If we were below the threshold before don't reclaim, we are likely a
...@@ -3523,13 +3523,13 @@ static int should_alloc_chunk(struct btrfs_fs_info *fs_info, ...@@ -3523,13 +3523,13 @@ static int should_alloc_chunk(struct btrfs_fs_info *fs_info,
*/ */
if (force == CHUNK_ALLOC_LIMITED) { if (force == CHUNK_ALLOC_LIMITED) {
thresh = btrfs_super_total_bytes(fs_info->super_copy); thresh = btrfs_super_total_bytes(fs_info->super_copy);
thresh = max_t(u64, SZ_64M, div_factor_fine(thresh, 1)); thresh = max_t(u64, SZ_64M, mult_perc(thresh, 1));
if (sinfo->total_bytes - bytes_used < thresh) if (sinfo->total_bytes - bytes_used < thresh)
return 1; return 1;
} }
if (bytes_used + SZ_2M < div_factor(sinfo->total_bytes, 8)) if (bytes_used + SZ_2M < mult_perc(sinfo->total_bytes, 80))
return 0; return 0;
return 1; return 1;
} }
......
...@@ -227,7 +227,7 @@ int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info, ...@@ -227,7 +227,7 @@ int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
return ret; return ret;
} }
int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor) int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_percent)
{ {
u64 num_bytes = 0; u64 num_bytes = 0;
int ret = -ENOSPC; int ret = -ENOSPC;
...@@ -236,7 +236,7 @@ int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor) ...@@ -236,7 +236,7 @@ int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor)
return 0; return 0;
spin_lock(&block_rsv->lock); spin_lock(&block_rsv->lock);
num_bytes = div_factor(block_rsv->size, min_factor); num_bytes = mult_perc(block_rsv->size, min_percent);
if (block_rsv->reserved >= num_bytes) if (block_rsv->reserved >= num_bytes)
ret = 0; ret = 0;
spin_unlock(&block_rsv->lock); spin_unlock(&block_rsv->lock);
......
...@@ -63,7 +63,7 @@ void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info, ...@@ -63,7 +63,7 @@ void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info, int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
struct btrfs_block_rsv *block_rsv, u64 num_bytes, struct btrfs_block_rsv *block_rsv, u64 num_bytes,
enum btrfs_reserve_flush_enum flush); enum btrfs_reserve_flush_enum flush);
int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor); int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_percent);
int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info, int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info,
struct btrfs_block_rsv *block_rsv, u64 min_reserved, struct btrfs_block_rsv *block_rsv, u64 min_reserved,
enum btrfs_reserve_flush_enum flush); enum btrfs_reserve_flush_enum flush);
......
...@@ -2726,8 +2726,7 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group, ...@@ -2726,8 +2726,7 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group,
btrfs_mark_bg_unused(block_group); btrfs_mark_bg_unused(block_group);
} else if (bg_reclaim_threshold && } else if (bg_reclaim_threshold &&
reclaimable_unusable >= reclaimable_unusable >=
div_factor_fine(block_group->zone_capacity, mult_perc(block_group->zone_capacity, bg_reclaim_threshold)) {
bg_reclaim_threshold)) {
btrfs_mark_bg_to_reclaim(block_group); btrfs_mark_bg_to_reclaim(block_group);
} }
......
...@@ -40,22 +40,10 @@ static inline void cond_wake_up_nomb(struct wait_queue_head *wq) ...@@ -40,22 +40,10 @@ static inline void cond_wake_up_nomb(struct wait_queue_head *wq)
wake_up(wq); wake_up(wq);
} }
static inline u64 div_factor(u64 num, int factor) static inline u64 mult_perc(u64 num, u32 percent)
{ {
if (factor == 10) return div_u64(num * percent, 100);
return num;
num *= factor;
return div_u64(num, 10);
} }
static inline u64 div_factor_fine(u64 num, int factor)
{
if (factor == 100)
return num;
num *= factor;
return div_u64(num, 100);
}
/* Copy of is_power_of_two that is 64bit safe */ /* Copy of is_power_of_two that is 64bit safe */
static inline bool is_power_of_two_u64(u64 n) static inline bool is_power_of_two_u64(u64 n)
{ {
......
...@@ -859,7 +859,7 @@ static bool need_preemptive_reclaim(struct btrfs_fs_info *fs_info, ...@@ -859,7 +859,7 @@ static bool need_preemptive_reclaim(struct btrfs_fs_info *fs_info,
u64 thresh; u64 thresh;
u64 used; u64 used;
thresh = div_factor_fine(total, 90); thresh = mult_perc(total, 90);
lockdep_assert_held(&space_info->lock); lockdep_assert_held(&space_info->lock);
...@@ -977,7 +977,7 @@ static bool steal_from_global_rsv(struct btrfs_fs_info *fs_info, ...@@ -977,7 +977,7 @@ static bool steal_from_global_rsv(struct btrfs_fs_info *fs_info,
return false; return false;
spin_lock(&global_rsv->lock); spin_lock(&global_rsv->lock);
min_bytes = div_factor(global_rsv->size, 1); min_bytes = mult_perc(global_rsv->size, 10);
if (global_rsv->reserved < min_bytes + ticket->bytes) { if (global_rsv->reserved < min_bytes + ticket->bytes) {
spin_unlock(&global_rsv->lock); spin_unlock(&global_rsv->lock);
return false; return false;
......
...@@ -764,7 +764,7 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj, ...@@ -764,7 +764,7 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj,
val = min(val, BTRFS_MAX_DATA_CHUNK_SIZE); val = min(val, BTRFS_MAX_DATA_CHUNK_SIZE);
/* Limit stripe size to 10% of available space. */ /* Limit stripe size to 10% of available space. */
val = min(div_factor(fs_info->fs_devices->total_rw_bytes, 1), val); val = min(mult_perc(fs_info->fs_devices->total_rw_bytes, 10), val);
/* Must be multiple of 256M. */ /* Must be multiple of 256M. */
val &= ~((u64)SZ_256M - 1); val &= ~((u64)SZ_256M - 1);
......
...@@ -949,7 +949,7 @@ static bool should_end_transaction(struct btrfs_trans_handle *trans) ...@@ -949,7 +949,7 @@ static bool should_end_transaction(struct btrfs_trans_handle *trans)
if (btrfs_check_space_for_delayed_refs(fs_info)) if (btrfs_check_space_for_delayed_refs(fs_info))
return true; return true;
return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 5); return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 50);
} }
bool btrfs_should_end_transaction(struct btrfs_trans_handle *trans) bool btrfs_should_end_transaction(struct btrfs_trans_handle *trans)
......
...@@ -3614,16 +3614,14 @@ static int chunk_usage_range_filter(struct btrfs_fs_info *fs_info, u64 chunk_off ...@@ -3614,16 +3614,14 @@ static int chunk_usage_range_filter(struct btrfs_fs_info *fs_info, u64 chunk_off
if (bargs->usage_min == 0) if (bargs->usage_min == 0)
user_thresh_min = 0; user_thresh_min = 0;
else else
user_thresh_min = div_factor_fine(cache->length, user_thresh_min = mult_perc(cache->length, bargs->usage_min);
bargs->usage_min);
if (bargs->usage_max == 0) if (bargs->usage_max == 0)
user_thresh_max = 1; user_thresh_max = 1;
else if (bargs->usage_max > 100) else if (bargs->usage_max > 100)
user_thresh_max = cache->length; user_thresh_max = cache->length;
else else
user_thresh_max = div_factor_fine(cache->length, user_thresh_max = mult_perc(cache->length, bargs->usage_max);
bargs->usage_max);
if (user_thresh_min <= chunk_used && chunk_used < user_thresh_max) if (user_thresh_min <= chunk_used && chunk_used < user_thresh_max)
ret = 0; ret = 0;
...@@ -3647,7 +3645,7 @@ static int chunk_usage_filter(struct btrfs_fs_info *fs_info, ...@@ -3647,7 +3645,7 @@ static int chunk_usage_filter(struct btrfs_fs_info *fs_info,
else if (bargs->usage > 100) else if (bargs->usage > 100)
user_thresh = cache->length; user_thresh = cache->length;
else else
user_thresh = div_factor_fine(cache->length, bargs->usage); user_thresh = mult_perc(cache->length, bargs->usage);
if (chunk_used < user_thresh) if (chunk_used < user_thresh)
ret = 0; ret = 0;
...@@ -5113,7 +5111,7 @@ static void init_alloc_chunk_ctl_policy_regular( ...@@ -5113,7 +5111,7 @@ static void init_alloc_chunk_ctl_policy_regular(
ctl->devs_max = min_t(int, ctl->devs_max, BTRFS_MAX_DEVS_SYS_CHUNK); ctl->devs_max = min_t(int, ctl->devs_max, BTRFS_MAX_DEVS_SYS_CHUNK);
/* We don't want a chunk larger than 10% of writable space */ /* We don't want a chunk larger than 10% of writable space */
ctl->max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1), ctl->max_chunk_size = min(mult_perc(fs_devices->total_rw_bytes, 10),
ctl->max_chunk_size); ctl->max_chunk_size);
ctl->dev_extent_min = BTRFS_STRIPE_LEN * ctl->dev_stripes; ctl->dev_extent_min = BTRFS_STRIPE_LEN * ctl->dev_stripes;
} }
...@@ -5144,7 +5142,7 @@ static void init_alloc_chunk_ctl_policy_zoned( ...@@ -5144,7 +5142,7 @@ static void init_alloc_chunk_ctl_policy_zoned(
} }
/* We don't want a chunk larger than 10% of writable space */ /* We don't want a chunk larger than 10% of writable space */
limit = max(round_down(div_factor(fs_devices->total_rw_bytes, 1), limit = max(round_down(mult_perc(fs_devices->total_rw_bytes, 10),
zone_size), zone_size),
min_chunk_size); min_chunk_size);
ctl->max_chunk_size = min(limit, ctl->max_chunk_size); ctl->max_chunk_size = min(limit, ctl->max_chunk_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment