Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 815cc395 authored by Jaegeuk Kim's avatar Jaegeuk Kim Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarDaeho Jeong <daehojeong@google.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
Git-commit: 2eeb0dce728a7eac3e4dfe355d98af40d61f7a26
Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git


Signed-off-by: default avatarSayali Lokhande <sayalil@codeaurora.org>
parent 8c79c677
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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 */
	/*
	 * 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;
	}

	i = f2fs_lookup_journal_in_cursum(journal, NAT_JOURNAL, nid, 0);
	if (i >= 0) {
		ne = nat_in_journal(journal, i);