btrfs: only clamp the first time we have to start flushing
authorJosef Bacik <josef@toxicpanda.com>
Wed, 28 Apr 2021 17:38:43 +0000 (13:38 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jun 2021 13:19:04 +0000 (15:19 +0200)
We were clamping the threshold for preemptive reclaim any time we added
a ticket to wait on, which if we have a lot of threads means we'd
essentially max out the clamp the first time we start to flush.

Instead of doing this, simply do it every time we have to start
flushing, this will make us ramp up gradually instead of going to max
clamping as soon as we start needing to do flushing.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/space-info.c

index c9a5e003bcfa377fa997ba1577925ab500e1d2da..33edab17af0d3066b3373fc93809e641f44d67ea 100644 (file)
@@ -1561,6 +1561,15 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_info,
                    flush == BTRFS_RESERVE_FLUSH_DATA) {
                        list_add_tail(&ticket.list, &space_info->tickets);
                        if (!space_info->flush) {
+                               /*
+                                * We were forced to add a reserve ticket, so
+                                * our preemptive flushing is unable to keep
+                                * up.  Clamp down on the threshold for the
+                                * preemptive flushing in order to keep up with
+                                * the workload.
+                                */
+                               maybe_clamp_preempt(fs_info, space_info);
+
                                space_info->flush = 1;
                                trace_btrfs_trigger_flush(fs_info,
                                                          space_info->flags,
@@ -1572,14 +1581,6 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_info,
                        list_add_tail(&ticket.list,
                                      &space_info->priority_tickets);
                }
-
-               /*
-                * We were forced to add a reserve ticket, so our preemptive
-                * flushing is unable to keep up.  Clamp down on the threshold
-                * for the preemptive flushing in order to keep up with the
-                * workload.
-                */
-               maybe_clamp_preempt(fs_info, space_info);
        } else if (!ret && space_info->flags & BTRFS_BLOCK_GROUP_METADATA) {
                used += orig_bytes;
                /*