]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
jbd2: don't hold j_state_lock while calling wake_up()
authorTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 00:11:36 +0000 (19:11 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 00:11:36 +0000 (19:11 -0500)
The j_state_lock is one of the hottest locks in the jbd2 layer and
thus one of its scalability bottlenecks.

We don't need to be holding the j_state_lock while we are calling
wake_up(&journal->j_wait_commit), so release the lock a little bit
earlier.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/jbd2/journal.c

index 244b6f6b7908e6c717ceff2a30c45148bbadd7d6..67b8e303946ceaa79a0fd0d39ecd8ca428b67f1f 100644 (file)
@@ -302,8 +302,8 @@ static void journal_kill_thread(journal_t *journal)
        journal->j_flags |= JBD2_UNMOUNT;
 
        while (journal->j_task) {
-               wake_up(&journal->j_wait_commit);
                write_unlock(&journal->j_state_lock);
+               wake_up(&journal->j_wait_commit);
                wait_event(journal->j_wait_done_commit, journal->j_task == NULL);
                write_lock(&journal->j_state_lock);
        }
@@ -710,8 +710,8 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid)
        while (tid_gt(tid, journal->j_commit_sequence)) {
                jbd_debug(1, "JBD2: want %d, j_commit_sequence=%d\n",
                                  tid, journal->j_commit_sequence);
-               wake_up(&journal->j_wait_commit);
                read_unlock(&journal->j_state_lock);
+               wake_up(&journal->j_wait_commit);
                wait_event(journal->j_wait_done_commit,
                                !tid_gt(tid, journal->j_commit_sequence));
                read_lock(&journal->j_state_lock);