aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2004-07-29 00:41:53 -0700
committerDavid S. Miller <davem@nuts.davemloft.net>2004-07-29 00:41:53 -0700
commit886214f081569a8c3aba98b2797bc39046a85869 (patch)
treee469415e9040710b5d49cb900efb837ecbffd5d8 /net
parent2f7b3472996d11ad495e688c6faea305a93e61d2 (diff)
downloadhistory-886214f081569a8c3aba98b2797bc39046a85869.tar.gz
[BRIDGE]: RCU fix
Follow up to earlier RCU patch. Since now using RCU, need to use deferred free. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: David S. Miller <davem@redhat.com>
Diffstat (limited to 'net')
-rw-r--r--net/bridge/br_fdb.c9
-rw-r--r--net/bridge/br_private.h5
2 files changed, 12 insertions, 2 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 60b9697d18614d..373c05d78d0fe5 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -217,11 +217,18 @@ struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
return fdb;
}
+static void fdb_rcu_free(struct rcu_head *head)
+{
+ struct net_bridge_fdb_entry *ent
+ = container_of(head, struct net_bridge_fdb_entry, rcu);
+ kmem_cache_free(br_fdb_cache, ent);
+}
+/* Set entry up for deletion with RCU */
void br_fdb_put(struct net_bridge_fdb_entry *ent)
{
if (atomic_dec_and_test(&ent->use_count))
- kmem_cache_free(br_fdb_cache, ent);
+ call_rcu(&ent->rcu, fdb_rcu_free);
}
/*
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index b9ce6a40a30153..6cd11410711cbf 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -46,7 +46,10 @@ struct net_bridge_fdb_entry
{
struct hlist_node hlist;
struct net_bridge_port *dst;
- struct list_head age_list;
+ union {
+ struct list_head age_list;
+ struct rcu_head rcu;
+ };
atomic_t use_count;
unsigned long ageing_timer;
mac_addr addr;