You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
nft_hash: Remove rhashtable_remove_pprev()
The removal function of nft_hash currently stores a reference to the previous element during lookup which is used to optimize removal later on. This was possible because a lock is held throughout calling rhashtable_lookup() and rhashtable_remove(). With the introdution of deferred table resizing in parallel to lookups and insertions, the nftables lock will no longer synchronize all table mutations and the stored pprev may become invalid. Removing this optimization makes removal slightly more expensive on average but allows taking the resize cost out of the insert and remove path. Signed-off-by: Thomas Graf <tgraf@suug.ch> Cc: netfilter-devel@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
b8e1943e9f
commit
897362e446
@@ -83,15 +83,10 @@ static void nft_hash_remove(const struct nft_set *set,
|
||||
const struct nft_set_elem *elem)
|
||||
{
|
||||
struct rhashtable *priv = nft_set_priv(set);
|
||||
struct rhash_head *he, __rcu **pprev;
|
||||
|
||||
pprev = elem->cookie;
|
||||
he = rht_dereference((*pprev), priv);
|
||||
|
||||
rhashtable_remove_pprev(priv, he, pprev);
|
||||
|
||||
rhashtable_remove(priv, elem->cookie);
|
||||
synchronize_rcu();
|
||||
kfree(he);
|
||||
kfree(elem->cookie);
|
||||
}
|
||||
|
||||
struct nft_compare_arg {
|
||||
@@ -105,7 +100,7 @@ static bool nft_hash_compare(void *ptr, void *arg)
|
||||
struct nft_compare_arg *x = arg;
|
||||
|
||||
if (!nft_data_cmp(&he->key, &x->elem->key, x->set->klen)) {
|
||||
x->elem->cookie = &he->node;
|
||||
x->elem->cookie = he;
|
||||
x->elem->flags = 0;
|
||||
if (x->set->flags & NFT_SET_MAP)
|
||||
nft_data_copy(&x->elem->data, he->data);
|
||||
|
||||
Reference in New Issue
Block a user