bridge: Replace mp->mglist hlist with a bool
As it turns out we never need to walk through the list of multicast groups subscribed by the bridge interface itself (the only time we'd want to do that is when we shut down the bridge, in which case we simply walk through all multicast groups), we don't really need to keep an hlist for mp->mglist. This means that we can replace it with just a single bit to indicate whether the bridge interface is subscribed to a group. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
24f9cdcbd7
commit
8a870178c0
@@ -232,8 +232,7 @@ static void br_multicast_group_expired(unsigned long data)
|
||||
if (!netif_running(br->dev) || timer_pending(&mp->timer))
|
||||
goto out;
|
||||
|
||||
if (!hlist_unhashed(&mp->mglist))
|
||||
hlist_del_init(&mp->mglist);
|
||||
mp->mglist = false;
|
||||
|
||||
if (mp->ports)
|
||||
goto out;
|
||||
@@ -276,7 +275,7 @@ static void br_multicast_del_pg(struct net_bridge *br,
|
||||
del_timer(&p->query_timer);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
|
||||
if (!mp->ports && hlist_unhashed(&mp->mglist) &&
|
||||
if (!mp->ports && !mp->mglist &&
|
||||
netif_running(br->dev))
|
||||
mod_timer(&mp->timer, jiffies);
|
||||
|
||||
@@ -528,7 +527,7 @@ static void br_multicast_group_query_expired(unsigned long data)
|
||||
struct net_bridge *br = mp->br;
|
||||
|
||||
spin_lock(&br->multicast_lock);
|
||||
if (!netif_running(br->dev) || hlist_unhashed(&mp->mglist) ||
|
||||
if (!netif_running(br->dev) || !mp->mglist ||
|
||||
mp->queries_sent >= br->multicast_last_member_count)
|
||||
goto out;
|
||||
|
||||
@@ -719,8 +718,7 @@ static int br_multicast_add_group(struct net_bridge *br,
|
||||
goto err;
|
||||
|
||||
if (!port) {
|
||||
if (hlist_unhashed(&mp->mglist))
|
||||
hlist_add_head(&mp->mglist, &br->mglist);
|
||||
mp->mglist = true;
|
||||
mod_timer(&mp->timer, now + br->multicast_membership_interval);
|
||||
goto out;
|
||||
}
|
||||
@@ -1166,7 +1164,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
|
||||
|
||||
max_delay *= br->multicast_last_member_count;
|
||||
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0))
|
||||
@@ -1237,7 +1235,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
||||
goto out;
|
||||
|
||||
max_delay *= br->multicast_last_member_count;
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0))
|
||||
@@ -1284,7 +1282,7 @@ static void br_multicast_leave_group(struct net_bridge *br,
|
||||
br->multicast_last_member_interval;
|
||||
|
||||
if (!port) {
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, time) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0)) {
|
||||
|
Reference in New Issue
Block a user