[Devel] [PATCH 5/6] ext4: don't iterate over sbi->s_es_list more than the number of elements
Alexander Mikhalitsyn
alexander.mikhalitsyn at virtuozzo.com
Fri May 28 20:09:31 MSK 2021
From: Konstantin Khorenko <khorenko at virtuozzo.com>
If there are several shrinkers working on a single sbi there can be easily a
situation when a neighbor shrinkers reclaimed a bunch of extents and thus a
bunch inoes from the s_es_list but we don't honor this and iterate over
sbi->s_es_list the number of times equal to the initial number of inodes in
s_es_list.
Before each iteration, check if we are going to iterate more than the number of
inodes in the list and adjust nr_to_walk accordingly.
https://jira.sw.ru/browse/PSBM-83335
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
Acked-by: Dmitry Monakhov <dmonakhov at openvz.org>
(cherry picked from commit 17a5132158a4956a1926a8d46f435d4e3ee54f91)
VZ 8 rebase part https://jira.sw.ru/browse/PSBM-127798
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>
---
fs/ext4/extents_status.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
index b0a49c5e081c..3a5711afadc0 100644
--- a/fs/ext4/extents_status.c
+++ b/fs/ext4/extents_status.c
@@ -1113,6 +1113,14 @@ static int __es_shrink(struct ext4_sb_info *sbi, int nr_to_scan,
spin_unlock(&sbi->s_es_lock);
goto out;
}
+ /*
+ * Another shrinker can remove a bunch of extents in parallel,
+ * we don't have to iterate more than the current number of
+ * inodes in the list.
+ */
+ if (nr_to_walk > sbi->s_es_nr_inode)
+ nr_to_walk = sbi->s_es_nr_inode;
+
ei = list_first_entry(&sbi->s_es_list, struct ext4_inode_info,
i_es_list);
/* Move the inode to the tail */
--
2.28.0
More information about the Devel
mailing list