Commit 8fc05859 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by David Sterba

btrfs: merge critical sections of discard lock in workfn

btrfs_discard_workfn() drops discard_ctl->lock just to take it again in
a moment in btrfs_discard_schedule_work(). Avoid that and also reuse
ktime.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 1ea2872f
...@@ -328,28 +328,15 @@ void btrfs_discard_queue_work(struct btrfs_discard_ctl *discard_ctl, ...@@ -328,28 +328,15 @@ void btrfs_discard_queue_work(struct btrfs_discard_ctl *discard_ctl,
btrfs_discard_schedule_work(discard_ctl, false); btrfs_discard_schedule_work(discard_ctl, false);
} }
/** static void __btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
* btrfs_discard_schedule_work - responsible for scheduling the discard work u64 now, bool override)
* @discard_ctl: discard control
* @override: override the current timer
*
* Discards are issued by a delayed workqueue item. @override is used to
* update the current delay as the baseline delay interval is reevaluated on
* transaction commit. This is also maxed with any other rate limit.
*/
void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
bool override)
{ {
struct btrfs_block_group *block_group; struct btrfs_block_group *block_group;
const u64 now = ktime_get_ns();
spin_lock(&discard_ctl->lock);
if (!btrfs_run_discard_work(discard_ctl)) if (!btrfs_run_discard_work(discard_ctl))
goto out; return;
if (!override && delayed_work_pending(&discard_ctl->work)) if (!override && delayed_work_pending(&discard_ctl->work))
goto out; return;
block_group = find_next_block_group(discard_ctl, now); block_group = find_next_block_group(discard_ctl, now);
if (block_group) { if (block_group) {
...@@ -391,7 +378,24 @@ void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl, ...@@ -391,7 +378,24 @@ void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
mod_delayed_work(discard_ctl->discard_workers, mod_delayed_work(discard_ctl->discard_workers,
&discard_ctl->work, nsecs_to_jiffies(delay)); &discard_ctl->work, nsecs_to_jiffies(delay));
} }
out: }
/*
* btrfs_discard_schedule_work - responsible for scheduling the discard work
* @discard_ctl: discard control
* @override: override the current timer
*
* Discards are issued by a delayed workqueue item. @override is used to
* update the current delay as the baseline delay interval is reevaluated on
* transaction commit. This is also maxed with any other rate limit.
*/
void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
bool override)
{
const u64 now = ktime_get_ns();
spin_lock(&discard_ctl->lock);
__btrfs_discard_schedule_work(discard_ctl, now, override);
spin_unlock(&discard_ctl->lock); spin_unlock(&discard_ctl->lock);
} }
...@@ -497,9 +501,8 @@ static void btrfs_discard_workfn(struct work_struct *work) ...@@ -497,9 +501,8 @@ static void btrfs_discard_workfn(struct work_struct *work)
discard_ctl->prev_discard = trimmed; discard_ctl->prev_discard = trimmed;
discard_ctl->prev_discard_time = now; discard_ctl->prev_discard_time = now;
discard_ctl->block_group = NULL; discard_ctl->block_group = NULL;
__btrfs_discard_schedule_work(discard_ctl, now, false);
spin_unlock(&discard_ctl->lock); spin_unlock(&discard_ctl->lock);
btrfs_discard_schedule_work(discard_ctl, false);
} }
/** /**
......
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