diff mbox

[v2] f2fs: add bug_on when f2fs_gc even fails to get one victim

Message ID 1507901500-162168-1-git-send-email-yunlong.song@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yunlong Song Oct. 13, 2017, 1:31 p.m. UTC
This can help us to debug on some corner case.

Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
---
 fs/f2fs/gc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Chao Yu Oct. 14, 2017, 12:17 a.m. UTC | #1
On 2017/10/13 21:31, Yunlong Song wrote:
> This can help us to debug on some corner case.

I can hit this bugon with generic/015 of fstest easily, could have a look at
this?

Thanks,

> 
> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> Signed-off-by: Chao Yu <yuchao0@huawei.com>
> ---
>  fs/f2fs/gc.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index 197ebf4..2b03202 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>  		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>  	};
> +	bool need_fggc = false;
>  
>  	trace_f2fs_gc_begin(sbi->sb, sync, background,
>  				get_pages(sbi, F2FS_DIRTY_NODES),
> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  			if (ret)
>  				goto stop;
>  		}
> -		if (has_not_enough_free_secs(sbi, 0, 0))
> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>  			gc_type = FG_GC;
> +			need_fggc = true;
> +		}
>  	}
>  
>  	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  		goto stop;
>  	}
>  	if (!__get_victim(sbi, &segno, gc_type)) {
> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>  		ret = -ENODATA;
>  		goto stop;
>  	}
>
Yunlong Song Oct. 14, 2017, 12:34 p.m. UTC | #2
Do you mean check out-of-space test? I have tried that but no bugon.

On 2017/10/14 8:17, Chao Yu wrote:
> On 2017/10/13 21:31, Yunlong Song wrote:
>> This can help us to debug on some corner case.
> I can hit this bugon with generic/015 of fstest easily, could have a look at
> this?
>
> Thanks,
>
>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>> ---
>>   fs/f2fs/gc.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>> index 197ebf4..2b03202 100644
>> --- a/fs/f2fs/gc.c
>> +++ b/fs/f2fs/gc.c
>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>   	};
>> +	bool need_fggc = false;
>>   
>>   	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>   				get_pages(sbi, F2FS_DIRTY_NODES),
>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   			if (ret)
>>   				goto stop;
>>   		}
>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>   			gc_type = FG_GC;
>> +			need_fggc = true;
>> +		}
>>   	}
>>   
>>   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   		goto stop;
>>   	}
>>   	if (!__get_victim(sbi, &segno, gc_type)) {
>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>   		ret = -ENODATA;
>>   		goto stop;
>>   	}
>>
> .
>
Chao Yu Oct. 16, 2017, 3:25 a.m. UTC | #3
On 2017/10/14 20:34, Yunlong Song wrote:
> Do you mean check out-of-space test? I have tried that but no bugon.

Yes, test recent f2fs codes with kernel 4.13.0-rc1+ in VM, FYI:

kernel BUG at gc.c:1034!
invalid opcode: 0000 [#1] SMP
Hardware name: Xen HVM domU, BIOS 4.1.2_115-900.260_ 11/06/2015
RIP: 0010:f2fs_gc+0x6e5/0x6f0 [f2fs]
RSP: 0018:ffffc90004af7b40 EFLAGS: 00010202
RAX: ffff8801b0a15940 RBX: 0000000000000000 RCX: 0000000000000000
RDX: ffff8801b0a15940 RSI: ffff8801978d5f00 RDI: ffff880128148048
RBP: ffffc90004af7c38 R08: ffff8801978d5f00 R09: 0000000000000003
R10: 0000000000000003 R11: ffff8800060703a0 R12: 0000000000000000
R13: 0000000000000000 R14: 0000000000000001 R15: ffff8801b4279800
FS:  00007f23493cb740(0000) GS:ffff880216f00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007ffd05402ff8 CR3: 00000001bffb3000 CR4: 00000000001406e0
Call Trace:
 f2fs_balance_fs+0x123/0x140 [f2fs]
 f2fs_create+0x130/0x240 [f2fs]
 path_openat+0xee7/0x1360
 do_filp_open+0x7e/0xd0
 do_sys_open+0x115/0x1f0
 SyS_open+0x1e/0x20
 do_syscall_64+0x6e/0x160
 entry_SYSCALL64_slow_path+0x25/0x25

Thanks,

> 
> On 2017/10/14 8:17, Chao Yu wrote:
>> On 2017/10/13 21:31, Yunlong Song wrote:
>>> This can help us to debug on some corner case.
>> I can hit this bugon with generic/015 of fstest easily, could have a look at
>> this?
>>
>> Thanks,
>>
>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>> ---
>>>   fs/f2fs/gc.c | 6 +++++-
>>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>> index 197ebf4..2b03202 100644
>>> --- a/fs/f2fs/gc.c
>>> +++ b/fs/f2fs/gc.c
>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>   	};
>>> +	bool need_fggc = false;
>>>   
>>>   	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>   				get_pages(sbi, F2FS_DIRTY_NODES),
>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>   			if (ret)
>>>   				goto stop;
>>>   		}
>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>   			gc_type = FG_GC;
>>> +			need_fggc = true;
>>> +		}
>>>   	}
>>>   
>>>   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>   		goto stop;
>>>   	}
>>>   	if (!__get_victim(sbi, &segno, gc_type)) {
>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>   		ret = -ENODATA;
>>>   		goto stop;
>>>   	}
>>>
>> .
>>
>
Yunlong Song Oct. 31, 2017, 1:32 a.m. UTC | #4
I think there may be bugs somewhere, since no victim is selected but it 
really needs gc.
What is the size of the data image?

