[PATCH net-next v5 06/10] bnge: remove refcount from L2 filter

From: Vikas Gupta

Date: Tue Nov 03 2026 - 07:49:08 EST


A reference count was previously used under the assumption that any
context holding the last reference could delete the L2 filter.

However, going forward, the filter will only be removed by the same
context that created it, making refcount unnecessary.

Signed-off-by: Vikas Gupta <vikas.gupta@xxxxxxxxxxxx>
Reviewed-by: Dharmender Garg <dharmender.garg@xxxxxxxxxxxx>
---
.../net/ethernet/broadcom/bnge/bnge_filter.c | 33 +++++++------------
.../net/ethernet/broadcom/bnge/bnge_filter.h | 2 --
2 files changed, 11 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_filter.c b/drivers/net/ethernet/broadcom/bnge/bnge_filter.c
index a8bb441ebef9..6316f75ca36e 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_filter.c
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_filter.c
@@ -4,6 +4,7 @@
#include <linux/kernel.h>
#include <linux/dma-mapping.h>
#include <linux/jhash.h>
+#include <net/netdev_lock.h>

#include "bnge.h"
#include "bnge_netdev.h"
@@ -13,8 +14,8 @@

void bnge_del_l2_filter(struct bnge_net *bn, struct bnge_l2_filter *fltr)
{
- if (!refcount_dec_and_test(&fltr->refcnt))
- return;
+ netdev_assert_locked_or_invisible(bn->netdev);
+
hlist_del_rcu(&fltr->base.hlist);
kfree_rcu(fltr, base.rcu);
}
@@ -31,18 +32,19 @@ static void bnge_init_l2_filter(struct bnge_net *bn,

head = &bn->l2_fltr_hash_tbl[idx];
hlist_add_head_rcu(&fltr->base.hlist, head);
- refcount_set(&fltr->refcnt, 1);
}

-static struct bnge_l2_filter *__bnge_lookup_l2_filter(struct bnge_net *bn,
- struct bnge_l2_key *key,
- u32 idx)
+static struct bnge_l2_filter *bnge_lookup_l2_filter(struct bnge_net *bn,
+ struct bnge_l2_key *key,
+ u32 idx)
{
struct bnge_l2_filter *fltr;
struct hlist_head *head;

+ netdev_assert_locked_or_invisible(bn->netdev);
+
head = &bn->l2_fltr_hash_tbl[idx];
- hlist_for_each_entry_rcu(fltr, head, base.hlist) {
+ hlist_for_each_entry(fltr, head, base.hlist) {
struct bnge_l2_key *l2_key = &fltr->l2_key;

if (ether_addr_equal(l2_key->dst_mac_addr, key->dst_mac_addr) &&
@@ -52,20 +54,6 @@ static struct bnge_l2_filter *__bnge_lookup_l2_filter(struct bnge_net *bn,
return NULL;
}

-static struct bnge_l2_filter *bnge_lookup_l2_filter(struct bnge_net *bn,
- struct bnge_l2_key *key,
- u32 idx)
-{
- struct bnge_l2_filter *fltr;
-
- rcu_read_lock();
- fltr = __bnge_lookup_l2_filter(bn, key, idx);
- if (fltr)
- refcount_inc(&fltr->refcnt);
- rcu_read_unlock();
- return fltr;
-}
-
static struct bnge_l2_filter *bnge_alloc_l2_filter(struct bnge_net *bn,
struct bnge_l2_key *key,
gfp_t gfp)
@@ -75,9 +63,10 @@ static struct bnge_l2_filter *bnge_alloc_l2_filter(struct bnge_net *bn,

idx = jhash2(&key->filter_key, BNGE_L2_KEY_SIZE, bn->hash_seed) &
BNGE_L2_FLTR_HASH_MASK;
+
fltr = bnge_lookup_l2_filter(bn, key, idx);
if (fltr)
- return fltr;
+ return ERR_PTR(-EEXIST);

fltr = kzalloc_obj(*fltr, gfp);
if (!fltr)
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_filter.h b/drivers/net/ethernet/broadcom/bnge/bnge_filter.h
index ea1acefd70b4..372657cba43c 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_filter.h
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_filter.h
@@ -6,7 +6,6 @@

#include <linux/types.h>
#include <linux/if_ether.h>
-#include <linux/refcount.h>
#include <linux/jhash.h>

struct bnge_net;
@@ -49,7 +48,6 @@ struct bnge_l2_filter {
/* base filter must be the first member */
struct bnge_filter_base base;
struct bnge_l2_key l2_key;
- refcount_t refcnt;
};

void bnge_del_l2_filter(struct bnge_net *bn, struct bnge_l2_filter *fltr);
--
2.52.0