Re: [RFC 07/11] ext4: Avoid scanning smaller extents in BG during CR1

Jan Kara
2023-03-09T12:21:13Z

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
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR