Skip to content

Commit

Permalink
btrfs: reinterpret async discard iops_limit=0 as no delay
Browse files Browse the repository at this point in the history
Currently, a limit of 0 results in a hard coded metering over 6 hours.
Since the default is a set limit, I suspect no one truly depends on this
rather arbitrary setting. Repurpose it for an arguably more useful
"unlimited" mode, where the delay is 0.

Note that if block groups are too new, or go fully empty, there is still
a delay associated with those conditions. Those delays implement
heuristics for not trimming a region we are relatively likely to fully
overwrite soon.

CC: [email protected] # 6.2+
Reviewed-by: Neal Gompa <[email protected]>
Signed-off-by: Boris Burkov <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: David Sterba <[email protected]>
  • Loading branch information
boryas authored and kdave committed Apr 20, 2023
1 parent e9f5942 commit ef9cddf
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions fs/btrfs/discard.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@
#define BTRFS_DISCARD_DELAY (120ULL * NSEC_PER_SEC)
#define BTRFS_DISCARD_UNUSED_DELAY (10ULL * NSEC_PER_SEC)

/* Target completion latency of discarding all discardable extents */
#define BTRFS_DISCARD_TARGET_MSEC (6 * 60 * 60UL * MSEC_PER_SEC)
#define BTRFS_DISCARD_MIN_DELAY_MSEC (1UL)
#define BTRFS_DISCARD_MAX_DELAY_MSEC (1000UL)
#define BTRFS_DISCARD_MAX_IOPS (1000U)
Expand Down Expand Up @@ -577,6 +575,7 @@ void btrfs_discard_calc_delay(struct btrfs_discard_ctl *discard_ctl)
s32 discardable_extents;
s64 discardable_bytes;
u32 iops_limit;
unsigned long min_delay = BTRFS_DISCARD_MIN_DELAY_MSEC;
unsigned long delay;

discardable_extents = atomic_read(&discard_ctl->discardable_extents);
Expand Down Expand Up @@ -607,13 +606,19 @@ void btrfs_discard_calc_delay(struct btrfs_discard_ctl *discard_ctl)
}

iops_limit = READ_ONCE(discard_ctl->iops_limit);
if (iops_limit)

if (iops_limit) {
delay = MSEC_PER_SEC / iops_limit;
else
delay = BTRFS_DISCARD_TARGET_MSEC / discardable_extents;
} else {
/*
* Unset iops_limit means go as fast as possible, so allow a
* delay of 0.
*/
delay = 0;
min_delay = 0;
}

delay = clamp(delay, BTRFS_DISCARD_MIN_DELAY_MSEC,
BTRFS_DISCARD_MAX_DELAY_MSEC);
delay = clamp(delay, min_delay, BTRFS_DISCARD_MAX_DELAY_MSEC);
discard_ctl->delay_ms = delay;

spin_unlock(&discard_ctl->lock);
Expand Down

0 comments on commit ef9cddf

Please sign in to comment.