|
Nikolay Borisov |
436acc |
From: Josef Bacik <josef@toxicpanda.com>
|
|
Nikolay Borisov |
436acc |
Date: Wed, 28 Apr 2021 13:38:48 -0400
|
|
Nikolay Borisov |
436acc |
Subject: btrfs: handle preemptive delalloc flushing slightly differently
|
|
Nikolay Borisov |
436acc |
Git-commit: 385f421f18be653d21ccfd6520fbddf206ad43eb
|
|
Nikolay Borisov |
436acc |
Patch-mainline: v5.14-rc1
|
|
Nikolay Borisov |
436acc |
References: bsc#1196195
|
|
Nikolay Borisov |
436acc |
|
|
Nikolay Borisov |
436acc |
If we decide to flush delalloc from the preemptive flusher, we really do
|
|
Nikolay Borisov |
436acc |
not want to wait on ordered extents, as it gains us nothing. However
|
|
Nikolay Borisov |
436acc |
there was logic to go ahead and wait on ordered extents if there was
|
|
Nikolay Borisov |
436acc |
more ordered bytes than delalloc bytes. We do not want this behavior,
|
|
Nikolay Borisov |
436acc |
so pass through whether this flushing is for preemption, and do not wait
|
|
Nikolay Borisov |
436acc |
for ordered extents if that's the case. Also break out of the shrink
|
|
Nikolay Borisov |
436acc |
loop after the first flushing, as we just want to one shot shrink
|
|
Nikolay Borisov |
436acc |
delalloc.
|
|
Nikolay Borisov |
436acc |
|
|
Nikolay Borisov |
436acc |
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
|
|
Nikolay Borisov |
436acc |
Signed-off-by: David Sterba <dsterba@suse.com>
|
|
Nikolay Borisov |
436acc |
Acked-by: Nikolay Borisov <nborisov@suse.com>
|
|
Nikolay Borisov |
436acc |
---
|
|
Nikolay Borisov |
436acc |
fs/btrfs/space-info.c | 15 ++++++++++++---
|
|
Nikolay Borisov |
436acc |
1 file changed, 12 insertions(+), 3 deletions(-)
|
|
Nikolay Borisov |
436acc |
|
|
Nikolay Borisov |
436acc |
diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c
|
|
Nikolay Borisov |
436acc |
index 639787beb57a..42d0fa2092d4 100644
|
|
Nikolay Borisov |
436acc |
--- a/fs/btrfs/space-info.c
|
|
Nikolay Borisov |
436acc |
+++ b/fs/btrfs/space-info.c
|
|
Nikolay Borisov |
436acc |
@@ -495,7 +495,8 @@ static inline u64 calc_reclaim_items_nr(struct btrfs_fs_info *fs_info,
|
|
Nikolay Borisov |
436acc |
*/
|
|
Nikolay Borisov |
436acc |
static void shrink_delalloc(struct btrfs_fs_info *fs_info,
|
|
Nikolay Borisov |
436acc |
struct btrfs_space_info *space_info,
|
|
Nikolay Borisov |
436acc |
- u64 to_reclaim, bool wait_ordered)
|
|
Nikolay Borisov |
436acc |
+ u64 to_reclaim, bool wait_ordered,
|
|
Nikolay Borisov |
436acc |
+ bool for_preempt)
|
|
Nikolay Borisov |
436acc |
{
|
|
Nikolay Borisov |
436acc |
struct btrfs_trans_handle *trans;
|
|
Nikolay Borisov |
436acc |
u64 delalloc_bytes;
|
|
Nikolay Borisov |
436acc |
@@ -532,7 +533,7 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,
|
|
Nikolay Borisov |
436acc |
* ordered extents, otherwise we'll waste time trying to flush delalloc
|
|
Nikolay Borisov |
436acc |
* that likely won't give us the space back we need.
|
|
Nikolay Borisov |
436acc |
*/
|
|
Nikolay Borisov |
436acc |
- if (ordered_bytes > delalloc_bytes)
|
|
Nikolay Borisov |
436acc |
+ if (ordered_bytes > delalloc_bytes && !for_preempt)
|
|
Nikolay Borisov |
436acc |
wait_ordered = true;
|
|
Nikolay Borisov |
436acc |
|
|
Nikolay Borisov |
436acc |
loops = 0;
|
|
Nikolay Borisov |
436acc |
@@ -551,6 +552,14 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,
|
|
Nikolay Borisov |
436acc |
break;
|
|
Nikolay Borisov |
436acc |
}
|
|
Nikolay Borisov |
436acc |
|
|
Nikolay Borisov |
436acc |
+ /*
|
|
Nikolay Borisov |
436acc |
+ * If we are for preemption we just want a one-shot of delalloc
|
|
Nikolay Borisov |
436acc |
+ * flushing so we can stop flushing if we decide we don't need
|
|
Nikolay Borisov |
436acc |
+ * to anymore.
|
|
Nikolay Borisov |
436acc |
+ */
|
|
Nikolay Borisov |
436acc |
+ if (for_preempt)
|
|
Nikolay Borisov |
436acc |
+ break;
|
|
Nikolay Borisov |
436acc |
+
|
|
Nikolay Borisov |
436acc |
spin_lock(&space_info->lock);
|
|
Nikolay Borisov |
436acc |
if (list_empty(&space_info->tickets) &&
|
|
Nikolay Borisov |
436acc |
list_empty(&space_info->priority_tickets)) {
|
|
Nikolay Borisov |
436acc |
@@ -702,7 +711,7 @@ static void flush_space(struct btrfs_fs_info *fs_info,
|
|
Nikolay Borisov |
436acc |
case FLUSH_DELALLOC:
|
|
Nikolay Borisov |
436acc |
case FLUSH_DELALLOC_WAIT:
|
|
Nikolay Borisov |
436acc |
shrink_delalloc(fs_info, space_info, num_bytes,
|
|
Nikolay Borisov |
436acc |
- state == FLUSH_DELALLOC_WAIT);
|
|
Nikolay Borisov |
436acc |
+ state == FLUSH_DELALLOC_WAIT, for_preempt);
|
|
Nikolay Borisov |
436acc |
break;
|
|
Nikolay Borisov |
436acc |
case FLUSH_DELAYED_REFS_NR:
|
|
Nikolay Borisov |
436acc |
case FLUSH_DELAYED_REFS:
|
|
Nikolay Borisov |
436acc |
|