bridge: simplify multicast_add_router
authorstephen hemminger <shemminger@vyatta.com>
Tue, 27 Apr 2010 15:01:04 +0000 (15:01 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Apr 2010 01:13:53 +0000 (18:13 -0700)
By coding slightly differently, there are only two cases
to deal with: add at head and add after previous entry.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_multicast.c

index fcba313..d63868c 100644 (file)
@@ -1039,22 +1039,25 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
 }
 #endif
 
+/*
+ * Add port to rotuer_list
+ *  list is maintained ordered by pointer value
+ *  and locked by br->multicast_lock and RCU
+ */
 static void br_multicast_add_router(struct net_bridge *br,
                                    struct net_bridge_port *port)
 {
        struct net_bridge_port *p;
-       struct hlist_node *n, *last = NULL;
+       struct hlist_node *n, *slot = NULL;
 
        hlist_for_each_entry(p, n, &br->router_list, rlist) {
-               if ((unsigned long) port >= (unsigned long) p) {
-                       hlist_add_before_rcu(n, &port->rlist);
-                       return;
-               }
-               last = n;
+               if ((unsigned long) port >= (unsigned long) p)
+                       break;
+               slot = n;
        }
 
-       if (last)
-               hlist_add_after_rcu(last, &port->rlist);
+       if (slot)
+               hlist_add_after_rcu(slot, &port->rlist);
        else
                hlist_add_head_rcu(&port->rlist, &br->router_list);
 }