void mc_stats_reset(void) { #ifdef CONFIG_GSLOCK spin_lock(&stats_lock); stats.total_items = 0; stats.total_conns = 0; stats.rejected_conns = 0; stats.evictions = 0; stats.reclaimed = 0; stats.listen_disabled_num = 0; spin_unlock(&stats_lock); #else ATOMIC32_SET(stats.total_items, 0); ATOMIC32_SET(stats.total_conns, 0); ATOMIC64_SET(stats.rejected_conns, 0); ATOMIC64_SET(stats.evictions, 0); ATOMIC64_SET(stats.reclaimed, 0); ATOMIC64_SET(stats.listen_disabled_num, 0); #endif mutex_lock(&prefix_stats_lock); mc_stats_prefix_clear(); mutex_unlock(&prefix_stats_lock); mc_threadlocal_stats_reset(); mc_item_stats_reset(); }
/** * grows the hashtable to the next power of 2 */ static void mc_hash_expand(void) { size_t bytes; int ret = 0; old_hashtable = primary_hashtable; memcpy(&old_hts, &primary_hts, sizeof(old_hts)); bytes = hashsize(hashpower + 1) * sizeof(void *); ret = alloc_buffer(&primary_hts, bytes, __GFP_ZERO); if (!ret) { PVERBOSE(1, "hash table expansion starting\n"); BUFFER_PTR(&primary_hts, primary_hashtable); hashpower++; set_bit(EXPANDING, &hashflags); expand_bucket = 0; ATOMIC32_SET(stats.hash_power_level, hashpower); ATOMIC64_ADD(stats.hash_bytes, bytes); set_bit(STATS_HASH_EXP, &stats.flags); } else { /* bad news, but we can keep running */ PRINTK("hash table expansion error\n"); memcpy(&primary_hts, &old_hts, sizeof(old_hts)); primary_hashtable = old_hashtable; } }
int hash_init(int power) { size_t bytes; int ret = 0; if (power) hashpower = power; bytes = hashsize(hashpower) * sizeof(void *); ret = alloc_buffer(&primary_hts, bytes, __GFP_ZERO); if (ret) { PRINTK("alloc primary_hashtable error\n"); goto out; } else { BUFFER_PTR(&primary_hts, primary_hashtable); } ATOMIC32_SET(stats.hash_power_level, hashpower); ATOMIC64_SET(stats.hash_bytes, bytes); out: return ret; }