diff options
author | Nikolay Aleksandrov <nikolay@cumulusnetworks.com> | 2018-12-05 16:14:25 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-12-06 04:01:51 +0300 |
commit | 4329596cb10d23c9e22c78e676a3667ef28ed62f (patch) | |
tree | 5cc06a0e796073d46762c92f80e846c820102375 | |
parent | 19e3a9c90c53479fecaa02307bf2db5ab8b3ffe3 (diff) | |
download | linux-4329596cb10d23c9e22c78e676a3667ef28ed62f.tar.xz |
net: bridge: multicast: use non-bh rcu flavor
The bridge multicast code has been using a mix of RCU and RCU-bh flavors
sometimes in questionable way. Since we've moved to rhashtable just use
non-bh RCU everywhere. In addition this simplifies freeing of objects
and allows us to remove some unnecessary callback functions.
v3: new patch
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_mdb.c | 2 | ||||
-rw-r--r-- | net/bridge/br_multicast.c | 26 | ||||
-rw-r--r-- | net/bridge/br_private.h | 1 |
3 files changed, 6 insertions, 23 deletions
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index ea8abdb56df3..79d4c9d253e0 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -710,7 +710,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) rcu_assign_pointer(*pp, p->next); hlist_del_init(&p->mglist); del_timer(&p->timer); - call_rcu_bh(&p->rcu, br_multicast_free_pg); + kfree_rcu(p, rcu); err = 0; if (!mp->ports && !mp->host_joined && diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 83a5931a7784..5b8cfef8bc4d 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -160,22 +160,6 @@ struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, return br_mdb_ip_get_rcu(br, &ip); } -void br_multicast_free_pg(struct rcu_head *head) -{ - struct net_bridge_port_group *p = - container_of(head, struct net_bridge_port_group, rcu); - - kfree(p); -} - -static void br_multicast_free_group(struct rcu_head *head) -{ - struct net_bridge_mdb_entry *mp = - container_of(head, struct net_bridge_mdb_entry, rcu); - - kfree(mp); -} - static void br_multicast_group_expired(struct timer_list *t) { struct net_bridge_mdb_entry *mp = from_timer(mp, t, timer); @@ -195,7 +179,7 @@ static void br_multicast_group_expired(struct timer_list *t) br_mdb_rht_params); hlist_del_rcu(&mp->mdb_node); - call_rcu_bh(&mp->rcu, br_multicast_free_group); + kfree_rcu(mp, rcu); out: spin_unlock(&br->multicast_lock); @@ -223,7 +207,7 @@ static void br_multicast_del_pg(struct net_bridge *br, del_timer(&p->timer); br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB, p->flags); - call_rcu_bh(&p->rcu, br_multicast_free_pg); + kfree_rcu(p, rcu); if (!mp->ports && !mp->host_joined && netif_running(br->dev)) @@ -1425,7 +1409,7 @@ br_multicast_leave_group(struct net_bridge *br, rcu_assign_pointer(*pp, p->next); hlist_del_init(&p->mglist); del_timer(&p->timer); - call_rcu_bh(&p->rcu, br_multicast_free_pg); + kfree_rcu(p, rcu); br_mdb_notify(br->dev, port, group, RTM_DELMDB, p->flags); @@ -1839,11 +1823,11 @@ void br_multicast_dev_del(struct net_bridge *br) rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode, br_mdb_rht_params); hlist_del_rcu(&mp->mdb_node); - call_rcu_bh(&mp->rcu, br_multicast_free_group); + kfree_rcu(mp, rcu); } spin_unlock_bh(&br->multicast_lock); - rcu_barrier_bh(); + rcu_barrier(); } int br_multicast_set_router(struct net_bridge *br, unsigned long val) diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index a0ce0822921c..cf1f7365deb3 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -679,7 +679,6 @@ struct net_bridge_mdb_entry * br_mdb_ip_get(struct net_bridge *br, struct br_ip *dst); struct net_bridge_mdb_entry * br_multicast_new_group(struct net_bridge *br, struct br_ip *group); -void br_multicast_free_pg(struct rcu_head *head); struct net_bridge_port_group * br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group, struct net_bridge_port_group __rcu *next, |