diff options
Diffstat (limited to 'fs/jbd/commit.c')
| -rw-r--r-- | fs/jbd/commit.c | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index 25719d902c5..3fbffb1ea71 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c @@ -306,6 +306,8 @@ void journal_commit_transaction(journal_t *journal)  	int flags;  	int err;  	unsigned long blocknr; +	ktime_t start_time; +	u64 commit_time;  	char *tagp = NULL;  	journal_header_t *header;  	journal_block_tag_t *tag = NULL; @@ -418,6 +420,7 @@ void journal_commit_transaction(journal_t *journal)  	commit_transaction->t_state = T_FLUSH;  	journal->j_committing_transaction = commit_transaction;  	journal->j_running_transaction = NULL; +	start_time = ktime_get();  	commit_transaction->t_log_start = journal->j_head;  	wake_up(&journal->j_wait_transaction_locked);  	spin_unlock(&journal->j_state_lock); @@ -913,6 +916,18 @@ restart_loop:  	J_ASSERT(commit_transaction == journal->j_committing_transaction);  	journal->j_commit_sequence = commit_transaction->t_tid;  	journal->j_committing_transaction = NULL; +	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time)); + +	/* +	 * weight the commit time higher than the average time so we don't +	 * react too strongly to vast changes in commit time +	 */ +	if (likely(journal->j_average_commit_time)) +		journal->j_average_commit_time = (commit_time*3 + +				journal->j_average_commit_time) / 4; +	else +		journal->j_average_commit_time = commit_time; +  	spin_unlock(&journal->j_state_lock);  	if (commit_transaction->t_checkpoint_list == NULL && | 
