f2fs: don't sleep while grabing nat_tree_lock
This tries to fix priority inversion in the below condition resulting in long checkpoint delay. f2fs_get_node_info() - nat_tree_lock -> sleep to grab journal_rwsem by contention checkpoint - waiting for nat_tree_lock In order to let checkpoint go, let's release nat_tree_lock, if there's a journal_rwsem contention. Change-Id: I72ca6cf52908a08976c200be32a09fb3105e726e Signed-off-by: Daeho Jeong <daehojeong@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Git-commit: 2eeb0dce728a7eac3e4dfe355d98af40d61f7a26 Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git Signed-off-by: Sayali Lokhande <sayalil@codeaurora.org>
This commit is contained in:
parent
8c79c6778a
commit
815cc3957a
1 changed files with 13 additions and 4 deletions
|
@ -534,7 +534,7 @@ int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
|
|||
int i;
|
||||
|
||||
ni->nid = nid;
|
||||
|
||||
retry:
|
||||
/* Check nat cache */
|
||||
down_read(&nm_i->nat_tree_lock);
|
||||
e = __lookup_nat_cache(nm_i, nid);
|
||||
|
@ -546,10 +546,19 @@ int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
|
|||
return 0;
|
||||
}
|
||||
|
||||
memset(&ne, 0, sizeof(struct f2fs_nat_entry));
|
||||
/*
|
||||
* Check current segment summary by trying to grab journal_rwsem first.
|
||||
* This sem is on the critical path on the checkpoint requiring the above
|
||||
* nat_tree_lock. Therefore, we should retry, if we failed to grab here
|
||||
* while not bothering checkpoint.
|
||||
*/
|
||||
if (!rwsem_is_locked(&sbi->cp_global_sem)) {
|
||||
down_read(&curseg->journal_rwsem);
|
||||
} else if (!down_read_trylock(&curseg->journal_rwsem)) {
|
||||
up_read(&nm_i->nat_tree_lock);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/* Check current segment summary */
|
||||
down_read(&curseg->journal_rwsem);
|
||||
i = f2fs_lookup_journal_in_cursum(journal, NAT_JOURNAL, nid, 0);
|
||||
if (i >= 0) {
|
||||
ne = nat_in_journal(journal, i);
|
||||
|
|
Loading…
Reference in a new issue