Re: [PATCH v3 10/12] btrfs: implement space clamping for preemptive flushing
From: David Sterba <hidden>
Date: 2020-10-29 17:50:30
On Fri, Oct 09, 2020 at 09:28:27AM -0400, Josef Bacik wrote:
+static inline void maybe_clamp_preempt(struct btrfs_fs_info *fs_info,
+ struct btrfs_space_info *space_info)
+{
+ u64 ordered = percpu_counter_sum_positive(&fs_info->ordered_bytes);
+ u64 delalloc = percpu_counter_sum_positive(&fs_info->delalloc_bytes);
+
+ /*
+ * If we're heavy on ordered operations then clamping won't help us. We
+ * need to clamp specifically to keep up with dirty'ing buffered
+ * writers, because there's not a 1:1 correlation of writing delalloc
+ * and freeing space, like there is with flushing delayed refs or
+ * delayed nodes. If we're already more ordered than delalloc then
+ * we're keeping up, otherwise we aren't and should probably clamp.
+ */
+ if (ordered < delalloc)
+ space_info->clamp = min(space_info->clamp + 1, 8);So the divisor will go up to 2^8 = 256, is that intentional?
quoted hunk ↗ jump to hunk
--- a/fs/btrfs/space-info.h +++ b/fs/btrfs/space-info.h@@ -22,6 +22,9 @@ struct btrfs_space_info { the space info if we had an ENOSPC in the allocator. */ + int clamp; /* Used to scale our threshold for preemptive + flushing. */
Struct comments should go on the line before so we don't have this awkward formatting but the rest of the struct has that so let it be. One thing I'm missing is that it's power of two, I'll add it there.
+ unsigned int full:1; /* indicates that we cannot allocate any more chunks for this space */ unsigned int chunk_alloc:1; /* set if we are allocating a chunk */ -- 2.26.2