On 2017/10/16 11:25, Chao Yu wrote:
> On 2017/10/14 20:34, Yunlong Song wrote:
>> Do you mean check out-of-space test? I have tried that but no bugon.
> Yes, test recent f2fs codes with kernel 4.13.0-rc1+ in VM, FYI:
>
> kernel BUG at gc.c:1034!
> invalid opcode: 0000 [#1] SMP
> Hardware name: Xen HVM domU, BIOS 4.1.2_115-900.260_ 11/06/2015
> RIP: 0010:f2fs_gc+0x6e5/0x6f0 [f2fs]
> RSP: 0018:ffffc90004af7b40 EFLAGS: 00010202
> RAX: ffff8801b0a15940 RBX: 0000000000000000 RCX: 0000000000000000
> RDX: ffff8801b0a15940 RSI: ffff8801978d5f00 RDI: ffff880128148048
> RBP: ffffc90004af7c38 R08: ffff8801978d5f00 R09: 0000000000000003
> R10: 0000000000000003 R11: ffff8800060703a0 R12: 0000000000000000
> R13: 0000000000000000 R14: 0000000000000001 R15: ffff8801b4279800
> FS:  00007f23493cb740(0000) GS:ffff880216f00000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 00007ffd05402ff8 CR3: 00000001bffb3000 CR4: 00000000001406e0
> Call Trace:
>   f2fs_balance_fs+0x123/0x140 [f2fs]
>   f2fs_create+0x130/0x240 [f2fs]
>   path_openat+0xee7/0x1360
>   do_filp_open+0x7e/0xd0
>   do_sys_open+0x115/0x1f0
>   SyS_open+0x1e/0x20
>   do_syscall_64+0x6e/0x160
>   entry_SYSCALL64_slow_path+0x25/0x25
>
> Thanks,
>
>> On 2017/10/14 8:17, Chao Yu wrote:
>>> On 2017/10/13 21:31, Yunlong Song wrote:
>>>> This can help us to debug on some corner case.
>>> I can hit this bugon with generic/015 of fstest easily, could have a look at
>>> this?
>>>
>>> Thanks,
>>>
>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>> ---
>>>>    fs/f2fs/gc.c | 6 +++++-
>>>>    1 file changed, 5 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>> index 197ebf4..2b03202 100644
>>>> --- a/fs/f2fs/gc.c
>>>> +++ b/fs/f2fs/gc.c
>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>    		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>    		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>    	};
>>>> +	bool need_fggc = false;
>>>>    
>>>>    	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>    				get_pages(sbi, F2FS_DIRTY_NODES),
>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>    			if (ret)
>>>>    				goto stop;
>>>>    		}
>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>    			gc_type = FG_GC;
>>>> +			need_fggc = true;
>>>> +		}
>>>>    	}
>>>>    
>>>>    	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>    		goto stop;
>>>>    	}
>>>>    	if (!__get_victim(sbi, &segno, gc_type)) {
>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>>    		ret = -ENODATA;
>>>>    		goto stop;
>>>>    	}
>>>>
>>> .
>>>
>
> .
>
Yunlong Song Nov. 3, 2017, 3:28 a.m. UTC | #5
ping...

On 2017/10/13 21:31, Yunlong Song wrote:
> This can help us to debug on some corner case.
>
> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> Signed-off-by: Chao Yu <yuchao0@huawei.com>
> ---
>   fs/f2fs/gc.c | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index 197ebf4..2b03202 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>   	};
> +	bool need_fggc = false;
>   
>   	trace_f2fs_gc_begin(sbi->sb, sync, background,
>   				get_pages(sbi, F2FS_DIRTY_NODES),
> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>   			if (ret)
>   				goto stop;
>   		}
> -		if (has_not_enough_free_secs(sbi, 0, 0))
> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>   			gc_type = FG_GC;
> +			need_fggc = true;
> +		}
>   	}
>   
>   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>   		goto stop;
>   	}
>   	if (!__get_victim(sbi, &segno, gc_type)) {
> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>   		ret = -ENODATA;
>   		goto stop;
>   	}
Jaegeuk Kim Nov. 3, 2017, 3:44 a.m. UTC | #6
On 10/13, Yunlong Song wrote:
> This can help us to debug on some corner case.
> 
> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> Signed-off-by: Chao Yu <yuchao0@huawei.com>
> ---
>  fs/f2fs/gc.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index 197ebf4..2b03202 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>  		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>  	};
> +	bool need_fggc = false;
>  
>  	trace_f2fs_gc_begin(sbi->sb, sync, background,
>  				get_pages(sbi, F2FS_DIRTY_NODES),
> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  			if (ret)
>  				goto stop;
>  		}
> -		if (has_not_enough_free_secs(sbi, 0, 0))
> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>  			gc_type = FG_GC;
> +			need_fggc = true;
> +		}
>  	}
>  
>  	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>  		goto stop;
>  	}
>  	if (!__get_victim(sbi, &segno, gc_type)) {
> +		f2fs_bug_on(sbi, !total_freed && need_fggc);

Just like this?

		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);

>  		ret = -ENODATA;
>  		goto stop;
>  	}
> -- 
> 1.8.5.2
宋云龙 Nov. 3, 2017, 3:08 p.m. UTC | #7
OK to me.

