[rh7,3/3] ext4: don't iterate over sbi->s_es_list more than the number of elements

Submitted by Konstantin Khorenko on April 13, 2018, 10:08 a.m.

Details

Message ID 20180413100850.1097-4-khorenko@virtuozzo.com
State New
Series "ext4: speedup shrinking non-delay extents"
Headers show

Commit Message

Konstantin Khorenko April 13, 2018, 10:08 a.m.
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@virtuozzo.com>
---
 fs/ext4/extents_status.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Patch hide | download patch | download mbox

diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
index a3b9c480ec20..ed1f63eef74c 100644
--- a/fs/ext4/extents_status.c
+++ b/fs/ext4/extents_status.c
@@ -998,6 +998,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 */