diff options
author | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 05:00:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 05:00:00 -0400 |
commit | c35a56a090eacefca07afeb994029b57d8dd8025 (patch) | |
tree | 2a42c07c270b07725d9798bc89bc9aa0aaf2c184 /fs/jbd2/transaction.c | |
parent | c445e3e0a5c2804524dec6e55f66d63f6bc5bc3e (diff) |
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>
Diffstat (limited to 'fs/jbd2/transaction.c')
-rw-r--r-- | fs/jbd2/transaction.c | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index bfc70f57900f..e214d68620ac 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -1311,7 +1311,6 @@ int jbd2_journal_stop(handle_t *handle) | |||
1311 | if (handle->h_sync) | 1311 | if (handle->h_sync) |
1312 | transaction->t_synchronous_commit = 1; | 1312 | transaction->t_synchronous_commit = 1; |
1313 | current->journal_info = NULL; | 1313 | current->journal_info = NULL; |
1314 | spin_lock(&journal->j_state_lock); | ||
1315 | spin_lock(&transaction->t_handle_lock); | 1314 | spin_lock(&transaction->t_handle_lock); |
1316 | transaction->t_outstanding_credits -= handle->h_buffer_credits; | 1315 | transaction->t_outstanding_credits -= handle->h_buffer_credits; |
1317 | transaction->t_updates--; | 1316 | transaction->t_updates--; |
@@ -1340,8 +1339,7 @@ int jbd2_journal_stop(handle_t *handle) | |||
1340 | jbd_debug(2, "transaction too old, requesting commit for " | 1339 | jbd_debug(2, "transaction too old, requesting commit for " |
1341 | "handle %p\n", handle); | 1340 | "handle %p\n", handle); |
1342 | /* This is non-blocking */ | 1341 | /* This is non-blocking */ |
1343 | __jbd2_log_start_commit(journal, transaction->t_tid); | 1342 | jbd2_log_start_commit(journal, transaction->t_tid); |
1344 | spin_unlock(&journal->j_state_lock); | ||
1345 | 1343 | ||
1346 | /* | 1344 | /* |
1347 | * Special case: JBD2_SYNC synchronous updates require us | 1345 | * Special case: JBD2_SYNC synchronous updates require us |
@@ -1351,7 +1349,6 @@ int jbd2_journal_stop(handle_t *handle) | |||
1351 | err = jbd2_log_wait_commit(journal, tid); | 1349 | err = jbd2_log_wait_commit(journal, tid); |
1352 | } else { | 1350 | } else { |
1353 | spin_unlock(&transaction->t_handle_lock); | 1351 | spin_unlock(&transaction->t_handle_lock); |
1354 | spin_unlock(&journal->j_state_lock); | ||
1355 | } | 1352 | } |
1356 | 1353 | ||
1357 | lock_map_release(&handle->h_lockdep_map); | 1354 | lock_map_release(&handle->h_lockdep_map); |