> 
> 
>> On 10/13, Yunlong Song wrote:
>> This can help us to debug on some corner case.
>> 
>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>> ---
>> fs/f2fs/gc.c | 6 +++++-
>> 1 file changed, 5 insertions(+), 1 deletion(-)
>> 
>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>> index 197ebf4..2b03202 100644
>> --- a/fs/f2fs/gc.c
>> +++ b/fs/f2fs/gc.c
>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>        .ilist = LIST_HEAD_INIT(gc_list.ilist),
>>        .iroot = RADIX_TREE_INIT(GFP_NOFS),
>>    };
>> +    bool need_fggc = false;
>> 
>>    trace_f2fs_gc_begin(sbi->sb, sync, background,
>>                get_pages(sbi, F2FS_DIRTY_NODES),
>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>            if (ret)
>>                goto stop;
>>        }
>> -        if (has_not_enough_free_secs(sbi, 0, 0))
>> +        if (has_not_enough_free_secs(sbi, 0, 0)) {
>>            gc_type = FG_GC;
>> +            need_fggc = true;
>> +        }
>>    }
>> 
>>    /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>        goto stop;
>>    }
>>    if (!__get_victim(sbi, &segno, gc_type)) {
>> +        f2fs_bug_on(sbi, !total_freed && need_fggc);
> 
> Just like this?
> 
>        f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);

Agree

> 
>>        ret = -ENODATA;
>>        goto stop;
>>    }
>> -- 
>> 1.8.5.2
Yunlong Song Nov. 6, 2017, 1:12 a.m. UTC | #8
Agree.

On 2017/11/3 11:44, Jaegeuk Kim wrote:
> On 10/13, Yunlong Song wrote:
>> This can help us to debug on some corner case.
>>
>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>> ---
>>   fs/f2fs/gc.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>> index 197ebf4..2b03202 100644
>> --- a/fs/f2fs/gc.c
>> +++ b/fs/f2fs/gc.c
>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>   	};
>> +	bool need_fggc = false;
>>   
>>   	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>   				get_pages(sbi, F2FS_DIRTY_NODES),
>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   			if (ret)
>>   				goto stop;
>>   		}
>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>   			gc_type = FG_GC;
>> +			need_fggc = true;
>> +		}
>>   	}
>>   
>>   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>   		goto stop;
>>   	}
>>   	if (!__get_victim(sbi, &segno, gc_type)) {
>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
> Just like this?
That's OK.

>
> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>
>>   		ret = -ENODATA;
>>   		goto stop;
>>   	}
>> -- 
>> 1.8.5.2
> .
>
Jaegeuk Kim Nov. 7, 2017, 2:38 a.m. UTC | #9
On 11/06, Yunlong Song wrote:
> Agree.
> 
> On 2017/11/3 11:44, Jaegeuk Kim wrote:
> > On 10/13, Yunlong Song wrote:
> > > This can help us to debug on some corner case.
> > > 
> > > Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> > > Signed-off-by: Chao Yu <yuchao0@huawei.com>
> > > ---
> > >   fs/f2fs/gc.c | 6 +++++-
> > >   1 file changed, 5 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > > index 197ebf4..2b03202 100644
> > > --- a/fs/f2fs/gc.c
> > > +++ b/fs/f2fs/gc.c
> > > @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > >   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
> > >   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
> > >   	};
> > > +	bool need_fggc = false;
> > >   	trace_f2fs_gc_begin(sbi->sb, sync, background,
> > >   				get_pages(sbi, F2FS_DIRTY_NODES),
> > > @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > >   			if (ret)
> > >   				goto stop;
> > >   		}
> > > -		if (has_not_enough_free_secs(sbi, 0, 0))
> > > +		if (has_not_enough_free_secs(sbi, 0, 0)) {
> > >   			gc_type = FG_GC;
> > > +			need_fggc = true;
> > > +		}
> > >   	}
> > >   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> > > @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > >   		goto stop;
> > >   	}
> > >   	if (!__get_victim(sbi, &segno, gc_type)) {
> > > +		f2fs_bug_on(sbi, !total_freed && need_fggc);
> > Just like this?
> That's OK.

I'm not quite sure whether this is really a bug_on case.
Let me make it WARN_ON() for debugging purpose first.

Thanks,

> 
> > 
> > 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
> > 
> > >   		ret = -ENODATA;
> > >   		goto stop;
> > >   	}
> > > -- 
> > > 1.8.5.2
> > .
> > 
> 
> -- 
> Thanks,
> Yunlong Song
>
Jaegeuk Kim Nov. 7, 2017, 2:40 a.m. UTC | #10
On 11/06, Jaegeuk Kim wrote:
> On 11/06, Yunlong Song wrote:
> > Agree.
> > 
> > On 2017/11/3 11:44, Jaegeuk Kim wrote:
> > > On 10/13, Yunlong Song wrote:
> > > > This can help us to debug on some corner case.
> > > > 
> > > > Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> > > > Signed-off-by: Chao Yu <yuchao0@huawei.com>
> > > > ---
> > > >   fs/f2fs/gc.c | 6 +++++-
> > > >   1 file changed, 5 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > > > index 197ebf4..2b03202 100644
> > > > --- a/fs/f2fs/gc.c
> > > > +++ b/fs/f2fs/gc.c
> > > > @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > >   		.ilist = LIST_HEAD_INIT(gc_list.ilist),
> > > >   		.iroot = RADIX_TREE_INIT(GFP_NOFS),
> > > >   	};
> > > > +	bool need_fggc = false;
> > > >   	trace_f2fs_gc_begin(sbi->sb, sync, background,
> > > >   				get_pages(sbi, F2FS_DIRTY_NODES),
> > > > @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > >   			if (ret)
> > > >   				goto stop;
> > > >   		}
> > > > -		if (has_not_enough_free_secs(sbi, 0, 0))
> > > > +		if (has_not_enough_free_secs(sbi, 0, 0)) {
> > > >   			gc_type = FG_GC;
> > > > +			need_fggc = true;
> > > > +		}
> > > >   	}
> > > >   	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> > > > @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > >   		goto stop;
> > > >   	}
> > > >   	if (!__get_victim(sbi, &segno, gc_type)) {
> > > > +		f2fs_bug_on(sbi, !total_freed && need_fggc);
> > > Just like this?
> > That's OK.
> 
> I'm not quite sure whether this is really a bug_on case.
> Let me make it WARN_ON() for debugging purpose first.

BTW, why is this the special case where BG_GC detects FG_GC?

> 
> Thanks,
> 
> > 
> > > 
> > > 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
> > > 
> > > >   		ret = -ENODATA;
> > > >   		goto stop;
> > > >   	}
> > > > -- 
> > > > 1.8.5.2
> > > .
> > > 
> > 
> > -- 
> > Thanks,
> > Yunlong Song
> >
Yunlong Song Nov. 7, 2017, 3:16 a.m. UTC | #11
Because I find that some out-of-free problem is caused by the failure
of get victim target. For example, chao has pointed out that he has
found out a bug when adding this bug_on last week.

