2019-06-06 09:39:52

by Sahitya Tummala

[permalink] [raw]
Subject: [PATCH] f2fs: fix is_idle() check for discard type

The discard thread should issue upto dpolicy->max_requests at once
and wait for all those discard requests at once it reaches
dpolicy->max_requests. It should then sleep for dpolicy->min_interval
timeout before issuing the next batch of discard requests. But in the
current code of is_idle(), it checks for dcc_info->queued_discard and
aborts issuing the discard batch of max_requests. This
dcc_info->queued_discard will be true always once one discard command
is issued.

It is thus resulting into this type of discard request pattern -

- Issue discard request#1
- is_idle() returns false, discard thread waits for request#1 and then
sleeps for min_interval 50ms.
- Issue discard request#2
- is_idle() returns false, discard thread waits for request#2 and then
sleeps for min_interval 50ms.
- and so on for all other discard requests, assuming f2fs is idle w.r.t
other conditions.

With this fix, the pattern will look like this -

- Issue discard request#1
- Issue discard request#2
and so on upto max_requests of 8
- Issue discard request#8
- wait for min_interval 50ms.

Signed-off-by: Sahitya Tummala <[email protected]>
---
fs/f2fs/f2fs.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 95adedb..ea34fef 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2209,7 +2209,7 @@ static inline bool is_idle(struct f2fs_sb_info *sbi, int type)
get_pages(sbi, F2FS_DIO_WRITE))
return false;

- if (SM_I(sbi) && SM_I(sbi)->dcc_info &&
+ if (type != DISCARD_TIME && SM_I(sbi) && SM_I(sbi)->dcc_info &&
atomic_read(&SM_I(sbi)->dcc_info->queued_discard))
return false;

--
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.


2019-06-13 16:41:57

by Chao Yu

[permalink] [raw]
Subject: Re: [PATCH] f2fs: fix is_idle() check for discard type

On 2019/6/6 17:38, Sahitya Tummala wrote:
> The discard thread should issue upto dpolicy->max_requests at once
> and wait for all those discard requests at once it reaches
> dpolicy->max_requests. It should then sleep for dpolicy->min_interval
> timeout before issuing the next batch of discard requests. But in the
> current code of is_idle(), it checks for dcc_info->queued_discard and
> aborts issuing the discard batch of max_requests. This
> dcc_info->queued_discard will be true always once one discard command
> is issued.
>
> It is thus resulting into this type of discard request pattern -
>
> - Issue discard request#1
> - is_idle() returns false, discard thread waits for request#1 and then
> sleeps for min_interval 50ms.
> - Issue discard request#2
> - is_idle() returns false, discard thread waits for request#2 and then
> sleeps for min_interval 50ms.
> - and so on for all other discard requests, assuming f2fs is idle w.r.t
> other conditions.
>
> With this fix, the pattern will look like this -
>
> - Issue discard request#1
> - Issue discard request#2
> and so on upto max_requests of 8
> - Issue discard request#8
> - wait for min_interval 50ms.
>

Fixes: fef4129ec2e6 ("f2fs: fix to be aware discard/preflush/dio command in
is_idle()")

> Signed-off-by: Sahitya Tummala <[email protected]>

Ah, thanks for fixing this bug.

Reviewed-by: Chao Yu <[email protected]>

Thanks,