|
@@ -2022,16 +2022,6 @@ static int kill_all(struct nf_conn *i, void *data)
|
|
|
return net_eq(nf_ct_net(i), data);
|
|
|
}
|
|
|
|
|
|
-void nf_ct_free_hashtable(void *hash, unsigned int size)
|
|
|
-{
|
|
|
- if (is_vmalloc_addr(hash))
|
|
|
- vfree(hash);
|
|
|
- else
|
|
|
- free_pages((unsigned long)hash,
|
|
|
- get_order(sizeof(struct hlist_head) * size));
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(nf_ct_free_hashtable);
|
|
|
-
|
|
|
void nf_conntrack_cleanup_start(void)
|
|
|
{
|
|
|
conntrack_gc_work.exiting = true;
|
|
@@ -2042,7 +2032,7 @@ void nf_conntrack_cleanup_end(void)
|
|
|
{
|
|
|
RCU_INIT_POINTER(nf_ct_hook, NULL);
|
|
|
cancel_delayed_work_sync(&conntrack_gc_work.dwork);
|
|
|
- nf_ct_free_hashtable(nf_conntrack_hash, nf_conntrack_htable_size);
|
|
|
+ kvfree(nf_conntrack_hash);
|
|
|
|
|
|
nf_conntrack_proto_fini();
|
|
|
nf_conntrack_seqadj_fini();
|
|
@@ -2108,7 +2098,6 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
|
|
|
{
|
|
|
struct hlist_nulls_head *hash;
|
|
|
unsigned int nr_slots, i;
|
|
|
- size_t sz;
|
|
|
|
|
|
if (*sizep > (UINT_MAX / sizeof(struct hlist_nulls_head)))
|
|
|
return NULL;
|
|
@@ -2116,14 +2105,8 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
|
|
|
BUILD_BUG_ON(sizeof(struct hlist_nulls_head) != sizeof(struct hlist_head));
|
|
|
nr_slots = *sizep = roundup(*sizep, PAGE_SIZE / sizeof(struct hlist_nulls_head));
|
|
|
|
|
|
- if (nr_slots > (UINT_MAX / sizeof(struct hlist_nulls_head)))
|
|
|
- return NULL;
|
|
|
-
|
|
|
- sz = nr_slots * sizeof(struct hlist_nulls_head);
|
|
|
- hash = (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO,
|
|
|
- get_order(sz));
|
|
|
- if (!hash)
|
|
|
- hash = vzalloc(sz);
|
|
|
+ hash = kvmalloc_array(nr_slots, sizeof(struct hlist_nulls_head),
|
|
|
+ GFP_KERNEL | __GFP_ZERO);
|
|
|
|
|
|
if (hash && nulls)
|
|
|
for (i = 0; i < nr_slots; i++)
|
|
@@ -2150,7 +2133,7 @@ int nf_conntrack_hash_resize(unsigned int hashsize)
|
|
|
|
|
|
old_size = nf_conntrack_htable_size;
|
|
|
if (old_size == hashsize) {
|
|
|
- nf_ct_free_hashtable(hash, hashsize);
|
|
|
+ kvfree(hash);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2186,7 +2169,7 @@ int nf_conntrack_hash_resize(unsigned int hashsize)
|
|
|
local_bh_enable();
|
|
|
|
|
|
synchronize_net();
|
|
|
- nf_ct_free_hashtable(old_hash, old_size);
|
|
|
+ kvfree(old_hash);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2350,7 +2333,7 @@ err_acct:
|
|
|
err_expect:
|
|
|
kmem_cache_destroy(nf_conntrack_cachep);
|
|
|
err_cachep:
|
|
|
- nf_ct_free_hashtable(nf_conntrack_hash, nf_conntrack_htable_size);
|
|
|
+ kvfree(nf_conntrack_hash);
|
|
|
return ret;
|
|
|
}
|
|
|
|