On 2017/11/7 10:40, Jaegeuk Kim wrote:
> On 11/06, Jaegeuk Kim wrote:
>> On 11/06, Yunlong Song wrote:
>>> Agree.
>>>
>>> On 2017/11/3 11:44, Jaegeuk Kim wrote:
>>>> On 10/13, Yunlong Song wrote:
>>>>> This can help us to debug on some corner case.
>>>>>
>>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>>> ---
>>>>>    fs/f2fs/gc.c | 6 +++++-
>>>>>    1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>>> index 197ebf4..2b03202 100644
>>>>> --- a/fs/f2fs/gc.c
>>>>> +++ b/fs/f2fs/gc.c
>>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>    		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>>    		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>>    	};
>>>>> +	bool need_fggc = false;
>>>>>    	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>>    				get_pages(sbi, F2FS_DIRTY_NODES),
>>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>    			if (ret)
>>>>>    				goto stop;
>>>>>    		}
>>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>>    			gc_type = FG_GC;
>>>>> +			need_fggc = true;
>>>>> +		}
>>>>>    	}
>>>>>    	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>    		goto stop;
>>>>>    	}
>>>>>    	if (!__get_victim(sbi, &segno, gc_type)) {
>>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>> Just like this?
>>> That's OK.
>> I'm not quite sure whether this is really a bug_on case.
>> Let me make it WARN_ON() for debugging purpose first.
> BTW, why is this the special case where BG_GC detects FG_GC?
>
>> Thanks,
>>
>>>> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>>>>
>>>>>    		ret = -ENODATA;
>>>>>    		goto stop;
>>>>>    	}
>>>>> -- 
>>>>> 1.8.5.2
>>>> .
>>>>
>>> -- 
>>> Thanks,
>>> Yunlong Song
>>>
> .
>
Jaegeuk Kim Nov. 7, 2017, 3:26 a.m. UTC | #12
On 11/07, Yunlong Song wrote:
> Because I find that some out-of-free problem is caused by the failure
> of get victim target. For example, chao has pointed out that he has
> found out a bug when adding this bug_on last week.

That's NOT what I asked. Why not checking FG_GC all the time like this?

f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);

> 
> On 2017/11/7 10:40, Jaegeuk Kim wrote:
> > On 11/06, Jaegeuk Kim wrote:
> > > On 11/06, Yunlong Song wrote:
> > > > Agree.
> > > > 
> > > > On 2017/11/3 11:44, Jaegeuk Kim wrote:
> > > > > On 10/13, Yunlong Song wrote:
> > > > > > This can help us to debug on some corner case.
> > > > > > 
> > > > > > Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> > > > > > Signed-off-by: Chao Yu <yuchao0@huawei.com>
> > > > > > ---
> > > > > >    fs/f2fs/gc.c | 6 +++++-
> > > > > >    1 file changed, 5 insertions(+), 1 deletion(-)
> > > > > > 
> > > > > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > > > > > index 197ebf4..2b03202 100644
> > > > > > --- a/fs/f2fs/gc.c
> > > > > > +++ b/fs/f2fs/gc.c
> > > > > > @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > >    		.ilist = LIST_HEAD_INIT(gc_list.ilist),
> > > > > >    		.iroot = RADIX_TREE_INIT(GFP_NOFS),
> > > > > >    	};
> > > > > > +	bool need_fggc = false;
> > > > > >    	trace_f2fs_gc_begin(sbi->sb, sync, background,
> > > > > >    				get_pages(sbi, F2FS_DIRTY_NODES),
> > > > > > @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > >    			if (ret)
> > > > > >    				goto stop;
> > > > > >    		}
> > > > > > -		if (has_not_enough_free_secs(sbi, 0, 0))
> > > > > > +		if (has_not_enough_free_secs(sbi, 0, 0)) {
> > > > > >    			gc_type = FG_GC;
> > > > > > +			need_fggc = true;
> > > > > > +		}
> > > > > >    	}
> > > > > >    	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> > > > > > @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > >    		goto stop;
> > > > > >    	}
> > > > > >    	if (!__get_victim(sbi, &segno, gc_type)) {
> > > > > > +		f2fs_bug_on(sbi, !total_freed && need_fggc);
> > > > > Just like this?
> > > > That's OK.
> > > I'm not quite sure whether this is really a bug_on case.
> > > Let me make it WARN_ON() for debugging purpose first.
> > BTW, why is this the special case where BG_GC detects FG_GC?
> > 
> > > Thanks,
> > > 
> > > > > 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
> > > > > 
> > > > > >    		ret = -ENODATA;
> > > > > >    		goto stop;
> > > > > >    	}
> > > > > > -- 
> > > > > > 1.8.5.2
> > > > > .
> > > > > 
> > > > -- 
> > > > Thanks,
> > > > Yunlong Song
> > > > 
> > .
> > 
> 
> -- 
> Thanks,
> Yunlong Song
>
Yunlong Song Nov. 7, 2017, 4:01 a.m. UTC | #13
Sorry, misunderstanding, because I think when sync == true, FG_GC does not
check has_not_enough_free_secs, so maybe it does not have to do any gc 
at all.
For example, if there are 100 segments for f2fs, and 20 segments are full or
valid blocks over fggc_threshold, then it is correct to fail in get victim.


