@@ -11,7 +11,7 @@ else ifeq ($(CONFIG_XFRM_INTERFACE),y)
xfrm_interface-$(CONFIG_DEBUG_INFO_BTF) += xfrm_interface_bpf.o
endif
-obj-$(CONFIG_XFRM) := xfrm_policy.o xfrm_state.o xfrm_hash.o \
+obj-$(CONFIG_XFRM) := xfrm_policy.o xfrm_state.o \
xfrm_input.o xfrm_output.o \
xfrm_sysctl.o xfrm_replay.o xfrm_device.o \
xfrm_nat_keepalive.o
deleted file mode 100644
@@ -1,40 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* xfrm_hash.c: Common hash table code.
- *
- * Copyright (C) 2006 David S. Miller (davem@davemloft.net)
- */
-
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/memblock.h>
-#include <linux/vmalloc.h>
-#include <linux/slab.h>
-#include <linux/xfrm.h>
-
-#include "xfrm_hash.h"
-
-struct hlist_head *xfrm_hash_alloc(unsigned int sz)
-{
- struct hlist_head *n;
-
- if (sz <= PAGE_SIZE)
- n = kzalloc(sz, GFP_KERNEL);
- else if (hashdist)
- n = vzalloc(sz);
- else
- n = (struct hlist_head *)
- __get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO,
- get_order(sz));
-
- return n;
-}
-
-void xfrm_hash_free(struct hlist_head *n, unsigned int sz)
-{
- if (sz <= PAGE_SIZE)
- kfree(n);
- else if (hashdist)
- vfree(n);
- else
- free_pages((unsigned long)n, get_order(sz));
-}
@@ -193,7 +193,13 @@ static inline unsigned int __addr_hash(const xfrm_address_t *daddr,
return h & hmask;
}
-struct hlist_head *xfrm_hash_alloc(unsigned int sz);
-void xfrm_hash_free(struct hlist_head *n, unsigned int sz);
+static inline struct hlist_head *xfrm_hash_alloc(unsigned int sz)
+{
+ return kvzalloc(sz, GFP_KERNEL);
+}
+static inline void xfrm_hash_free(struct hlist_head *n)
+{
+ kvfree(n);
+}
#endif /* _XFRM_HASH_H */
@@ -655,7 +655,7 @@ static void xfrm_bydst_resize(struct net *net, int dir)
synchronize_rcu();
- xfrm_hash_free(odst, (hmask + 1) * sizeof(struct hlist_head));
+ xfrm_hash_free(odst);
}
static void xfrm_byidx_resize(struct net *net)
@@ -680,7 +680,7 @@ static void xfrm_byidx_resize(struct net *net)
spin_unlock_bh(&net->xfrm.xfrm_policy_lock);
- xfrm_hash_free(oidx, (hmask + 1) * sizeof(struct hlist_head));
+ xfrm_hash_free(oidx);
}
static inline int xfrm_bydst_should_resize(struct net *net, int dir, int *total)
@@ -4253,9 +4253,9 @@ static int __net_init xfrm_policy_init(struct net *net)
struct xfrm_policy_hash *htab;
htab = &net->xfrm.policy_bydst[dir];
- xfrm_hash_free(htab->table, sz);
+ xfrm_hash_free(htab->table);
}
- xfrm_hash_free(net->xfrm.policy_byidx, sz);
+ xfrm_hash_free(net->xfrm.policy_byidx);
out_byidx:
return -ENOMEM;
}
@@ -4263,7 +4263,6 @@ static int __net_init xfrm_policy_init(struct net *net)
static void xfrm_policy_fini(struct net *net)
{
struct xfrm_pol_inexact_bin *b, *t;
- unsigned int sz;
int dir;
flush_work(&net->xfrm.policy_hash_work);
@@ -4278,14 +4277,12 @@ static void xfrm_policy_fini(struct net *net)
struct xfrm_policy_hash *htab;
htab = &net->xfrm.policy_bydst[dir];
- sz = (htab->hmask + 1) * sizeof(struct hlist_head);
WARN_ON(!hlist_empty(htab->table));
- xfrm_hash_free(htab->table, sz);
+ xfrm_hash_free(htab->table);
}
- sz = (net->xfrm.policy_idx_hmask + 1) * sizeof(struct hlist_head);
WARN_ON(!hlist_empty(net->xfrm.policy_byidx));
- xfrm_hash_free(net->xfrm.policy_byidx, sz);
+ xfrm_hash_free(net->xfrm.policy_byidx);
spin_lock_bh(&net->xfrm.xfrm_policy_lock);
list_for_each_entry_safe(b, t, &net->xfrm.inexact_bins, inexact_bins)
@@ -162,8 +162,8 @@ static void xfrm_hash_resize(struct work_struct *work)
{
struct net *net = container_of(work, struct net, xfrm.state_hash_work);
struct hlist_head *ndst, *nsrc, *nspi, *nseq, *odst, *osrc, *ospi, *oseq;
- unsigned long nsize, osize;
unsigned int nhashmask, ohashmask;
+ unsigned long nsize;
int i;
nsize = xfrm_hash_new_size(net->xfrm.state_hmask);
@@ -172,20 +172,20 @@ static void xfrm_hash_resize(struct work_struct *work)
return;
nsrc = xfrm_hash_alloc(nsize);
if (!nsrc) {
- xfrm_hash_free(ndst, nsize);
+ xfrm_hash_free(ndst);
return;
}
nspi = xfrm_hash_alloc(nsize);
if (!nspi) {
- xfrm_hash_free(ndst, nsize);
- xfrm_hash_free(nsrc, nsize);
+ xfrm_hash_free(ndst);
+ xfrm_hash_free(nsrc);
return;
}
nseq = xfrm_hash_alloc(nsize);
if (!nseq) {
- xfrm_hash_free(ndst, nsize);
- xfrm_hash_free(nsrc, nsize);
- xfrm_hash_free(nspi, nsize);
+ xfrm_hash_free(ndst);
+ xfrm_hash_free(nsrc);
+ xfrm_hash_free(nspi);
return;
}
@@ -211,14 +211,12 @@ static void xfrm_hash_resize(struct work_struct *work)
write_seqcount_end(&net->xfrm.xfrm_state_hash_generation);
spin_unlock_bh(&net->xfrm.xfrm_state_lock);
- osize = (ohashmask + 1) * sizeof(struct hlist_head);
-
synchronize_rcu();
- xfrm_hash_free(odst, osize);
- xfrm_hash_free(osrc, osize);
- xfrm_hash_free(ospi, osize);
- xfrm_hash_free(oseq, osize);
+ xfrm_hash_free(odst);
+ xfrm_hash_free(osrc);
+ xfrm_hash_free(ospi);
+ xfrm_hash_free(oseq);
}
static DEFINE_SPINLOCK(xfrm_state_afinfo_lock);
@@ -3277,36 +3275,33 @@ int __net_init xfrm_state_init(struct net *net)
return 0;
out_state_cache_input:
- xfrm_hash_free(net->xfrm.state_byseq, sz);
+ xfrm_hash_free(net->xfrm.state_byseq);
out_byseq:
- xfrm_hash_free(net->xfrm.state_byspi, sz);
+ xfrm_hash_free(net->xfrm.state_byspi);
out_byspi:
- xfrm_hash_free(net->xfrm.state_bysrc, sz);
+ xfrm_hash_free(net->xfrm.state_bysrc);
out_bysrc:
- xfrm_hash_free(net->xfrm.state_bydst, sz);
+ xfrm_hash_free(net->xfrm.state_bydst);
out_bydst:
return -ENOMEM;
}
void xfrm_state_fini(struct net *net)
{
- unsigned int sz;
-
flush_work(&net->xfrm.state_hash_work);
flush_work(&xfrm_state_gc_work);
xfrm_state_flush(net, 0, false, true);
WARN_ON(!list_empty(&net->xfrm.state_all));
- sz = (net->xfrm.state_hmask + 1) * sizeof(struct hlist_head);
WARN_ON(!hlist_empty(net->xfrm.state_byseq));
- xfrm_hash_free(net->xfrm.state_byseq, sz);
+ xfrm_hash_free(net->xfrm.state_byseq);
WARN_ON(!hlist_empty(net->xfrm.state_byspi));
- xfrm_hash_free(net->xfrm.state_byspi, sz);
+ xfrm_hash_free(net->xfrm.state_byspi);
WARN_ON(!hlist_empty(net->xfrm.state_bysrc));
- xfrm_hash_free(net->xfrm.state_bysrc, sz);
+ xfrm_hash_free(net->xfrm.state_bysrc);
WARN_ON(!hlist_empty(net->xfrm.state_bydst));
- xfrm_hash_free(net->xfrm.state_bydst, sz);
+ xfrm_hash_free(net->xfrm.state_bydst);
free_percpu(net->xfrm.state_cache_input);
}
These functions predate kvmalloc, update xfrm to use that instead. This also allows to drop the 'size' argument passed to xfrm_hash_free(). xfrm_hash_free() is kept around because of 'struct hlist_head *' arg type instead of 'void *'. Signed-off-by: Florian Westphal <fw@strlen.de> --- net/xfrm/Makefile | 2 +- net/xfrm/xfrm_hash.c | 40 --------------------------------------- net/xfrm/xfrm_hash.h | 10 ++++++++-- net/xfrm/xfrm_policy.c | 15 ++++++--------- net/xfrm/xfrm_state.c | 43 +++++++++++++++++++----------------------- 5 files changed, 34 insertions(+), 76 deletions(-) delete mode 100644 net/xfrm/xfrm_hash.c