Skip to content

Commit 1940265

Browse files
jankaratytso
authored andcommitted
ext4: avoid unnecessary spreading of allocations among groups
mb_set_largest_free_order() updates lists containing groups with largest chunk of free space of given order. The way it updates it leads to always moving the group to the tail of the list. Thus allocations looking for free space of given order effectively end up cycling through all groups (and due to initialization in last to first order). This spreads allocations among block groups which reduces performance for rotating disks or low-end flash media. Change mb_set_largest_free_order() to only update lists if the order of the largest free chunk in the group changed. Fixes: 196e402 ("ext4: improve cr 0 / cr 1 group scanning") CC: stable@kernel.org Reported-and-tested-by: Stefan Wahren <stefan.wahren@i2se.com> Tested-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/all/0d81a7c2-46b7-6010-62a4-3e6cfc1628d6@i2se.com/ Link: https://lore.kernel.org/r/20220908092136.11770-2-jack@suse.cz Signed-off-by: Theodore Ts'o <tytso@mit.edu>
1 parent 4fca50d commit 1940265

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

fs/ext4/mballoc.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,23 +1077,25 @@ mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp)
10771077
struct ext4_sb_info *sbi = EXT4_SB(sb);
10781078
int i;
10791079

1080-
if (test_opt2(sb, MB_OPTIMIZE_SCAN) && grp->bb_largest_free_order >= 0) {
1080+
for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--)
1081+
if (grp->bb_counters[i] > 0)
1082+
break;
1083+
/* No need to move between order lists? */
1084+
if (!test_opt2(sb, MB_OPTIMIZE_SCAN) ||
1085+
i == grp->bb_largest_free_order) {
1086+
grp->bb_largest_free_order = i;
1087+
return;
1088+
}
1089+
1090+
if (grp->bb_largest_free_order >= 0) {
10811091
write_lock(&sbi->s_mb_largest_free_orders_locks[
10821092
grp->bb_largest_free_order]);
10831093
list_del_init(&grp->bb_largest_free_order_node);
10841094
write_unlock(&sbi->s_mb_largest_free_orders_locks[
10851095
grp->bb_largest_free_order]);
10861096
}
1087-
grp->bb_largest_free_order = -1; /* uninit */
1088-
1089-
for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--) {
1090-
if (grp->bb_counters[i] > 0) {
1091-
grp->bb_largest_free_order = i;
1092-
break;
1093-
}
1094-
}
1095-
if (test_opt2(sb, MB_OPTIMIZE_SCAN) &&
1096-
grp->bb_largest_free_order >= 0 && grp->bb_free) {
1097+
grp->bb_largest_free_order = i;
1098+
if (grp->bb_largest_free_order >= 0 && grp->bb_free) {
10971099
write_lock(&sbi->s_mb_largest_free_orders_locks[
10981100
grp->bb_largest_free_order]);
10991101
list_add_tail(&grp->bb_largest_free_order_node,

0 commit comments

Comments
 (0)