On 2017/11/7 11:26, Jaegeuk Kim wrote:
> On 11/07, Yunlong Song wrote:
>> Because I find that some out-of-free problem is caused by the failure
>> of get victim target. For example, chao has pointed out that he has
>> found out a bug when adding this bug_on last week.
> That's NOT what I asked. Why not checking FG_GC all the time like this?
>
> f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);
>
>> On 2017/11/7 10:40, Jaegeuk Kim wrote:
>>> On 11/06, Jaegeuk Kim wrote:
>>>> On 11/06, Yunlong Song wrote:
>>>>> Agree.
>>>>>
>>>>> On 2017/11/3 11:44, Jaegeuk Kim wrote:
>>>>>> On 10/13, Yunlong Song wrote:
>>>>>>> This can help us to debug on some corner case.
>>>>>>>
>>>>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>>>>> ---
>>>>>>>     fs/f2fs/gc.c | 6 +++++-
>>>>>>>     1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>>>>> index 197ebf4..2b03202 100644
>>>>>>> --- a/fs/f2fs/gc.c
>>>>>>> +++ b/fs/f2fs/gc.c
>>>>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>     		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>>>>     		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>>>>     	};
>>>>>>> +	bool need_fggc = false;
>>>>>>>     	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>>>>     				get_pages(sbi, F2FS_DIRTY_NODES),
>>>>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>     			if (ret)
>>>>>>>     				goto stop;
>>>>>>>     		}
>>>>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>>>>     			gc_type = FG_GC;
>>>>>>> +			need_fggc = true;
>>>>>>> +		}
>>>>>>>     	}
>>>>>>>     	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>     		goto stop;
>>>>>>>     	}
>>>>>>>     	if (!__get_victim(sbi, &segno, gc_type)) {
>>>>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>>>> Just like this?
>>>>> That's OK.
>>>> I'm not quite sure whether this is really a bug_on case.
>>>> Let me make it WARN_ON() for debugging purpose first.
>>> BTW, why is this the special case where BG_GC detects FG_GC?
>>>
>>>> Thanks,
>>>>
>>>>>> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>>>>>>
>>>>>>>     		ret = -ENODATA;
>>>>>>>     		goto stop;
>>>>>>>     	}
>>>>>>> -- 
>>>>>>> 1.8.5.2
>>>>>> .
>>>>>>
>>>>> -- 
>>>>> Thanks,
>>>>> Yunlong Song
>>>>>
>>> .
>>>
>> -- 
>> Thanks,
>> Yunlong Song
>>
> .
>
Chao Yu Nov. 7, 2017, 6:56 a.m. UTC | #14
On 2017/11/7 12:01, Yunlong Song wrote:
> Sorry, misunderstanding, because I think when sync == true, FG_GC does not
> check has_not_enough_free_secs, so maybe it does not have to do any gc 
> at all.
> For example, if there are 100 segments for f2fs, and 20 segments are full or
> valid blocks over fggc_threshold, then it is correct to fail in get victim.
> 
> 
> On 2017/11/7 11:26, Jaegeuk Kim wrote:
>> On 11/07, Yunlong Song wrote:
>>> Because I find that some out-of-free problem is caused by the failure
>>> of get victim target. For example, chao has pointed out that he has
>>> found out a bug when adding this bug_on last week.
>> That's NOT what I asked. Why not checking FG_GC all the time like this?
>>
>> f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);

ioctl(F2FS_IOC_GARBAGE_COLLECT, &1) will simply trigger this bug_on, so we
have to check the conditon only when we run out-of-free-space?

Thanks,

