jbd2: Improve scalability by not taking j_state_lock in jbd2_journal_stop()
One of the most contended locks in the jbd2 layer is j_state_lock when running dbench. This is especially true if using the real-time kernel with its "sleeping spinlocks" patch that replaces spinlocks with priority inheriting mutexes --- but it also shows up on large SMP benchmarks. Thanks to John Stultz for pointing this out. Reviewed by Mingming Cao and Jan Kara. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
c445e3e0a5
commit
c35a56a090
|
@ -1311,7 +1311,6 @@ int jbd2_journal_stop(handle_t *handle)
|
||||||
if (handle->h_sync)
|
if (handle->h_sync)
|
||||||
transaction->t_synchronous_commit = 1;
|
transaction->t_synchronous_commit = 1;
|
||||||
current->journal_info = NULL;
|
current->journal_info = NULL;
|
||||||
spin_lock(&journal->j_state_lock);
|
|
||||||
spin_lock(&transaction->t_handle_lock);
|
spin_lock(&transaction->t_handle_lock);
|
||||||
transaction->t_outstanding_credits -= handle->h_buffer_credits;
|
transaction->t_outstanding_credits -= handle->h_buffer_credits;
|
||||||
transaction->t_updates--;
|
transaction->t_updates--;
|
||||||
|
@ -1340,8 +1339,7 @@ int jbd2_journal_stop(handle_t *handle)
|
||||||
jbd_debug(2, "transaction too old, requesting commit for "
|
jbd_debug(2, "transaction too old, requesting commit for "
|
||||||
"handle %p\n", handle);
|
"handle %p\n", handle);
|
||||||
/* This is non-blocking */
|
/* This is non-blocking */
|
||||||
__jbd2_log_start_commit(journal, transaction->t_tid);
|
jbd2_log_start_commit(journal, transaction->t_tid);
|
||||||
spin_unlock(&journal->j_state_lock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special case: JBD2_SYNC synchronous updates require us
|
* Special case: JBD2_SYNC synchronous updates require us
|
||||||
|
@ -1351,7 +1349,6 @@ int jbd2_journal_stop(handle_t *handle)
|
||||||
err = jbd2_log_wait_commit(journal, tid);
|
err = jbd2_log_wait_commit(journal, tid);
|
||||||
} else {
|
} else {
|
||||||
spin_unlock(&transaction->t_handle_lock);
|
spin_unlock(&transaction->t_handle_lock);
|
||||||
spin_unlock(&journal->j_state_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_map_release(&handle->h_lockdep_map);
|
lock_map_release(&handle->h_lockdep_map);
|
||||||
|
|
Loading…
Reference in New Issue