From: Chao Yu <chao@kernel.org>
To: Weichao Guo <guoweichao@huawei.com>,
yuchao0@huawei.com, linux-f2fs-devel@lists.sourceforge.net,
jaegeuk@kernel.org
Cc: huxinwei@huawei.com
Subject: Re: [PATCH v2] F2FS customized migrate_page callback
Date: Mon, 19 Sep 2016 22:48:52 +0800 [thread overview]
Message-ID: <fcba58f7-4cd5-23f9-d7bd-6616eedda470@kernel.org> (raw)
In-Reply-To: <1474319007-87855-1-git-send-email-guoweichao@huawei.com>
On 2016/9/20 5:03, Weichao Guo wrote:
> This patch improves the migration of dirty pages and allows migrating atomic
> written pages that F2FS uses in Page Cache. Instead of the fallback releasing
> page path, it provides better performance for memory compaction, CMA and other
> users of memory page migrating. For dirty pages, there is no need to write back
> first when migrating. For an atomic written page before committing, we can
> migrate the page and update the related 'inmem_pages' list at the same time.
>
> Signed-off-by: Weichao Guo <guoweichao@huawei.com>
> ---
> fs/f2fs/checkpoint.c | 3 +++
> fs/f2fs/data.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> fs/f2fs/f2fs.h | 4 ++++
> fs/f2fs/node.c | 3 +++
> 4 files changed, 66 insertions(+)
>
> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> index df56a43..a366521 100644
> --- a/fs/f2fs/checkpoint.c
> +++ b/fs/f2fs/checkpoint.c
> @@ -388,6 +388,9 @@ const struct address_space_operations f2fs_meta_aops = {
> .set_page_dirty = f2fs_set_meta_page_dirty,
> .invalidatepage = f2fs_invalidate_page,
> .releasepage = f2fs_release_page,
> +#ifdef CONFIG_MIGRATION
> + .migratepage = f2fs_migrate_page,
> +#endif
> };
>
> static void __add_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type)
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 528c3c0..eb0d63f 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -1882,6 +1882,59 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
> return generic_block_bmap(mapping, block, get_data_block_bmap);
> }
>
> +#ifdef CONFIG_MIGRATION
> +
> +#include <linux/migrate.h>
> +
> +int f2fs_migrate_page(struct address_space *mapping,
> + struct page *newpage, struct page *page, enum migrate_mode mode)
> +{
> + int rc, extra_count;
> + struct f2fs_inode_info *fi = F2FS_I(mapping->host);
> + bool atomic_written = IS_ATOMIC_WRITTEN_PAGE(page);
> +
> + BUG_ON(PageWriteback(page));
> +
> + /* migrating an atomic written page is safe with the inmem_lock hold */
> + if (atomic_written && !mutex_trylock(&fi->inmem_lock))
> + return -EAGAIN;
> +
> + /*
> + * A reference is expected if PagePrivate set when move mapping,
> + * however F2FS breaks this for maintaining dirty page counts when
> + * truncating pages. So here adjusting the 'extra_count' make it work.
> + */
> + extra_count = (atomic_written ? 1 : 0) - page_has_private(page);
> + rc = migrate_page_move_mapping(mapping, newpage,
> + page, NULL, mode, extra_count);
> + if (rc != MIGRATEPAGE_SUCCESS) {
> + if (atomic_written)
> + mutex_unlock(&fi->inmem_lock);
> + return rc;
> + }
> +
> + if (atomic_written) {
> + struct inmem_pages *cur;
> + list_for_each_entry(cur, &fi->inmem_pages, list)
> + if (cur->page == page) {
> + cur->page = newpage;
> + break;
> + }
> + mutex_unlock(&fi->inmem_lock);
> + put_page(page);
> + get_page(newpage);
Should we also do put_page(oldpage) & get_page(newpage) for non-atomic-written page?
Thanks,
> + }
> +
> + if (PagePrivate(page))
> + SetPagePrivate(newpage);
> + set_page_private(newpage, page_private(page));
> +
> + migrate_page_copy(newpage, page);
> +
> + return MIGRATEPAGE_SUCCESS;
> +}
> +#endif
> +
> const struct address_space_operations f2fs_dblock_aops = {
> .readpage = f2fs_read_data_page,
> .readpages = f2fs_read_data_pages,
> @@ -1894,4 +1947,7 @@ const struct address_space_operations f2fs_dblock_aops = {
> .releasepage = f2fs_release_page,
> .direct_IO = f2fs_direct_IO,
> .bmap = f2fs_bmap,
> +#ifdef CONFIG_MIGRATION
> + .migratepage = f2fs_migrate_page,
> +#endif
> };
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 5d2aa6a..b951482 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2126,6 +2126,10 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64);
> void f2fs_set_page_dirty_nobuffers(struct page *);
> void f2fs_invalidate_page(struct page *, unsigned int, unsigned int);
> int f2fs_release_page(struct page *, gfp_t);
> +#ifdef CONFIG_MIGRATION
> +int f2fs_migrate_page(struct address_space *mapping,
> + struct page *newpage, struct page *page, enum migrate_mode mode);
> +#endif
>
> /*
> * gc.c
> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
> index 2322a8e..55c22a9 100644
> --- a/fs/f2fs/node.c
> +++ b/fs/f2fs/node.c
> @@ -1670,6 +1670,9 @@ const struct address_space_operations f2fs_node_aops = {
> .set_page_dirty = f2fs_set_node_page_dirty,
> .invalidatepage = f2fs_invalidate_page,
> .releasepage = f2fs_release_page,
> +#ifdef CONFIG_MIGRATION
> + .migratepage = f2fs_migrate_page,
> +#endif
> };
>
> static struct free_nid *__lookup_free_nid_list(struct f2fs_nm_info *nm_i,
>
------------------------------------------------------------------------------
next prev parent reply other threads:[~2016-09-19 14:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-19 21:03 [PATCH v2] F2FS customized migrate_page callback Weichao Guo
2016-09-19 14:48 ` Chao Yu [this message]
2016-09-20 2:20 ` guoweichao
2016-09-20 15:02 ` Chao Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fcba58f7-4cd5-23f9-d7bd-6616eedda470@kernel.org \
--to=chao@kernel.org \
--cc=guoweichao@huawei.com \
--cc=huxinwei@huawei.com \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=yuchao0@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).