>>
>>> On 2017/11/7 10:40, Jaegeuk Kim wrote:
>>>> On 11/06, Jaegeuk Kim wrote:
>>>>> On 11/06, Yunlong Song wrote:
>>>>>> Agree.
>>>>>>
>>>>>> On 2017/11/3 11:44, Jaegeuk Kim wrote:
>>>>>>> On 10/13, Yunlong Song wrote:
>>>>>>>> This can help us to debug on some corner case.
>>>>>>>>
>>>>>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>>>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>>>>>> ---
>>>>>>>>     fs/f2fs/gc.c | 6 +++++-
>>>>>>>>     1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>>>>>> index 197ebf4..2b03202 100644
>>>>>>>> --- a/fs/f2fs/gc.c
>>>>>>>> +++ b/fs/f2fs/gc.c
>>>>>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>     		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>>>>>     		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>>>>>     	};
>>>>>>>> +	bool need_fggc = false;
>>>>>>>>     	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>>>>>     				get_pages(sbi, F2FS_DIRTY_NODES),
>>>>>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>     			if (ret)
>>>>>>>>     				goto stop;
>>>>>>>>     		}
>>>>>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>>>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>>>>>     			gc_type = FG_GC;
>>>>>>>> +			need_fggc = true;
>>>>>>>> +		}
>>>>>>>>     	}
>>>>>>>>     	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>>>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>     		goto stop;
>>>>>>>>     	}
>>>>>>>>     	if (!__get_victim(sbi, &segno, gc_type)) {
>>>>>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>>>>> Just like this?
>>>>>> That's OK.
>>>>> I'm not quite sure whether this is really a bug_on case.
>>>>> Let me make it WARN_ON() for debugging purpose first.
>>>> BTW, why is this the special case where BG_GC detects FG_GC?
>>>>
>>>>> Thanks,
>>>>>
>>>>>>> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>>>>>>>
>>>>>>>>     		ret = -ENODATA;
>>>>>>>>     		goto stop;
>>>>>>>>     	}
>>>>>>>> -- 
>>>>>>>> 1.8.5.2
>>>>>>> .
>>>>>>>
>>>>>> -- 
>>>>>> Thanks,
>>>>>> Yunlong Song
>>>>>>
>>>> .
>>>>
>>> -- 
>>> Thanks,
>>> Yunlong Song
>>>
>> .
>>
>
Yunlong Song Nov. 8, 2017, 3:06 a.m. UTC | #15
So we should use f2fs_bug_on(sbi, !total_freed && !sync && gc_type == 
FG_GC);

On 2017/11/7 14:56, Chao Yu wrote:
> On 2017/11/7 12:01, Yunlong Song wrote:
>> Sorry, misunderstanding, because I think when sync == true, FG_GC does not
>> check has_not_enough_free_secs, so maybe it does not have to do any gc
>> at all.
>> For example, if there are 100 segments for f2fs, and 20 segments are full or
>> valid blocks over fggc_threshold, then it is correct to fail in get victim.
>>
>>
>> On 2017/11/7 11:26, Jaegeuk Kim wrote:
>>> On 11/07, Yunlong Song wrote:
>>>> Because I find that some out-of-free problem is caused by the failure
>>>> of get victim target. For example, chao has pointed out that he has
>>>> found out a bug when adding this bug_on last week.
>>> That's NOT what I asked. Why not checking FG_GC all the time like this?
>>>
>>> f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);
> ioctl(F2FS_IOC_GARBAGE_COLLECT, &1) will simply trigger this bug_on, so we
> have to check the conditon only when we run out-of-free-space?
>
> Thanks,
>
>>>> On 2017/11/7 10:40, Jaegeuk Kim wrote:
>>>>> On 11/06, Jaegeuk Kim wrote:
>>>>>> On 11/06, Yunlong Song wrote:
>>>>>>> Agree.
>>>>>>>
>>>>>>> On 2017/11/3 11:44, Jaegeuk Kim wrote:
>>>>>>>> On 10/13, Yunlong Song wrote:
>>>>>>>>> This can help us to debug on some corner case.
>>>>>>>>>
>>>>>>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>>>>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>>>>>>> ---
>>>>>>>>>      fs/f2fs/gc.c | 6 +++++-
>>>>>>>>>      1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>>>>
>>>>>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>>>>>>> index 197ebf4..2b03202 100644
>>>>>>>>> --- a/fs/f2fs/gc.c
>>>>>>>>> +++ b/fs/f2fs/gc.c
>>>>>>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>      		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>>>>>>      		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>>>>>>      	};
>>>>>>>>> +	bool need_fggc = false;
>>>>>>>>>      	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>>>>>>      				get_pages(sbi, F2FS_DIRTY_NODES),
>>>>>>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>      			if (ret)
>>>>>>>>>      				goto stop;
>>>>>>>>>      		}
>>>>>>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>>>>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>>>>>>      			gc_type = FG_GC;
>>>>>>>>> +			need_fggc = true;
>>>>>>>>> +		}
>>>>>>>>>      	}
>>>>>>>>>      	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>>>>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>      		goto stop;
>>>>>>>>>      	}
>>>>>>>>>      	if (!__get_victim(sbi, &segno, gc_type)) {
>>>>>>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>>>>>> Just like this?
>>>>>>> That's OK.
>>>>>> I'm not quite sure whether this is really a bug_on case.
>>>>>> Let me make it WARN_ON() for debugging purpose first.
>>>>> BTW, why is this the special case where BG_GC detects FG_GC?
>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>>>> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>>>>>>>>
>>>>>>>>>      		ret = -ENODATA;
>>>>>>>>>      		goto stop;
>>>>>>>>>      	}
>>>>>>>>> -- 
>>>>>>>>> 1.8.5.2
>>>>>>>> .
>>>>>>>>
>>>>>>> -- 
>>>>>>> Thanks,
>>>>>>> Yunlong Song
>>>>>>>
>>>>> .
>>>>>
>>>> -- 
>>>> Thanks,
>>>> Yunlong Song
>>>>
>>> .
>>>
>
> .
>
Jaegeuk Kim Nov. 9, 2017, 5:59 p.m. UTC | #16
On 11/08, Yunlong Song wrote:
> So we should use f2fs_bug_on(sbi, !total_freed && !sync && gc_type ==
> FG_GC);

f2fs_bug_on(sbi, !total_freed && has_not_enough_free_secs(sbi, 0, 0)); ?

