f2fs: try grabbing node page lock aggressively in sync scenario
authorChao Yu <yuchao0@huawei.com>
Wed, 4 Jul 2018 10:04:10 +0000 (18:04 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Sun, 29 Jul 2018 01:26:08 +0000 (18:26 -0700)
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>
fs/f2fs/node.c

index 6f21319..8266473 100644 (file)
@@ -1638,7 +1638,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))) {