Message ID | 6fefb97af05081d344185334a36e90f093ccf310.1674822311.git.ojaswin@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | multiblock allocator improvements | expand |
On Fri 27-01-23 18:07:34, Ojaswin Mujoo wrote: > When we are inside ext4_mb_complex_scan_group() in CR1, we can be sure > that this group has atleast 1 big enough continuous free extent to satisfy > our request because (free / fragments) > goal length. > > Hence, instead of wasting time looping over smaller free extents, only > try to consider the free extent if we are sure that it has enough > continuous free space to satisfy goal length. This is particularly > useful when scanning highly fragmented BGs in CR1 as, without this > patch, the allocator might stop scanning early before reaching the big > enough free extent (due to ac_found > mb_max_to_scan) which causes us to > uncessarily trim the request. > > Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> > Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext4/mballoc.c | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index c4ab8f412d32..14529d2fe65f 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -2279,7 +2279,7 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, > struct super_block *sb = ac->ac_sb; > void *bitmap = e4b->bd_bitmap; > struct ext4_free_extent ex; > - int i; > + int i, j, freelen; > int free; > > free = e4b->bd_info->bb_free; > @@ -2306,6 +2306,23 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, > break; > } > > + if (ac->ac_criteria < CR2) { > + /* > + * In CR1, we are sure that this group will > + * have a large enough continuous free extent, so skip > + * over the smaller free extents > + */ > + j = mb_find_next_bit(bitmap, > + EXT4_CLUSTERS_PER_GROUP(sb), i); > + freelen = j - i; > + > + if (freelen < ac->ac_g_ex.fe_len) { > + i = j; > + free -= freelen; > + continue; > + } > + } > + > mb_find_extent(e4b, i, ac->ac_g_ex.fe_len, &ex); > if (WARN_ON(ex.fe_len <= 0)) > break; > -- > 2.31.1 >
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index c4ab8f412d32..14529d2fe65f 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -2279,7 +2279,7 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, struct super_block *sb = ac->ac_sb; void *bitmap = e4b->bd_bitmap; struct ext4_free_extent ex; - int i; + int i, j, freelen; int free; free = e4b->bd_info->bb_free; @@ -2306,6 +2306,23 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, break; } + if (ac->ac_criteria < CR2) { + /* + * In CR1, we are sure that this group will + * have a large enough continuous free extent, so skip + * over the smaller free extents + */ + j = mb_find_next_bit(bitmap, + EXT4_CLUSTERS_PER_GROUP(sb), i); + freelen = j - i; + + if (freelen < ac->ac_g_ex.fe_len) { + i = j; + free -= freelen; + continue; + } + } + mb_find_extent(e4b, i, ac->ac_g_ex.fe_len, &ex); if (WARN_ON(ex.fe_len <= 0)) break;