> 
> On 2017/11/7 14:56, Chao Yu wrote:
> > On 2017/11/7 12:01, Yunlong Song wrote:
> > > Sorry, misunderstanding, because I think when sync == true, FG_GC does not
> > > check has_not_enough_free_secs, so maybe it does not have to do any gc
> > > at all.
> > > For example, if there are 100 segments for f2fs, and 20 segments are full or
> > > valid blocks over fggc_threshold, then it is correct to fail in get victim.
> > > 
> > > 
> > > On 2017/11/7 11:26, Jaegeuk Kim wrote:
> > > > On 11/07, Yunlong Song wrote:
> > > > > Because I find that some out-of-free problem is caused by the failure
> > > > > of get victim target. For example, chao has pointed out that he has
> > > > > found out a bug when adding this bug_on last week.
> > > > That's NOT what I asked. Why not checking FG_GC all the time like this?
> > > > 
> > > > f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);
> > ioctl(F2FS_IOC_GARBAGE_COLLECT, &1) will simply trigger this bug_on, so we
> > have to check the conditon only when we run out-of-free-space?
> > 
> > Thanks,
> > 
> > > > > On 2017/11/7 10:40, Jaegeuk Kim wrote:
> > > > > > On 11/06, Jaegeuk Kim wrote:
> > > > > > > On 11/06, Yunlong Song wrote:
> > > > > > > > Agree.
> > > > > > > > 
> > > > > > > > On 2017/11/3 11:44, Jaegeuk Kim wrote:
> > > > > > > > > On 10/13, Yunlong Song wrote:
> > > > > > > > > > This can help us to debug on some corner case.
> > > > > > > > > > 
> > > > > > > > > > Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
> > > > > > > > > > Signed-off-by: Chao Yu <yuchao0@huawei.com>
> > > > > > > > > > ---
> > > > > > > > > >      fs/f2fs/gc.c | 6 +++++-
> > > > > > > > > >      1 file changed, 5 insertions(+), 1 deletion(-)
> > > > > > > > > > 
> > > > > > > > > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > > > > > > > > > index 197ebf4..2b03202 100644
> > > > > > > > > > --- a/fs/f2fs/gc.c
> > > > > > > > > > +++ b/fs/f2fs/gc.c
> > > > > > > > > > @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > > > > > >      		.ilist = LIST_HEAD_INIT(gc_list.ilist),
> > > > > > > > > >      		.iroot = RADIX_TREE_INIT(GFP_NOFS),
> > > > > > > > > >      	};
> > > > > > > > > > +	bool need_fggc = false;
> > > > > > > > > >      	trace_f2fs_gc_begin(sbi->sb, sync, background,
> > > > > > > > > >      				get_pages(sbi, F2FS_DIRTY_NODES),
> > > > > > > > > > @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > > > > > >      			if (ret)
> > > > > > > > > >      				goto stop;
> > > > > > > > > >      		}
> > > > > > > > > > -		if (has_not_enough_free_secs(sbi, 0, 0))
> > > > > > > > > > +		if (has_not_enough_free_secs(sbi, 0, 0)) {
> > > > > > > > > >      			gc_type = FG_GC;
> > > > > > > > > > +			need_fggc = true;
> > > > > > > > > > +		}
> > > > > > > > > >      	}
> > > > > > > > > >      	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
> > > > > > > > > > @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
> > > > > > > > > >      		goto stop;
> > > > > > > > > >      	}
> > > > > > > > > >      	if (!__get_victim(sbi, &segno, gc_type)) {
> > > > > > > > > > +		f2fs_bug_on(sbi, !total_freed && need_fggc);
> > > > > > > > > Just like this?
> > > > > > > > That's OK.
> > > > > > > I'm not quite sure whether this is really a bug_on case.
> > > > > > > Let me make it WARN_ON() for debugging purpose first.
> > > > > > BTW, why is this the special case where BG_GC detects FG_GC?
> > > > > > 
> > > > > > > Thanks,
> > > > > > > 
> > > > > > > > > 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
> > > > > > > > > 
> > > > > > > > > >      		ret = -ENODATA;
> > > > > > > > > >      		goto stop;
> > > > > > > > > >      	}
> > > > > > > > > > -- 
> > > > > > > > > > 1.8.5.2
> > > > > > > > > .
> > > > > > > > > 
> > > > > > > > -- 
> > > > > > > > Thanks,
> > > > > > > > Yunlong Song
> > > > > > > > 
> > > > > > .
> > > > > > 
> > > > > -- 
> > > > > Thanks,
> > > > > Yunlong Song
> > > > > 
> > > > .
> > > > 
> > 
> > .
> > 
> 
> -- 
> Thanks,
> Yunlong Song
>
Yunlong Song Nov. 10, 2017, 2:11 a.m. UTC | #17
Agree.

