Messages in this thread | | | Date | Sat, 28 Jul 2018 19:44:56 -0700 | From | Jaegeuk Kim <> | Subject | Re: [PATCH 4/4] f2fs: fix to spread clear_cold_data() |
| |
On 07/29, Chao Yu wrote: > On 2018/7/29 10:00, Jaegeuk Kim wrote: > > On 07/27, Chao Yu wrote: > >> We need to drop PG_checked flag on page as well when we clear PG_uptodate > >> flag, in order to avoid treating the page as GCing one later. > > > > What do you mean "treating the page as GCing one"? > > I mean if PG_checked flag in page is not cleared, allocator will make it goes > into cold area. > > static int __get_segment_type_6(struct f2fs_io_info *fio) > ... > if (is_cold_data(fio->page) || file_is_cold(inode)) > return CURSEG_COLD_DATA;
This will come only when page is dirty. So, it'd better to clear this in f2fs_set_data_page_dirty()? set_cold_data() is called after set_page_dirty().
> > Thanks, > > > > >> > >> Signed-off-by: Weichao Guo <guoweichao@huawei.com> > >> Signed-off-by: Chao Yu <yuchao0@huawei.com> > >> --- > >> fs/f2fs/data.c | 8 +++++++- > >> fs/f2fs/dir.c | 1 + > >> fs/f2fs/segment.c | 4 +++- > >> 3 files changed, 11 insertions(+), 2 deletions(-) > >> > >> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > >> index a29f3162b887..2817e2f4eb17 100644 > >> --- a/fs/f2fs/data.c > >> +++ b/fs/f2fs/data.c > >> @@ -1768,6 +1768,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) > >> /* This page is already truncated */ > >> if (fio->old_blkaddr == NULL_ADDR) { > >> ClearPageUptodate(page); > >> + clear_cold_data(page); > >> goto out_writepage; > >> } > >> got_it: > >> @@ -1943,8 +1944,10 @@ static int __write_data_page(struct page *page, bool *submitted, > >> > >> out: > >> inode_dec_dirty_pages(inode); > >> - if (err) > >> + if (err) { > >> ClearPageUptodate(page); > >> + clear_cold_data(page); > >> + } > >> > >> if (wbc->for_reclaim) { > >> f2fs_submit_merged_write_cond(sbi, inode, 0, page->index, DATA); > >> @@ -2534,6 +2537,8 @@ void f2fs_invalidate_page(struct page *page, unsigned int offset, > >> } > >> } > >> > >> + clear_cold_data(page); > >> + > >> /* This is atomic written page, keep Private */ > >> if (IS_ATOMIC_WRITTEN_PAGE(page)) > >> return f2fs_drop_inmem_page(inode, page); > >> @@ -2552,6 +2557,7 @@ int f2fs_release_page(struct page *page, gfp_t wait) > >> if (IS_ATOMIC_WRITTEN_PAGE(page)) > >> return 0; > >> > >> + clear_cold_data(page); > >> set_page_private(page, 0); > >> ClearPagePrivate(page); > >> return 1; > >> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c > >> index 7f955c4e86a4..1e4a4122eb0c 100644 > >> --- a/fs/f2fs/dir.c > >> +++ b/fs/f2fs/dir.c > >> @@ -734,6 +734,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page, > >> clear_page_dirty_for_io(page); > >> ClearPagePrivate(page); > >> ClearPageUptodate(page); > >> + clear_cold_data(page); > >> inode_dec_dirty_pages(dir); > >> f2fs_remove_dirty_inode(dir); > >> } > >> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > >> index 58abbdc53561..4d83961745e6 100644 > >> --- a/fs/f2fs/segment.c > >> +++ b/fs/f2fs/segment.c > >> @@ -267,8 +267,10 @@ static int __revoke_inmem_pages(struct inode *inode, > >> } > >> next: > >> /* we don't need to invalidate this in the sccessful status */ > >> - if (drop || recover) > >> + if (drop || recover) { > >> ClearPageUptodate(page); > >> + clear_cold_data(page); > >> + } > >> set_page_private(page, 0); > >> ClearPagePrivate(page); > >> f2fs_put_page(page, 1); > >> -- > >> 2.18.0.rc1
| |