]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bcachefs: Increase size of cuckoo hash table on too many rehashes
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 15 Aug 2024 17:02:55 +0000 (13:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 16 Aug 2024 16:46:40 +0000 (12:46 -0400)
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>
fs/bcachefs/buckets_waiting_for_journal.c

index ec1b636ef78d075d1c2b6a9dd2b610a5ba8f274c..f70eb2127d322c4bd1adf14c15f902a1ffd7fab5 100644 (file)
@@ -93,7 +93,7 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
                .dev_bucket     = (u64) dev << 56 | bucket,
                .journal_seq    = journal_seq,
        };
-       size_t i, size, new_bits, nr_elements = 1, nr_rehashes = 0;
+       size_t i, size, new_bits, nr_elements = 1, nr_rehashes = 0, nr_rehashes_this_size = 0;
        int ret = 0;
 
        mutex_lock(&b->lock);
@@ -106,7 +106,7 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
        for (i = 0; i < size; i++)
                nr_elements += t->d[i].journal_seq > flushed_seq;
 
-       new_bits = t->bits + (nr_elements * 3 > size);
+       new_bits = ilog2(roundup_pow_of_two(nr_elements * 3));
 
        n = kvmalloc(sizeof(*n) + (sizeof(n->d[0]) << new_bits), GFP_KERNEL);
        if (!n) {
@@ -115,7 +115,14 @@ int bch2_set_bucket_needs_journal_commit(struct buckets_waiting_for_journal *b,
        }
 
 retry_rehash:
+       if (nr_rehashes_this_size == 3) {
+               new_bits++;
+               nr_rehashes_this_size = 0;
+       }
+
        nr_rehashes++;
+       nr_rehashes_this_size++;
+
        bucket_table_init(n, new_bits);
 
        tmp = new;