4cf5a7d99a
(generated with debian/scripts/import-upstream-tag) Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
57 lines
2.1 KiB
Diff
57 lines
2.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Ojaswin Mujoo <ojaswin@linux.ibm.com>
|
|
Date: Fri, 15 Dec 2023 16:49:50 +0530
|
|
Subject: [PATCH] ext4: fallback to complex scan if aligned scan doesn't work
|
|
|
|
Currently in case the goal length is a multiple of stripe size we use
|
|
ext4_mb_scan_aligned() to find the stripe size aligned physical blocks.
|
|
In case we are not able to find any, we again go back to calling
|
|
ext4_mb_choose_next_group() to search for a different suitable block
|
|
group. However, since the linear search always begins from the start,
|
|
most of the times we end up with the same BG and the cycle continues.
|
|
|
|
With large fliesystems, the CPU can be stuck in this loop for hours
|
|
which can slow down the whole system. Hence, until we figure out a
|
|
better way to continue the search (rather than starting from beginning)
|
|
in ext4_mb_choose_next_group(), lets just fallback to
|
|
ext4_mb_complex_scan_group() in case aligned scan fails, as it is much
|
|
more likely to find the needed blocks.
|
|
|
|
Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
|
|
---
|
|
fs/ext4/mballoc.c | 21 +++++++++++++--------
|
|
1 file changed, 13 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
|
|
index 5246b408cf0c..e3b942664842 100644
|
|
--- a/fs/ext4/mballoc.c
|
|
+++ b/fs/ext4/mballoc.c
|
|
@@ -2894,14 +2894,19 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
|
|
ac->ac_groups_scanned++;
|
|
if (cr == CR_POWER2_ALIGNED)
|
|
ext4_mb_simple_scan_group(ac, &e4b);
|
|
- else if ((cr == CR_GOAL_LEN_FAST ||
|
|
- cr == CR_BEST_AVAIL_LEN) &&
|
|
- sbi->s_stripe &&
|
|
- !(ac->ac_g_ex.fe_len %
|
|
- EXT4_B2C(sbi, sbi->s_stripe)))
|
|
- ext4_mb_scan_aligned(ac, &e4b);
|
|
- else
|
|
- ext4_mb_complex_scan_group(ac, &e4b);
|
|
+ else {
|
|
+ bool is_stripe_aligned = sbi->s_stripe &&
|
|
+ !(ac->ac_g_ex.fe_len %
|
|
+ EXT4_B2C(sbi, sbi->s_stripe));
|
|
+
|
|
+ if ((cr == CR_GOAL_LEN_FAST ||
|
|
+ cr == CR_BEST_AVAIL_LEN) &&
|
|
+ is_stripe_aligned)
|
|
+ ext4_mb_scan_aligned(ac, &e4b);
|
|
+
|
|
+ if (ac->ac_status == AC_STATUS_CONTINUE)
|
|
+ ext4_mb_complex_scan_group(ac, &e4b);
|
|
+ }
|
|
|
|
ext4_unlock_group(sb, group);
|
|
ext4_mb_unload_buddy(&e4b);
|