提交 cf55eb91 编写于 作者: J Jan Kara 提交者: Yang Yingliang

jbd2: Fine tune estimate of necessary descriptor blocks

mainline inclusion
from mainline-5.5-rc1
commit 19014d697147c6aea3a34eea00a2844e698d070f
category: bugfix
bugzilla: 25031
CVE: NA
---------------------------

Currently we reserve j_max_transaction_buffers / 32 for transaction
descriptor blocks. Now that revoke descriptors are accounted for
separately this estimate is unnecessarily high and we can actually
compute much tighter estimate. In the common case of 32k journal blocks
and 4k blocksize this actually reduces the amount of reserved descriptor
blocks from 256 to ~25 which allows us to fit more real data into a
transaction.
Signed-off-by: NJan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20191105164437.32602-25-jack@suse.czSigned-off-by: NTheodore Ts'o <tytso@mit.edu>
Signed-off-by: Nzhangyi (F) <yi.zhang@huawei.com>
Reviewed-by: NYang Erkun <yangerkun@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 92a8f9f1
...@@ -63,14 +63,25 @@ void jbd2_journal_free_transaction(transaction_t *transaction) ...@@ -63,14 +63,25 @@ void jbd2_journal_free_transaction(transaction_t *transaction)
} }
/* /*
* We reserve t_outstanding_credits >> JBD2_CONTROL_BLOCKS_SHIFT for * Base amount of descriptor blocks we reserve for each transaction.
* transaction descriptor blocks.
*/ */
#define JBD2_CONTROL_BLOCKS_SHIFT 5
static int jbd2_descriptor_blocks_per_trans(journal_t *journal) static int jbd2_descriptor_blocks_per_trans(journal_t *journal)
{ {
return journal->j_max_transaction_buffers >> JBD2_CONTROL_BLOCKS_SHIFT; int tag_space = journal->j_blocksize - sizeof(journal_header_t);
int tags_per_block;
/* Subtract UUID */
tag_space -= 16;
if (jbd2_journal_has_csum_v2or3(journal))
tag_space -= sizeof(struct jbd2_journal_block_tail);
/* Commit code leaves a slack space of 16 bytes at the end of block */
tags_per_block = (tag_space - 16) / journal_tag_bytes(journal);
/*
* Revoke descriptors are accounted separately so we need to reserve
* space for commit block and normal transaction descriptor blocks.
*/
return 1 + DIV_ROUND_UP(journal->j_max_transaction_buffers,
tags_per_block);
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册