diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2004-07-29 00:41:53 -0700 |
---|---|---|
committer | David S. Miller <davem@nuts.davemloft.net> | 2004-07-29 00:41:53 -0700 |
commit | 886214f081569a8c3aba98b2797bc39046a85869 (patch) | |
tree | e469415e9040710b5d49cb900efb837ecbffd5d8 /net | |
parent | 2f7b3472996d11ad495e688c6faea305a93e61d2 (diff) | |
download | history-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.c | 9 | ||||
-rw-r--r-- | net/bridge/br_private.h | 5 |
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; |