Skip to content

Commit 35bfd4b

Browse files
LiBaokun96tytso
authored andcommitted
ext4: separate stream goal hits from s_bal_goals for better tracking
In ext4_mb_regular_allocator(), after the call to ext4_mb_find_by_goal() fails to achieve the inode goal, allocation continues with the stream allocation global goal. Currently, hits for both are combined in sbi->s_bal_goals, hindering accurate optimization. This commit separates global goal hits into sbi->s_bal_stream_goals. Since stream allocation doesn't use ac->ac_g_ex.fe_start, set fe_start to -1. This prevents stream allocations from being counted in s_bal_goals. Also clear EXT4_MB_HINT_TRY_GOAL to avoid calling ext4_mb_find_by_goal again. After adding `stream_goal_hits`, `/proc/fs/ext4/sdx/mb_stats` will show: mballoc: reqs: 840347 success: 750992 groups_scanned: 1230506 cr_p2_aligned_stats: hits: 21531 groups_considered: 411664 extents_scanned: 21531 useless_loops: 0 bad_suggestions: 6 cr_goal_fast_stats: hits: 111222 groups_considered: 1806728 extents_scanned: 467908 useless_loops: 0 bad_suggestions: 13 cr_best_avail_stats: hits: 36267 groups_considered: 1817631 extents_scanned: 156143 useless_loops: 0 bad_suggestions: 204 cr_goal_slow_stats: hits: 106396 groups_considered: 5671710 extents_scanned: 22540056 useless_loops: 123747 cr_any_free_stats: hits: 138071 groups_considered: 724692 extents_scanned: 23615593 useless_loops: 585 extents_scanned: 46804261 goal_hits: 1307 stream_goal_hits: 236317 len_goal_hits: 155549 2^n_hits: 21531 breaks: 225096 lost: 35062 buddies_generated: 40/40 buddies_time_used: 48004 preallocated: 5962467 discarded: 4847560 Signed-off-by: Baokun Li <libaokun1@huawei.com> Reviewed-by: Zhang Yi <yi.zhang@huawei.com> Link: https://patch.msgid.link/20250714130327.1830534-3-libaokun1@huawei.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
1 parent e9eec6f commit 35bfd4b

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

fs/ext4/ext4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,6 +1646,7 @@ struct ext4_sb_info {
16461646
atomic_t s_bal_cX_ex_scanned[EXT4_MB_NUM_CRS]; /* total extents scanned */
16471647
atomic_t s_bal_groups_scanned; /* number of groups scanned */
16481648
atomic_t s_bal_goals; /* goal hits */
1649+
atomic_t s_bal_stream_goals; /* stream allocation global goal hits */
16491650
atomic_t s_bal_len_goals; /* len goal hits */
16501651
atomic_t s_bal_breaks; /* too long searches */
16511652
atomic_t s_bal_2orders; /* 2^order hits */

fs/ext4/mballoc.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,8 +2849,9 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
28492849
/* TBD: may be hot point */
28502850
spin_lock(&sbi->s_md_lock);
28512851
ac->ac_g_ex.fe_group = sbi->s_mb_last_group;
2852-
ac->ac_g_ex.fe_start = sbi->s_mb_last_start;
28532852
spin_unlock(&sbi->s_md_lock);
2853+
ac->ac_g_ex.fe_start = -1;
2854+
ac->ac_flags &= ~EXT4_MB_HINT_TRY_GOAL;
28542855
}
28552856

28562857
/*
@@ -3000,8 +3001,12 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
30003001
}
30013002
}
30023003

3003-
if (sbi->s_mb_stats && ac->ac_status == AC_STATUS_FOUND)
3004+
if (sbi->s_mb_stats && ac->ac_status == AC_STATUS_FOUND) {
30043005
atomic64_inc(&sbi->s_bal_cX_hits[ac->ac_criteria]);
3006+
if (ac->ac_flags & EXT4_MB_STREAM_ALLOC &&
3007+
ac->ac_b_ex.fe_group == ac->ac_g_ex.fe_group)
3008+
atomic_inc(&sbi->s_bal_stream_goals);
3009+
}
30053010
out:
30063011
if (!err && ac->ac_status != AC_STATUS_FOUND && first_err)
30073012
err = first_err;
@@ -3194,6 +3199,8 @@ int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset)
31943199
seq_printf(seq, "\textents_scanned: %u\n",
31953200
atomic_read(&sbi->s_bal_ex_scanned));
31963201
seq_printf(seq, "\t\tgoal_hits: %u\n", atomic_read(&sbi->s_bal_goals));
3202+
seq_printf(seq, "\t\tstream_goal_hits: %u\n",
3203+
atomic_read(&sbi->s_bal_stream_goals));
31973204
seq_printf(seq, "\t\tlen_goal_hits: %u\n",
31983205
atomic_read(&sbi->s_bal_len_goals));
31993206
seq_printf(seq, "\t\t2^n_hits: %u\n", atomic_read(&sbi->s_bal_2orders));

0 commit comments

Comments
 (0)