Skip to content

Commit c2f6e16

Browse files
author
Kent Overstreet
committed
bcachefs: Increase size of cuckoo hash table on too many rehashes
Also, improve the calculation of the new table size, so that it can shrink when needed. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 58474f7 commit c2f6e16

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

fs/bcachefs/buckets_waiting_for_journal.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
9393
.dev_bucket = (u64) dev << 56 | bucket,
9494
.journal_seq = journal_seq,
9595
};
96-
size_t i, size, new_bits, nr_elements = 1, nr_rehashes = 0;
96+
size_t i, size, new_bits, nr_elements = 1, nr_rehashes = 0, nr_rehashes_this_size = 0;
9797
int ret = 0;
9898

9999
mutex_lock(&b->lock);
@@ -106,7 +106,7 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
106106
for (i = 0; i < size; i++)
107107
nr_elements += t->d[i].journal_seq > flushed_seq;
108108

109-
new_bits = t->bits + (nr_elements * 3 > size);
109+
new_bits = ilog2(roundup_pow_of_two(nr_elements * 3));
110110

111111
n = kvmalloc(sizeof(*n) + (sizeof(n->d[0]) << new_bits), GFP_KERNEL);
112112
if (!n) {
@@ -115,7 +115,14 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
115115
}
116116

117117
retry_rehash:
118+
if (nr_rehashes_this_size == 3) {
119+
new_bits++;
120+
nr_rehashes_this_size = 0;
121+
}
122+
118123
nr_rehashes++;
124+
nr_rehashes_this_size++;
125+
119126
bucket_table_init(n, new_bits);
120127

121128
tmp = new;

0 commit comments

Comments
 (0)