Hi
> -----Original Message-----
> From: Fan Li [mailto:[email protected]]
> Sent: Monday, February 29, 2016 2:30 PM
> To: 'Jaegeuk Kim'
> Cc: [email protected]
> Subject: [f2fs-dev] [PATCH] f2fs: modify the readahead method in
> ra_node_page()
>
> ra_node_page() is used to read ahead one node page. Comparing to regular
> read, it's faster because it doesn't wait for IO completion.
> But if it is called twice for reading the same block, and the IO request
> from the first call hasn't been completed before the second call, the second
> call will have to wait until the read is over.
>
> Here use the code in __do_page_cache_readahead() to solve this problem.
> It does nothing when someone else already puts the page in mapping. The
> status of page should be assured by whoever puts it there.
> This implement also prevents alteration of page reference count.
>
> Signed-off-by: Fan li <[email protected]>
> ---
> fs/f2fs/node.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
> index 511c0e7..6d8f107 100644
> --- a/fs/f2fs/node.c
> +++ b/fs/f2fs/node.c
> @@ -1080,12 +1080,11 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
> return;
> f2fs_bug_on(sbi, check_nid_range(sbi, nid));
>
> - apage = find_get_page(NODE_MAPPING(sbi), nid);
> - if (apage && PageUptodate(apage)) {
> - f2fs_put_page(apage, 0);
> + rcu_read_lock();
> + apage = radix_tree_lookup(&NODE_MAPPING(sbi)->page_tree, nid);
> + rcu_read_unlock();
> + if (apage)
> return;
> - }
> - f2fs_put_page(apage, 0);
How about use trylock_page to avoid contention here?
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 26eb441..9cdb6f2 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1085,15 +1085,14 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
f2fs_bug_on(sbi, check_nid_range(sbi, nid));
apage = find_get_page(NODE_MAPPING(sbi), nid);
- if (apage && PageUptodate(apage)) {
+ if (!apage) {
+ apage = grab_cache_page(NODE_MAPPING(sbi), nid);
+ if (!apage)
+ return;
+ } else if (PageUptodate(apage) || !trylock_page(apage)) {
f2fs_put_page(apage, 0);
return;
}
- f2fs_put_page(apage, 0);
-
- apage = grab_cache_page(NODE_MAPPING(sbi), nid);
- if (!apage)
- return;
err = read_node_page(apage, READA);
f2fs_put_page(apage, err ? 1 : 0);
Thanks,
>
> apage = grab_cache_page(NODE_MAPPING(sbi), nid);
> if (!apage)
> --
> 1.7.9.5
>
>
> ------------------------------------------------------------------------------
> Site24x7 APM Insight: Get Deep Visibility into Application Performance
> APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
> Monitor end-to-end web transactions and take corrective actions now
> Troubleshoot faster and improve end-user experience. Signup Now!
> http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
> _______________________________________________
> Linux-f2fs-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel