summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2026-02-24 23:50:46 +0300
committerJakub Kicinski <kuba@kernel.org>2026-02-26 06:36:26 +0300
commit3aea466a439984053d9240b0ca946842a91e484d (patch)
tree15683cf4cecd770e318cdeef4cdafffdb475338f
parent09b71fb459468b408f3fa3e2b75d20113374f057 (diff)
downloadlinux-3aea466a439984053d9240b0ca946842a91e484d.tar.xz
netfilter: nft_set_rbtree: don't disable bh when acquiring tree lock
As of commit 7e43e0a1141d ("netfilter: nft_set_rbtree: translate rbtree to array for binary search") the lock is only taken from control plane, no need to disable BH anymore. Signed-off-by: Florian Westphal <fw@strlen.de> Link: https://patch.msgid.link/20260224205048.4718-8-fw@strlen.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/netfilter/nft_set_rbtree.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
index 644d4b916705..ef567a948703 100644
--- a/net/netfilter/nft_set_rbtree.c
+++ b/net/netfilter/nft_set_rbtree.c
@@ -684,9 +684,9 @@ static int nft_rbtree_insert(const struct net *net, const struct nft_set *set,
cond_resched();
- write_lock_bh(&priv->lock);
+ write_lock(&priv->lock);
err = __nft_rbtree_insert(net, set, rbe, elem_priv, tstamp, last);
- write_unlock_bh(&priv->lock);
+ write_unlock(&priv->lock);
if (nft_rbtree_interval_end(rbe))
priv->start_rbe_cookie = 0;
@@ -696,13 +696,6 @@ static int nft_rbtree_insert(const struct net *net, const struct nft_set *set,
return err;
}
-static void nft_rbtree_erase(struct nft_rbtree *priv, struct nft_rbtree_elem *rbe)
-{
- write_lock_bh(&priv->lock);
- rb_erase(&rbe->node, &priv->root);
- write_unlock_bh(&priv->lock);
-}
-
static void nft_rbtree_remove(const struct net *net,
const struct nft_set *set,
struct nft_elem_priv *elem_priv)
@@ -710,7 +703,9 @@ static void nft_rbtree_remove(const struct net *net,
struct nft_rbtree_elem *rbe = nft_elem_priv_cast(elem_priv);
struct nft_rbtree *priv = nft_set_priv(set);
- nft_rbtree_erase(priv, rbe);
+ write_lock(&priv->lock);
+ rb_erase(&rbe->node, &priv->root);
+ write_unlock(&priv->lock);
}
static void nft_rbtree_activate(const struct net *net,
@@ -871,9 +866,9 @@ static void nft_rbtree_walk(const struct nft_ctx *ctx,
nft_rbtree_do_walk(ctx, set, iter);
break;
case NFT_ITER_READ:
- read_lock_bh(&priv->lock);
+ read_lock(&priv->lock);
nft_rbtree_do_walk(ctx, set, iter);
- read_unlock_bh(&priv->lock);
+ read_unlock(&priv->lock);
break;
default:
iter->err = -EINVAL;
@@ -909,14 +904,14 @@ static void nft_rbtree_gc_scan(struct nft_set *set)
/* end element needs to be removed first, it has
* no timeout extension.
*/
- write_lock_bh(&priv->lock);
+ write_lock(&priv->lock);
if (rbe_end) {
nft_rbtree_gc_elem_move(net, set, priv, rbe_end);
rbe_end = NULL;
}
nft_rbtree_gc_elem_move(net, set, priv, rbe);
- write_unlock_bh(&priv->lock);
+ write_unlock(&priv->lock);
}
priv->last_gc = jiffies;