netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list.
  2003-04-24 20:54 [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list Stephen Hemminger
@ 2003-04-24 20:31 ` David S. Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David S. Miller @ 2003-04-24 20:31 UTC (permalink / raw)
  To: shemminger; +Cc: netdev

   From: Stephen Hemminger <shemminger@osdl.org>
   Date: Thu, 24 Apr 2003 13:54:31 -0700

   This replaces the singly linked list in net_bridge structure with the
   list_ macro's (doubly linked).   It makes deleting an interface easier
   since no lookup required; but the real motivation is to setup for the
   next step where bridge rwlock is replaced with spin_lock and RCU.

Maybe use list_for_each_entry where appropriate?  If those were
not used because *_rcu variants do not exist, just add the rcu
versions to linux/list.h

Thanks.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list.
@ 2003-04-24 20:54 Stephen Hemminger
  2003-04-24 20:31 ` David S. Miller
  0 siblings, 1 reply; 2+ messages in thread
From: Stephen Hemminger @ 2003-04-24 20:54 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

This replaces the singly linked list in net_bridge structure with the
list_ macro's (doubly linked).   It makes deleting an interface easier
since no lookup required; but the real motivation is to setup for the
next step where bridge rwlock is replaced with spin_lock and RCU.

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1130  -> 1.1131 
#	 net/bridge/br_stp.c	1.3     -> 1.4    
#	net/bridge/br_private.h	1.8     -> 1.9    
#	net/bridge/br_forward.c	1.7     -> 1.8    
#	net/bridge/br_stp_timer.c	1.1     -> 1.2    
#	net/bridge/br_stp_if.c	1.4     -> 1.5    
#	  net/bridge/br_if.c	1.8     -> 1.9    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/04/24	shemminger@dev4-009.pdx.osdl.net	1.1131
# ebr-port-list.patch
# --------------------------------------------
#
diff -Nru a/net/bridge/br_forward.c b/net/bridge/br_forward.c
--- a/net/bridge/br_forward.c	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_forward.c	Thu Apr 24 13:41:28 2003
@@ -99,7 +99,7 @@
 static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone,
 	void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb))
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 	struct net_bridge_port *prev;
 
 	if (clone) {
@@ -115,8 +115,10 @@
 
 	prev = NULL;
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (should_deliver(p, skb)) {
 			if (prev != NULL) {
 				struct sk_buff *skb2;
@@ -132,8 +134,6 @@
 
 			prev = p;
 		}
-
-		p = p->next;
 	}
 
 	if (prev != NULL) {
diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c
--- a/net/bridge/br_if.c	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_if.c	Thu Apr 24 13:41:28 2003
@@ -39,42 +39,31 @@
 }
 
 /* called under BR_NETPROTO_LOCK and bridge lock */
-static int __br_del_if(struct net_bridge *br, struct net_device *dev)
+static void del_nbp(struct net_bridge_port *p)
 {
-	struct net_bridge_port *p;
-	struct net_bridge_port **pptr;
-
-	if ((p = dev->br_port) == NULL)
-		return -EINVAL;
+	struct net_device *dev = p->dev;
 
 	br_stp_disable_port(p);
 
 	dev_set_promiscuity(dev, -1);
 	dev->br_port = NULL;
 
-	pptr = &br->port_list;
-	while (*pptr != NULL) {
-		if (*pptr == p) {
-			*pptr = p->next;
-			break;
-		}
-
-		pptr = &((*pptr)->next);
-	}
+	list_del(&p->list);
 
-	br_fdb_delete_by_port(br, p);
+	br_fdb_delete_by_port(p->br, p);
 	kfree(p);
 	dev_put(dev);
-
-	return 0;
 }
 
 static void del_ifs(struct net_bridge *br)
 {
+	struct list_head *p, *n;
+
 	br_write_lock_bh(BR_NETPROTO_LOCK);
 	write_lock(&br->lock);
-	while (br->port_list != NULL)
-		__br_del_if(br, br->port_list->dev);
+	list_for_each_safe(p, n, &br->port_list) {
+		del_nbp(list_entry(p, struct net_bridge_port, list));
+	}
 	write_unlock(&br->lock);
 	br_write_unlock_bh(BR_NETPROTO_LOCK);
 }
@@ -99,6 +88,7 @@
 	br_dev_setup(dev);
 
 	br->lock = RW_LOCK_UNLOCKED;
+	INIT_LIST_HEAD(&br->port_list);
 	br->hash_lock = RW_LOCK_UNLOCKED;
 
 	br->bridge_id.prio[0] = 0x80;
@@ -155,8 +145,7 @@
 	br_init_port(p);
 	p->state = BR_STATE_DISABLED;
 
-	p->next = br->port_list;
-	br->port_list = p;
+	list_add(&p->list, &br->port_list);
 
 	return p;
 }
