diff options
author | Theodore Ts'o <tytso@mit.edu> | 2014-03-08 19:51:16 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-03-08 19:51:16 -0500 |
commit | 42cf3452d5f5b0817d27c93e4e7d7eab6e89077d (patch) | |
tree | 106d8e934c1c930d4fae822c76ff18d493492729 /fs/jbd2 | |
parent | 3469a32a1e948c54204b5dd6f7476a7d11349e9e (diff) |
jbd2: calculate statistics without holding j_state_lock and j_list_lock
The two hottest locks, and thus the biggest scalability bottlenecks,
in the jbd2 layer, are the j_list_lock and j_state_lock. This has
inspired some people to do some truly unnatural things[1].
[1] https://www.usenix.org/system/files/conference/fast14/fast14-paper_kang.pdf
We don't need to be holding both j_state_lock and j_list_lock while
calculating the journal statistics, so move those calculations to the
very end of jbd2_journal_commit_transaction.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/jbd2')
-rw-r--r-- | fs/jbd2/commit.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 765b31da4029..af36252b5b2d 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
@@ -1083,24 +1083,7 @@ restart_loop: | |||
1083 | atomic_read(&commit_transaction->t_handle_count); | 1083 | atomic_read(&commit_transaction->t_handle_count); |
1084 | trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, | 1084 | trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, |
1085 | commit_transaction->t_tid, &stats.run); | 1085 | commit_transaction->t_tid, &stats.run); |
1086 | 1086 | stats.ts_requested = (commit_transaction->t_requested) ? 1 : 0; | |
1087 | /* | ||
1088 | * Calculate overall stats | ||
1089 | */ | ||
1090 | spin_lock(&journal->j_history_lock); | ||
1091 | journal->j_stats.ts_tid++; | ||
1092 | if (commit_transaction->t_requested) | ||
1093 | journal->j_stats.ts_requested++; | ||
1094 | journal->j_stats.run.rs_wait += stats.run.rs_wait; | ||
1095 | journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; | ||
1096 | journal->j_stats.run.rs_running += stats.run.rs_running; | ||
1097 | journal->j_stats.run.rs_locked += stats.run.rs_locked; | ||
1098 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; | ||
1099 | journal->j_stats.run.rs_logging += stats.run.rs_logging; | ||
1100 | journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; | ||
1101 | journal->j_stats.run.rs_blocks += stats.run.rs_blocks; | ||
1102 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
1103 | spin_unlock(&journal->j_history_lock); | ||
1104 | 1087 | ||
1105 | commit_transaction->t_state = T_COMMIT_CALLBACK; | 1088 | commit_transaction->t_state = T_COMMIT_CALLBACK; |
1106 | J_ASSERT(commit_transaction == journal->j_committing_transaction); | 1089 | J_ASSERT(commit_transaction == journal->j_committing_transaction); |
@@ -1157,4 +1140,21 @@ restart_loop: | |||
1157 | spin_unlock(&journal->j_list_lock); | 1140 | spin_unlock(&journal->j_list_lock); |
1158 | write_unlock(&journal->j_state_lock); | 1141 | write_unlock(&journal->j_state_lock); |
1159 | wake_up(&journal->j_wait_done_commit); | 1142 | wake_up(&journal->j_wait_done_commit); |
1143 | |||
1144 | /* | ||
1145 | * Calculate overall stats | ||
1146 | */ | ||
1147 | spin_lock(&journal->j_history_lock); | ||
1148 | journal->j_stats.ts_tid++; | ||
1149 | journal->j_stats.ts_requested += stats.ts_requested; | ||
1150 | journal->j_stats.run.rs_wait += stats.run.rs_wait; | ||
1151 | journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; | ||
1152 | journal->j_stats.run.rs_running += stats.run.rs_running; | ||
1153 | journal->j_stats.run.rs_locked += stats.run.rs_locked; | ||
1154 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; | ||
1155 | journal->j_stats.run.rs_logging += stats.run.rs_logging; | ||
1156 | journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; | ||
1157 | journal->j_stats.run.rs_blocks += stats.run.rs_blocks; | ||
1158 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
1159 | spin_unlock(&journal->j_history_lock); | ||
1160 | } | 1160 | } |