| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Chao Yu <yuchao0@huawei.com> |
| Date: Wed, 4 Jul 2018 18:04:10 +0800 |
| Subject: f2fs: try grabbing node page lock aggressively in sync scenario |
| |
| From: Chao Yu <yuchao0@huawei.com> |
| |
| [ Upstream commit 4b270a8cc5047682f0a3f3f9af3b498408dbd2bc ] |
| |
| In synchronous scenario, like in checkpoint(), we are going to flush |
| dirty node pages to device synchronously, we can easily failed |
| writebacking node page due to trylock_page() failure, especially in |
| condition of intensive lock competition, which can cause long latency |
| of checkpoint(). So let's use lock_page() in synchronous scenario to |
| avoid this issue. |
| |
| Signed-off-by: Yunlei He <heyunlei@huawei.com> |
| Signed-off-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/f2fs/node.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/fs/f2fs/node.c |
| +++ b/fs/f2fs/node.c |
| @@ -1610,7 +1610,9 @@ next_step: |
| !is_cold_node(page))) |
| continue; |
| lock_node: |
| - if (!trylock_page(page)) |
| + if (wbc->sync_mode == WB_SYNC_ALL) |
| + lock_page(page); |
| + else if (!trylock_page(page)) |
| continue; |
| |
| if (unlikely(page->mapping != NODE_MAPPING(sbi))) { |