@@ -238,12 +227,17 @@
 
 int br_del_if(struct net_bridge *br, struct net_device *dev)
 {
-	int retval;
+	struct net_bridge_port *p;
+	int retval = 0;
 
 	br_write_lock_bh(BR_NETPROTO_LOCK);
 	write_lock(&br->lock);
-	retval = __br_del_if(br, dev);
-	br_stp_recalculate_bridge_id(br);
+	if ((p = dev->br_port) == NULL || p->br != br)
+		retval = -EINVAL;
+	else {
+		del_nbp(p);
+		br_stp_recalculate_bridge_id(br);
+	}
 	write_unlock(&br->lock);
 	br_write_unlock_bh(BR_NETPROTO_LOCK);
 
@@ -267,13 +261,13 @@
 
 void br_get_port_ifindices(struct net_bridge *br, int *ifindices)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 
 	read_lock(&br->lock);
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 		ifindices[p->port_no] = p->dev->ifindex;
-		p = p->next;
 	}
 	read_unlock(&br->lock);
 }
diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h
--- a/net/bridge/br_private.h	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_private.h	Thu Apr 24 13:41:28 2003
@@ -55,9 +55,9 @@
 
 struct net_bridge_port
 {
-	struct net_bridge_port		*next;
 	struct net_bridge		*br;
 	struct net_device		*dev;
+	struct list_head		list;
 	int				port_no;
 
 	/* STP */
@@ -80,7 +80,7 @@
 struct net_bridge
 {
 	rwlock_t			lock;
-	struct net_bridge_port		*port_list;
+	struct list_head		port_list;
 	struct net_device		dev;
 	struct net_device_stats		statistics;
 	rwlock_t			hash_lock;
diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c
--- a/net/bridge/br_stp.c	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_stp.c	Thu Apr 24 13:41:28 2003
@@ -38,14 +38,14 @@
 /* called under bridge lock */
 struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
+
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 
-	p = br->port_list;
-	while (p != NULL) {
 		if (p->port_no == port_no)
 			return p;
-
-		p = p->next;
 	}
 
 	return NULL;
@@ -104,17 +104,18 @@
 /* called under bridge lock */
 static void br_root_selection(struct net_bridge *br)
 {
+	struct list_head *l;
 	struct net_bridge_port *p;
 	int root_port;
 
 	root_port = 0;
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		p = list_entry(l, struct net_bridge_port, list);
+
 		if (br_should_become_root_port(p, root_port))
 			root_port = p->port_no;
 
-		p = p->next;
 	}
 
 	br->root_port = root_port;
@@ -239,15 +240,16 @@
 /* called under bridge lock */
 static void br_designated_port_selection(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
+
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 
-	p = br->port_list;
-	while (p != NULL) {
 		if (p->state != BR_STATE_DISABLED &&
 		    br_should_become_designated_port(p))
 			br_become_designated_port(p);
 
-		p = p->next;
 	}
 }
 
@@ -311,15 +313,15 @@
 /* called under bridge lock */
 void br_config_bpdu_generation(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
+
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 
-	p = br->port_list;
-	while (p != NULL) {
 		if (p->state != BR_STATE_DISABLED &&
 		    br_is_designated_port(p))
 			br_transmit_config(p);
-
-		p = p->next;
 	}
 }
 
@@ -389,10 +391,12 @@
 /* called under bridge lock */
 void br_port_state_selection(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
+
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 
-	p = br->port_list;
-	while (p != NULL) {
 		if (p->state != BR_STATE_DISABLED) {
 			if (p->port_no == br->root_port) {
 				p->config_pending = 0;
@@ -407,8 +411,6 @@
 				br_make_blocking(p);
 			}
 		}
-
-		p = p->next;
 	}
 }
 
diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
--- a/net/bridge/br_stp_if.c	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_stp_if.c	Thu Apr 24 13:41:28 2003
@@ -41,7 +41,7 @@
 /* called under bridge lock */
 void br_stp_enable_bridge(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 	struct timer_list *timer = &br->tick;
 
 	init_timer(timer);
@@ -53,12 +53,12 @@
 	br_timer_set(&br->hello_timer, jiffies);
 	br_config_bpdu_generation(br);
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (p->dev->flags & IFF_UP)
 			br_stp_enable_port(p);
-
-		p = p->next;
 	}
 
 	br_timer_set(&br->gc_timer, jiffies);
@@ -67,7 +67,7 @@
 /* NO locks held */
 void br_stp_disable_bridge(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 
 	write_lock(&br->lock);
 	br->topology_change = 0;
@@ -78,12 +78,12 @@
 	br_timer_clear(&br->gc_timer);
 	br_fdb_cleanup(br);
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (p->state != BR_STATE_DISABLED)
 			br_stp_disable_port(p);
-
-		p = p->next;
 	}
 	write_unlock(&br->lock);
 
@@ -126,7 +126,7 @@
 static void br_stp_change_bridge_id(struct net_bridge *br, unsigned char *addr)
 {
 	unsigned char oldaddr[6];
-	struct net_bridge_port *p;
+	struct list_head *l;
 	int wasroot;
 
 	wasroot = br_is_root_bridge(br);
@@ -135,15 +135,16 @@
 	memcpy(br->bridge_id.addr, addr, ETH_ALEN);
 	memcpy(br->dev.dev_addr, addr, ETH_ALEN);
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (!memcmp(p->designated_bridge.addr, oldaddr, ETH_ALEN))
 			memcpy(p->designated_bridge.addr, addr, ETH_ALEN);
 
 		if (!memcmp(p->designated_root.addr, oldaddr, ETH_ALEN))
 			memcpy(p->designated_root.addr, addr, ETH_ALEN);
 
-		p = p->next;
 	}
 
 	br_configuration_update(br);
@@ -158,17 +159,18 @@
 void br_stp_recalculate_bridge_id(struct net_bridge *br)
 {
 	unsigned char *addr;
-	struct net_bridge_port *p;
+	struct list_head *l;
 
 	addr = br_mac_zero;
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (addr == br_mac_zero ||
 		    memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
 			addr = p->dev->dev_addr;
 
-		p = p->next;
 	}
 
 	if (memcmp(br->bridge_id.addr, addr, ETH_ALEN))
@@ -178,20 +180,21 @@
 /* called under bridge lock */
 void br_stp_set_bridge_priority(struct net_bridge *br, int newprio)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 	int wasroot;
 
 	wasroot = br_is_root_bridge(br);
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
+
 		if (p->state != BR_STATE_DISABLED &&
 		    br_is_designated_port(p)) {
 			p->designated_bridge.prio[0] = (newprio >> 8) & 0xFF;
 			p->designated_bridge.prio[1] = newprio & 0xFF;
 		}
 
-		p = p->next;
 	}
 
 	br->bridge_id.prio[0] = (newprio >> 8) & 0xFF;
diff -Nru a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c
--- a/net/bridge/br_stp_timer.c	Thu Apr 24 13:41:28 2003
+++ b/net/bridge/br_stp_timer.c	Thu Apr 24 13:41:28 2003
@@ -30,15 +30,14 @@
 /* called under bridge lock */
 static int br_is_designated_for_some_port(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 		if (p->state != BR_STATE_DISABLED &&
 		    !memcmp(&p->designated_bridge, &br->bridge_id, 8))
 			return 1;
-
-		p = p->next;
 	}
 
 	return 0;
@@ -140,7 +139,7 @@
 /* called under bridge lock */
 static void br_check_timers(struct net_bridge *br)
 {
-	struct net_bridge_port *p;
+	struct list_head *l;
 
 	if (br_timer_has_expired(&br->gc_timer, br->gc_interval)) {
 		br_timer_set(&br->gc_timer, jiffies);
@@ -162,12 +161,11 @@
 		br_topology_change_timer_expired(br);
 	}
 
-	p = br->port_list;
-	while (p != NULL) {
+	list_for_each(l, &br->port_list) {
+		struct net_bridge_port *p
+			= list_entry(l, struct net_bridge_port, list);
 		if (p->state != BR_STATE_DISABLED)
 			br_check_port_timers(p);
-
-		p = p->next;
 	}
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-04-24 20:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-04-24 20:54 [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list Stephen Hemminger
2003-04-24 20:31 ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).