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