On 11/10/25 17:32, Chao Yu via Linux-f2fs-devel wrote:
> On 11/10/25 17:20, Yongpeng Yang wrote:
>> On 11/8/25 11:11, Chao Yu via Linux-f2fs-devel wrote:
>>> Yunlei,
>>>
>>> On 2025/11/7 14:29, Yunlei He wrote:
>>>> From: Yunlei He <[email protected]>
>>>>
>>>> GC move fbe data block will add some non uptodate page, we'd
>>>> better release it at the end.
>>>
>>> This is just for saving memory, right?
>>>
>>
>> Yes, move_data_block() doesn’t read any data to folio, and the GC
>> usually selects cold data. Therefore, this folio is typically not
>> uptodate, and there’s no need for it to occupy the page cache.
>>
>>>>
>>>> Signed-off-by: Yunlei He <[email protected]>
>>>> Signed-off-by: Yongpeng Yang <[email protected]>
>>>> ---
>>>> fs/f2fs/gc.c | 5 +++++
>>>> 1 file changed, 5 insertions(+)
>>>>
>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>> index 8abf521530ff..09b65e6ea853 100644
>>>> --- a/fs/f2fs/gc.c
>>>> +++ b/fs/f2fs/gc.c
>>>> @@ -1315,6 +1315,7 @@ static int move_data_block(struct inode *inode,
>>>> block_t bidx,
>>>> struct node_info ni;
>>>> struct folio *folio, *mfolio;
>>>> block_t newaddr;
>>>> + bool need_invalidate = true;
>>>> int err = 0;
>>>> bool lfs_mode = f2fs_lfs_mode(fio.sbi);
>>>> int type = fio.sbi->am.atgc_enabled && (gc_type == BG_GC) &&
>>>> @@ -1450,7 +1451,11 @@ static int move_data_block(struct inode *inode,
>>>> block_t bidx,
>>>> put_out:
>>>> f2fs_put_dnode(&dn);
>>>> out:
>>>> + if (folio_test_uptodate(folio))
>>>> + need_invalidate = false;
>>>
>>> How about dropping such folio under its lock?
>>>
>>> if (!folio_test_uptodate())
>>> truncate_inode_partial_folio()
>>>
>>
>> truncate_inode_partial_folio() is more efficient since it avoids looking
>> up the folio again, but it’s declared in mm/internal.h, so it cannot be
>> called directly.
>
> Yeah, or generic_error_remove_folio(), not sure.
>
> I just take a look to check whether there is a better alternative scheme.
How about the following modification? The folio is marked with
PG_dropbehind using __folio_set_dropbehind(), and is subsequently
removed from the page cache through folio_end_dropbehind().
Thanks,
Yongpeng
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -1326,6 +1326,7 @@ static int move_data_block(struct inode *inode,
block_t bidx,
folio = f2fs_grab_cache_folio(mapping, bidx, false);
if (IS_ERR(folio))
return PTR_ERR(folio);
+ __folio_set_dropbehind(folio);
if (!check_valid_map(F2FS_I_SB(inode), segno, off)) {
err = -ENOENT;
@@ -1453,7 +1454,10 @@ static int move_data_block(struct inode *inode,
block_t bidx,
put_out:
f2fs_put_dnode(&dn);
out:
- f2fs_folio_put(folio, true);
+ folio_unlock(folio);
+ folio_end_dropbehind(folio);
+ folio_put(folio);
return err;
}
>
> Thanks,
>
>>
>> Yongpeng,
>>
>>>> f2fs_folio_put(folio, true);
>>>> + if (need_invalidate)
>>>> + invalidate_mapping_pages(mapping, bidx, bidx);
>>>> return err;
>>>> }
>>>
>>>
>>>
>>> _______________________________________________
>>> Linux-f2fs-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>>
>
>
>
> _______________________________________________
> Linux-f2fs-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel