summaryrefslogtreecommitdiffstats
path: root/net/netfilter/nft_hash.c
diff options
context:
space:
mode:
authorPatrick McHardy2015-03-25 15:08:47 +0100
committerPablo Neira Ayuso2015-03-26 11:09:34 +0100
commit61edafbb47e9f46fb850035b1f8f062564445704 (patch)
tree9adc749e66e69c6cd5b1d82434ab00bf1c406670 /net/netfilter/nft_hash.c
parentnetfilter: nf_tables: convert hash and rbtree to set extensions (diff)
downloadkernel-qcow2-linux-61edafbb47e9f46fb850035b1f8f062564445704.tar.gz
kernel-qcow2-linux-61edafbb47e9f46fb850035b1f8f062564445704.tar.xz
kernel-qcow2-linux-61edafbb47e9f46fb850035b1f8f062564445704.zip
netfilter: nf_tables: consolide set element destruction
With the conversion to set extensions, it is now possible to consolidate the different set element destruction functions. The set implementations' ->remove() functions are changed to only take the element out of their internal data structures. Elements will be freed in a batched fashion after the global transaction's completion RCU grace period. This reduces the amount of grace periods required for nft_hash from N to zero additional ones, additionally this guarantees that the set elements' extensions of all implementations can be used under RCU protection. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/netfilter/nft_hash.c')
-rw-r--r--net/netfilter/nft_hash.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/net/netfilter/nft_hash.c b/net/netfilter/nft_hash.c
index 15951a823d1d..94bf25def37f 100644
--- a/net/netfilter/nft_hash.c
+++ b/net/netfilter/nft_hash.c
@@ -96,23 +96,12 @@ static int nft_hash_insert(const struct nft_set *set,
nft_hash_params);
}
-static void nft_hash_elem_destroy(const struct nft_set *set,
- struct nft_hash_elem *he)
-{
- nft_data_uninit(nft_set_ext_key(&he->ext), NFT_DATA_VALUE);
- if (set->flags & NFT_SET_MAP)
- nft_data_uninit(nft_set_ext_data(&he->ext), set->dtype);
- kfree(he);
-}
-
static void nft_hash_remove(const struct nft_set *set,
const struct nft_set_elem *elem)
{
struct nft_hash *priv = nft_set_priv(set);
rhashtable_remove_fast(&priv->ht, elem->cookie, nft_hash_params);
- synchronize_rcu();
- kfree(elem->cookie);
}
static int nft_hash_get(const struct nft_set *set, struct nft_set_elem *elem)
@@ -208,16 +197,17 @@ static int nft_hash_init(const struct nft_set *set,
return rhashtable_init(&priv->ht, &params);
}
-static void nft_free_element(void *ptr, void *arg)
+static void nft_hash_elem_destroy(void *ptr, void *arg)
{
- nft_hash_elem_destroy((const struct nft_set *)arg, ptr);
+ nft_set_elem_destroy((const struct nft_set *)arg, ptr);
}
static void nft_hash_destroy(const struct nft_set *set)
{
struct nft_hash *priv = nft_set_priv(set);
- rhashtable_free_and_destroy(&priv->ht, nft_free_element, (void *)set);
+ rhashtable_free_and_destroy(&priv->ht, nft_hash_elem_destroy,
+ (void *)set);
}
static bool nft_hash_estimate(const struct nft_set_desc *desc, u32 features,