On Tue, Jun 14, 2022 at 12:46:47PM +0800, Jinke Han wrote: > From: hanjinke <hanjinke.666@xxxxxxxxxxxxx> > > When release group lock, a large number of blocks may be alloc from > the group(e.g. not from the rest of target trim range). This may > lead end of the loop and leave the rest of trim range unprocessed. Hi, you're correct. Indeed it's possible to miss some of the blocks this way. But I wonder how much of a problem this actually is? I'd think that the optimization you just took out is very usefull, especially with larger minlen and more fragmented free space it'll save us a lot of cycles. Do you have any performance numbers for this change? Perhaps we don't have to remove it completely, rather zero the free_count every time bb_free changes? Would that be worth it? -Lukas > > Signed-off-by: hanjinke <hanjinke.666@xxxxxxxxxxxxx> > --- > fs/ext4/mballoc.c | 6 +----- > 1 file changed, 1 insertion(+), 5 deletions(-) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index 9f12f29bc346..45eb9ee20947 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -6345,14 +6345,13 @@ static int ext4_try_to_trim_range(struct super_block *sb, > __acquires(ext4_group_lock_ptr(sb, e4b->bd_group)) > __releases(ext4_group_lock_ptr(sb, e4b->bd_group)) > { > - ext4_grpblk_t next, count, free_count; > + ext4_grpblk_t next, count; > void *bitmap; > > bitmap = e4b->bd_bitmap; > start = (e4b->bd_info->bb_first_free > start) ? > e4b->bd_info->bb_first_free : start; > count = 0; > - free_count = 0; > > while (start <= max) { > start = mb_find_next_zero_bit(bitmap, max + 1, start); > @@ -6367,7 +6366,6 @@ __releases(ext4_group_lock_ptr(sb, e4b->bd_group)) > break; > count += next - start; > } > - free_count += next - start; > start = next + 1; > > if (fatal_signal_pending(current)) { > @@ -6381,8 +6379,6 @@ __releases(ext4_group_lock_ptr(sb, e4b->bd_group)) > ext4_lock_group(sb, e4b->bd_group); > } > > - if ((e4b->bd_info->bb_free - free_count) < minblocks) > - break; > } > > return count; > -- > 2.20.1 >