diff options
Diffstat (limited to 'src/ratelimiter.c')
-rw-r--r-- | src/ratelimiter.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/ratelimiter.c b/src/ratelimiter.c index 140d99e..638da2b 100644 --- a/src/ratelimiter.c +++ b/src/ratelimiter.c @@ -144,10 +144,10 @@ err_oom: int ratelimiter_init(void) { + mutex_lock(&init_lock); if (atomic64_inc_return(&refcnt) != 1) - return 0; + goto out; - mutex_lock(&init_lock); entry_cache = KMEM_CACHE(ratelimiter_entry, 0); if (!entry_cache) goto err; @@ -174,6 +174,7 @@ int ratelimiter_init(void) queue_delayed_work(system_power_efficient_wq, &gc_work, HZ); get_random_bytes(&key, sizeof(key)); +out: mutex_unlock(&init_lock); return 0; @@ -187,10 +188,10 @@ err: void ratelimiter_uninit(void) { + mutex_lock(&init_lock); if (atomic64_dec_if_positive(&refcnt)) - return; + goto out; - mutex_lock(&init_lock); cancel_delayed_work_sync(&gc_work); gc_entries(NULL); rcu_barrier(); @@ -199,6 +200,7 @@ void ratelimiter_uninit(void) kvfree(table_v6); #endif kmem_cache_destroy(entry_cache); +out: mutex_unlock(&init_lock); } |