X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fhashtable%2Frculfhash.c;fp=src%2Fcommon%2Fhashtable%2Frculfhash.c;h=ebdc4ffaa8ee84842eb18c4c0588042fade9c66c;hb=9d8ad8e29d1f50e6a33c0e9a644c50b5e90364d2;hp=b430a3dec76e681ebf561f33bb9fcc767c713037;hpb=6d73c4efe5195e5ea4dfe5f4c1f8ee12ba1e0a25;p=lttng-tools.git diff --git a/src/common/hashtable/rculfhash.c b/src/common/hashtable/rculfhash.c index b430a3dec..ebdc4ffaa 100644 --- a/src/common/hashtable/rculfhash.c +++ b/src/common/hashtable/rculfhash.c @@ -726,9 +726,32 @@ void check_resize(struct cds_lfht *ht, unsigned long size, uint32_t chain_len) if (chain_len > 100) dbg_printf("WARNING: large chain length: %u.\n", chain_len); - if (chain_len >= CHAIN_LEN_RESIZE_THRESHOLD) - cds_lfht_resize_lazy_grow(ht, size, - cds_lfht_get_count_order_u32(chain_len - (CHAIN_LEN_TARGET - 1))); + if (chain_len >= CHAIN_LEN_RESIZE_THRESHOLD) { + int growth; + + /* + * Ideal growth calculated based on chain length. + */ + growth = cds_lfht_get_count_order_u32(chain_len + - (CHAIN_LEN_TARGET - 1)); + if ((ht->flags & CDS_LFHT_ACCOUNTING) + && (size << growth) >= (1UL << COUNT_COMMIT_ORDER)) { + /* + * If ideal growth expands the hash table size + * beyond the "small hash table" sizes, use the + * maximum small hash table size to attempt + * expanding the hash table. This only applies + * when node accounting is available, otherwise + * the chain length is used to expand the hash + * table in every case. + */ + growth = COUNT_COMMIT_ORDER - + cds_lfht_get_count_order_u32(size); + if (growth <= 0) + return; + } + cds_lfht_resize_lazy_grow(ht, size, growth); + } } static