Skip to content

Commit 4b41deb

Browse files
LiBaokun96tytso
authored andcommitted
ext4: remove unnecessary s_md_lock on update s_mb_last_group
After we optimized the block group lock, we found another lock contention issue when running will-it-scale/fallocate2 with multiple processes. The fallocate's block allocation and the truncate's block release were fighting over the s_md_lock. The problem is, this lock protects totally different things in those two processes: the list of freed data blocks (s_freed_data_list) when releasing, and where to start looking for new blocks (mb_last_group) when allocating. Now we only need to track s_mb_last_group and no longer need to track s_mb_last_start, so we don't need the s_md_lock lock to ensure that the two are consistent. Since s_mb_last_group is merely a hint and doesn't require strong synchronization, READ_ONCE/WRITE_ONCE is sufficient. Besides, the s_mb_last_group data type only requires ext4_group_t (i.e., unsigned int), rendering unsigned long superfluous. Performance test data follows: Test: Running will-it-scale/fallocate2 on CPU-bound containers. Observation: Average fallocate operations per container per second. |CPU: Kunpeng 920 | P80 | P1 | |Memory: 512GB |------------------------|-------------------------| |960GB SSD (0.5GB/s)| base | patched | base | patched | |-------------------|-------|----------------|--------|----------------| |mb_optimize_scan=0 | 4821 | 9636 (+99.8%) | 314065 | 337597 (+7.4%) | |mb_optimize_scan=1 | 4784 | 4834 (+1.04%) | 316344 | 341440 (+7.9%) | |CPU: AMD 9654 * 2 | P96 | P1 | |Memory: 1536GB |------------------------|-------------------------| |960GB SSD (1GB/s) | base | patched | base | patched | |-------------------|-------|----------------|--------|----------------| |mb_optimize_scan=0 | 15371 | 22341 (+45.3%) | 205851 | 219707 (+6.7%) | |mb_optimize_scan=1 | 6101 | 9177 (+50.4%) | 207373 | 215732 (+4.0%) | Suggested-by: Jan Kara <[email protected]> Signed-off-by: Baokun Li <[email protected]> Reviewed-by: Ojaswin Mujoo <[email protected]> Reviewed-by: Zhang Yi <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent f0374d8 commit 4b41deb

File tree

2 files changed

+4
-10
lines changed

2 files changed

+4
-10
lines changed

fs/ext4/ext4.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1630,7 +1630,7 @@ struct ext4_sb_info {
16301630
unsigned int s_mb_group_prealloc;
16311631
unsigned int s_max_dir_size_kb;
16321632
/* where last allocation was done - for stream allocation */
1633-
unsigned long s_mb_last_group;
1633+
ext4_group_t s_mb_last_group;
16341634
unsigned int s_mb_prefetch;
16351635
unsigned int s_mb_prefetch_limit;
16361636
unsigned int s_mb_best_avail_max_trim_order;

fs/ext4/mballoc.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,11 +2168,8 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
21682168
ac->ac_buddy_folio = e4b->bd_buddy_folio;
21692169
folio_get(ac->ac_buddy_folio);
21702170
/* store last allocated for subsequent stream allocation */
2171-
if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
2172-
spin_lock(&sbi->s_md_lock);
2173-
sbi->s_mb_last_group = ac->ac_f_ex.fe_group;
2174-
spin_unlock(&sbi->s_md_lock);
2175-
}
2171+
if (ac->ac_flags & EXT4_MB_STREAM_ALLOC)
2172+
WRITE_ONCE(sbi->s_mb_last_group, ac->ac_f_ex.fe_group);
21762173
/*
21772174
* As we've just preallocated more space than
21782175
* user requested originally, we store allocated
@@ -2845,10 +2842,7 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
28452842

28462843
/* if stream allocation is enabled, use global goal */
28472844
if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
2848-
/* TBD: may be hot point */
2849-
spin_lock(&sbi->s_md_lock);
2850-
ac->ac_g_ex.fe_group = sbi->s_mb_last_group;
2851-
spin_unlock(&sbi->s_md_lock);
2845+
ac->ac_g_ex.fe_group = READ_ONCE(sbi->s_mb_last_group);
28522846
ac->ac_g_ex.fe_start = -1;
28532847
ac->ac_flags &= ~EXT4_MB_HINT_TRY_GOAL;
28542848
}

0 commit comments

Comments
 (0)