On 2017/11/10 1:59, Jaegeuk Kim wrote:
> On 11/08, Yunlong Song wrote:
>> So we should use f2fs_bug_on(sbi, !total_freed && !sync && gc_type ==
>> FG_GC);
> f2fs_bug_on(sbi, !total_freed && has_not_enough_free_secs(sbi, 0, 0)); ?
>
>> On 2017/11/7 14:56, Chao Yu wrote:
>>> On 2017/11/7 12:01, Yunlong Song wrote:
>>>> Sorry, misunderstanding, because I think when sync == true, FG_GC does not
>>>> check has_not_enough_free_secs, so maybe it does not have to do any gc
>>>> at all.
>>>> For example, if there are 100 segments for f2fs, and 20 segments are full or
>>>> valid blocks over fggc_threshold, then it is correct to fail in get victim.
>>>>
>>>>
>>>> On 2017/11/7 11:26, Jaegeuk Kim wrote:
>>>>> On 11/07, Yunlong Song wrote:
>>>>>> Because I find that some out-of-free problem is caused by the failure
>>>>>> of get victim target. For example, chao has pointed out that he has
>>>>>> found out a bug when adding this bug_on last week.
>>>>> That's NOT what I asked. Why not checking FG_GC all the time like this?
>>>>>
>>>>> f2fs_bug_on(sbi, !total_freed && gc_type == FG_GC);
>>> ioctl(F2FS_IOC_GARBAGE_COLLECT, &1) will simply trigger this bug_on, so we
>>> have to check the conditon only when we run out-of-free-space?
>>>
>>> Thanks,
>>>
>>>>>> On 2017/11/7 10:40, Jaegeuk Kim wrote:
>>>>>>> On 11/06, Jaegeuk Kim wrote:
>>>>>>>> On 11/06, Yunlong Song wrote:
>>>>>>>>> Agree.
>>>>>>>>>
>>>>>>>>> On 2017/11/3 11:44, Jaegeuk Kim wrote:
>>>>>>>>>> On 10/13, Yunlong Song wrote:
>>>>>>>>>>> This can help us to debug on some corner case.
>>>>>>>>>>>
>>>>>>>>>>> Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
>>>>>>>>>>> Signed-off-by: Chao Yu <yuchao0@huawei.com>
>>>>>>>>>>> ---
>>>>>>>>>>>       fs/f2fs/gc.c | 6 +++++-
>>>>>>>>>>>       1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>>>>>>
>>>>>>>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>>>>>>>>> index 197ebf4..2b03202 100644
>>>>>>>>>>> --- a/fs/f2fs/gc.c
>>>>>>>>>>> +++ b/fs/f2fs/gc.c
>>>>>>>>>>> @@ -986,6 +986,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>>>       		.ilist = LIST_HEAD_INIT(gc_list.ilist),
>>>>>>>>>>>       		.iroot = RADIX_TREE_INIT(GFP_NOFS),
>>>>>>>>>>>       	};
>>>>>>>>>>> +	bool need_fggc = false;
>>>>>>>>>>>       	trace_f2fs_gc_begin(sbi->sb, sync, background,
>>>>>>>>>>>       				get_pages(sbi, F2FS_DIRTY_NODES),
>>>>>>>>>>> @@ -1018,8 +1019,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>>>       			if (ret)
>>>>>>>>>>>       				goto stop;
>>>>>>>>>>>       		}
>>>>>>>>>>> -		if (has_not_enough_free_secs(sbi, 0, 0))
>>>>>>>>>>> +		if (has_not_enough_free_secs(sbi, 0, 0)) {
>>>>>>>>>>>       			gc_type = FG_GC;
>>>>>>>>>>> +			need_fggc = true;
>>>>>>>>>>> +		}
>>>>>>>>>>>       	}
>>>>>>>>>>>       	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
>>>>>>>>>>> @@ -1028,6 +1031,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
>>>>>>>>>>>       		goto stop;
>>>>>>>>>>>       	}
>>>>>>>>>>>       	if (!__get_victim(sbi, &segno, gc_type)) {
>>>>>>>>>>> +		f2fs_bug_on(sbi, !total_freed && need_fggc);
>>>>>>>>>> Just like this?
>>>>>>>>> That's OK.
>>>>>>>> I'm not quite sure whether this is really a bug_on case.
>>>>>>>> Let me make it WARN_ON() for debugging purpose first.
>>>>>>> BTW, why is this the special case where BG_GC detects FG_GC?
>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>>>> 		f2fs_bug_on(sbi, !total_freed && !sync && gc_type == FG_GC);
>>>>>>>>>>
>>>>>>>>>>>       		ret = -ENODATA;
>>>>>>>>>>>       		goto stop;
>>>>>>>>>>>       	}
>>>>>>>>>>> -- 
>>>>>>>>>>> 1.8.5.2
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> Thanks,
>>>>>>>>> Yunlong Song
>>>>>>>>>
>>>>>>> .
>>>>>>>
>>>>>> -- 
>>>>>> Thanks,
>>>>>> Yunlong Song
>>>>>>
>>>>> .
>>>>>
>>> .
>>>
>> -- 
>> Thanks,
>> Yunlong Song
>>
> .
>
diff mbox

Patch

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index 197ebf4..2b03202 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -986,6 +986,7 @@  int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
 		.ilist = LIST_HEAD_INIT(gc_list.ilist),
 		.iroot = RADIX_TREE_INIT(GFP_NOFS),
 	};
+	bool need_fggc = false;
 
 	trace_f2fs_gc_begin(sbi->sb, sync, background,
 				get_pages(sbi, F2FS_DIRTY_NODES),
@@ -1018,8 +1019,10 @@  int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
 			if (ret)
 				goto stop;
 		}
-		if (has_not_enough_free_secs(sbi, 0, 0))
+		if (has_not_enough_free_secs(sbi, 0, 0)) {
 			gc_type = FG_GC;
+			need_fggc = true;
+		}
 	}
 
 	/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
@@ -1028,6 +1031,7 @@  int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
 		goto stop;
 	}
 	if (!__get_victim(sbi, &segno, gc_type)) {
+		f2fs_bug_on(sbi, !total_freed && need_fggc);
 		ret = -ENODATA;
 		goto stop;
 	}