2020-08-07 14:06:19

by brookxu.cn

[permalink] [raw]
Subject: [PATCH] ext4: optimize the implementation of ext4_mb_good_group()

It might be better to adjust the code in two places:
1. Determine whether grp is currupt or not should be placed first.
2. (cr<=2 && free <ac->ac_g_ex.fe_len)should may belong to the crx
strategy, and it may be more appropriate to put it in the
subsequent switch statement block. For cr1, cr2, the conditions
in switch potentially realize the above judgment. For cr0, we
should add (free <ac->ac_g_ex.fe_len) judgment, and then delete
(free / fragments) >= ac->ac_g_ex.fe_len), because cr0 returns
true by default.

Signed-off-by: Chunguang Xu <[email protected]>
---
fs/ext4/mballoc.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 28a139f..4304113 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -2119,13 +2119,11 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,

BUG_ON(cr < 0 || cr >= 4);

- free = grp->bb_free;
- if (free == 0)
- return false;
- if (cr <= 2 && free < ac->ac_g_ex.fe_len)
+ if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
return false;

- if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
+ free = grp->bb_free;
+ if (free == 0)
return false;

fragments = grp->bb_fragments;
@@ -2142,8 +2140,10 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
((group % flex_size) == 0))
return false;

- if ((ac->ac_2order > ac->ac_sb->s_blocksize_bits+1) ||
- (free / fragments) >= ac->ac_g_ex.fe_len)
+ if (free < ac->ac_g_ex.fe_len)
+ return false;
+
+ if (ac->ac_2order > ac->ac_sb->s_blocksize_bits+1)
return true;

if (grp->bb_largest_free_order < ac->ac_2order)
--
1.8.3.1


2020-08-12 22:16:00

by Andreas Dilger

[permalink] [raw]
Subject: Re: [PATCH] ext4: optimize the implementation of ext4_mb_good_group()

On Aug 7, 2020, at 8:01 AM, brookxu <[email protected]> wrote:
>
> It might be better to adjust the code in two places:
> 1. Determine whether grp is currupt or not should be placed first.
> 2. (cr<=2 && free <ac->ac_g_ex.fe_len)should may belong to the crx
> strategy, and it may be more appropriate to put it in the
> subsequent switch statement block. For cr1, cr2, the conditions
> in switch potentially realize the above judgment. For cr0, we
> should add (free <ac->ac_g_ex.fe_len) judgment, and then delete
> (free / fragments) >= ac->ac_g_ex.fe_len), because cr0 returns
> true by default.
>

> Signed-off-by: Chunguang Xu <[email protected]>

This looks correct. Not quite as simple as moving a few lines around,
but I think the logic is equivalent.

Reviewed-by: Andreas Dilger <[email protected]>

> ---
> fs/ext4/mballoc.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 28a139f..4304113 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -2119,13 +2119,11 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
>
> BUG_ON(cr < 0 || cr >= 4);

This could also potentially be removed and keep only "BUG()" in the
default: case, though it would be good to print the value of "cr".

>
> - free = grp->bb_free;
> - if (free == 0)
> - return false;
> - if (cr <= 2 && free < ac->ac_g_ex.fe_len)
> + if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
> return false;
>
> - if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
> + free = grp->bb_free;
> + if (free == 0)
> return false;
>
> fragments = grp->bb_fragments;
> @@ -2142,8 +2140,10 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
> ((group % flex_size) == 0))
> return false;
>
> - if ((ac->ac_2order > ac->ac_sb->s_blocksize_bits+1) ||
> - (free / fragments) >= ac->ac_g_ex.fe_len)
> + if (free < ac->ac_g_ex.fe_len)
> + return false;
> +
> + if (ac->ac_2order > ac->ac_sb->s_blocksize_bits+1)
> return true;
>
> if (grp->bb_largest_free_order < ac->ac_2order)
> --
> 1.8.3.1
>


Cheers, Andreas






Attachments:
signature.asc (890.00 B)
Message signed with OpenPGP

2020-08-13 15:34:36

by Ritesh Harjani

[permalink] [raw]
Subject: Re: [PATCH] ext4: optimize the implementation of ext4_mb_good_group()



On 8/7/20 7:31 PM, brookxu wrote:
> It might be better to adjust the code in two places:
> 1. Determine whether grp is currupt or not should be placed first.
> 2. (cr<=2 && free <ac->ac_g_ex.fe_len)should may belong to the crx
> strategy, and it may be more appropriate to put it in the
> subsequent switch statement block. For cr1, cr2, the conditions
> in switch potentially realize the above judgment. For cr0, we
> should add (free <ac->ac_g_ex.fe_len) judgment, and then delete
> (free / fragments) >= ac->ac_g_ex.fe_len), because cr0 returns
> true by default.
>
> Signed-off-by: Chunguang Xu <[email protected]>


Nice cleanup. This makes it less confusing :)

Logic looks fine to me.
Reviewed-by: Ritesh Harjani <[email protected]>


> ---
> fs/ext4/mballoc.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 28a139f..4304113 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -2119,13 +2119,11 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
>
> BUG_ON(cr < 0 || cr >= 4);
>
> - free = grp->bb_free;
> - if (free == 0)
> - return false;
> - if (cr <= 2 && free < ac->ac_g_ex.fe_len)
> + if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
> return false;
>
> - if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
> + free = grp->bb_free;
> + if (free == 0)
> return false;
>
> fragments = grp->bb_fragments;
> @@ -2142,8 +2140,10 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
> ((group % flex_size) == 0))
> return false;
>
> - if ((ac->ac_2order > ac->ac_sb->s_blocksize_bits+1) ||
> - (free / fragments) >= ac->ac_g_ex.fe_len)
> + if (free < ac->ac_g_ex.fe_len)
> + return false;
> +
> + if (ac->ac_2order > ac->ac_sb->s_blocksize_bits+1)
> return true;
>
> if (grp->bb_largest_free_order < ac->ac_2order)
>

2020-08-18 18:19:19

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: optimize the implementation of ext4_mb_good_group()

On Fri, Aug 07, 2020 at 10:01:39PM +0800, brookxu wrote:
> It might be better to adjust the code in two places:
> 1. Determine whether grp is currupt or not should be placed first.
> 2. (cr<=2 && free <ac->ac_g_ex.fe_len)should may belong to the crx
> strategy, and it may be more appropriate to put it in the
> subsequent switch statement block. For cr1, cr2, the conditions
> in switch potentially realize the above judgment. For cr0, we
> should add (free <ac->ac_g_ex.fe_len) judgment, and then delete
> (free / fragments) >= ac->ac_g_ex.fe_len), because cr0 returns
> true by default.
>
> Signed-off-by: Chunguang Xu <[email protected]>

Thanks, applied.

- Ted