Module Name:    src
Committed By:   ozaki-r
Date:           Mon Apr 11 02:04:14 UTC 2016

Modified Files:
        src/sys/net: bridgestp.c if_bridge.c if_bridgevar.h

Log Message:
Use pslist(9) in bridge(4)

This adds missing memory barriers to list operations for pserialize.


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/net/bridgestp.c
cvs rdiff -u -r1.111 -r1.112 src/sys/net/if_bridge.c
cvs rdiff -u -r1.26 -r1.27 src/sys/net/if_bridgevar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/bridgestp.c
diff -u src/sys/net/bridgestp.c:1.19 src/sys/net/bridgestp.c:1.20
--- src/sys/net/bridgestp.c:1.19	Mon Feb 15 01:11:41 2016
+++ src/sys/net/bridgestp.c	Mon Apr 11 02:04:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: bridgestp.c,v 1.19 2016/02/15 01:11:41 ozaki-r Exp $	*/
+/*	$NetBSD: bridgestp.c,v 1.20 2016/04/11 02:04:14 ozaki-r Exp $	*/
 
 /*
  * Copyright (c) 2000 Jason L. Wright (ja...@thought.net)
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bridgestp.c,v 1.19 2016/02/15 01:11:41 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bridgestp.c,v 1.20 2016/04/11 02:04:14 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -341,7 +341,8 @@ bstp_config_bpdu_generation(struct bridg
 {
 	struct bridge_iflist *bif;
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_designated_port(sc, bif) &&
@@ -415,7 +416,8 @@ bstp_root_selection(struct bridge_softc 
 {
 	struct bridge_iflist *root_port = NULL, *bif;
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_designated_port(sc, bif))
@@ -473,7 +475,8 @@ bstp_designated_port_selection(struct br
 {
 	struct bridge_iflist *bif;
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_designated_port(sc, bif))
@@ -512,7 +515,8 @@ bstp_port_state_selection(struct bridge_
 {
 	struct bridge_iflist *bif;
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bif == sc->sc_root_port) {
@@ -789,7 +793,8 @@ bstp_designated_for_some_port(struct bri
 
 	struct bridge_iflist *bif;
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bif->bif_designated_bridge == sc->sc_bridge_id)
@@ -828,7 +833,8 @@ bstp_initialization(struct bridge_softc 
 
 	BRIDGE_LOCK(sc);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bif->bif_ifp->if_type != IFT_ETHER)
@@ -882,7 +888,8 @@ bstp_initialization(struct bridge_softc 
 
 	BRIDGE_LOCK(sc);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if (bif->bif_flags & IFBIF_STP)
 			bstp_enable_port(sc, bif);
 		else
@@ -902,7 +909,8 @@ bstp_stop(struct bridge_softc *sc)
 	struct bridge_iflist *bif;
 
 	BRIDGE_LOCK(sc);
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		bstp_set_port_state(bif, BSTP_IFSTATE_DISABLED);
 		bstp_timer_stop(&bif->bif_hold_timer);
 		bstp_timer_stop(&bif->bif_message_age_timer);
@@ -974,7 +982,8 @@ bstp_set_bridge_priority(struct bridge_s
 
 	root = bstp_root_bridge(sc);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_designated_port(sc, bif))
@@ -1067,7 +1076,8 @@ bstp_tick(void *arg)
 	s = splnet();
 	BRIDGE_LOCK(sc);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		/*
@@ -1090,7 +1100,8 @@ bstp_tick(void *arg)
 	    sc->sc_topology_change_time))
 		bstp_topology_change_timer_expiry(sc);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_timer_expired(&bif->bif_message_age_timer,
@@ -1098,7 +1109,8 @@ bstp_tick(void *arg)
 			bstp_message_age_timer_expiry(sc, bif);
 	}
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		if ((bif->bif_flags & IFBIF_STP) == 0)
 			continue;
 		if (bstp_timer_expired(&bif->bif_forward_delay_timer,

Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.111 src/sys/net/if_bridge.c:1.112
--- src/sys/net/if_bridge.c:1.111	Mon Mar 28 04:38:04 2016
+++ src/sys/net/if_bridge.c	Mon Apr 11 02:04:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridge.c,v 1.111 2016/03/28 04:38:04 ozaki-r Exp $	*/
+/*	$NetBSD: if_bridge.c,v 1.112 2016/04/11 02:04:14 ozaki-r Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.111 2016/03/28 04:38:04 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.112 2016/04/11 02:04:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bridge_ipf.h"
@@ -399,7 +399,7 @@ bridge_clone_create(struct if_clone *ifc
 	callout_init(&sc->sc_brcallout, 0);
 	callout_init(&sc->sc_bstpcallout, 0);
 
-	LIST_INIT(&sc->sc_iflist);
+	PSLIST_INIT(&sc->sc_iflist);
 #ifdef BRIDGE_MPSAFE
 	sc->sc_iflist_psz = pserialize_create();
 	sc->sc_iflist_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_SOFTNET);
@@ -447,8 +447,14 @@ bridge_clone_destroy(struct ifnet *ifp)
 	bridge_stop(ifp, 1);
 
 	BRIDGE_LOCK(sc);
-	while ((bif = LIST_FIRST(&sc->sc_iflist)) != NULL)
+	for (;;) {
+		bif = PSLIST_WRITER_FIRST(&sc->sc_iflist, struct bridge_iflist,
+		    bif_next);
+		if (bif == NULL)
+			break;
 		bridge_delete_member(sc, bif);
+	}
+	PSLIST_DESTROY(&sc->sc_iflist);
 	BRIDGE_UNLOCK(sc);
 
 	splx(s);
@@ -619,7 +625,8 @@ bridge_lookup_member(struct bridge_softc
 
 	BRIDGE_PSZ_RENTER(s);
 
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		ifp = bif->bif_ifp;
 		if (strcmp(ifp->if_xname, name) == 0)
 			break;
@@ -705,7 +712,8 @@ bridge_delete_member(struct bridge_softc
 	ifs->if_bridge = NULL;
 	ifs->if_bridgeif = NULL;
 
-	LIST_REMOVE(bif, bif_next);
+	PSLIST_WRITER_REMOVE(bif, bif_next);
+	PSLIST_ENTRY_DESTROY(bif, bif_next);
 
 	BRIDGE_PSZ_PERFORM(sc);
 
@@ -777,12 +785,13 @@ bridge_ioctl_add(struct bridge_softc *sc
 	bif->bif_path_cost = BSTP_DEFAULT_PATH_COST;
 	bif->bif_refs = 0;
 	bif->bif_waiting = false;
+	PSLIST_ENTRY_INIT(bif, bif_next);
 
 	BRIDGE_LOCK(sc);
 
 	ifs->if_bridge = sc;
 	ifs->if_bridgeif = bif;
-	LIST_INSERT_HEAD(&sc->sc_iflist, bif, bif_next);
+	PSLIST_WRITER_INSERT_HEAD(&sc->sc_iflist, bif, bif_next);
 	ifs->_if_input = bridge_input;
 
 	BRIDGE_UNLOCK(sc);
@@ -814,7 +823,8 @@ bridge_ioctl_del(struct bridge_softc *sc
 	 * Don't use bridge_lookup_member. We want to get a member
 	 * with bif_refs == 0.
 	 */
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_WRITER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		ifs = bif->bif_ifp;
 		if (strcmp(ifs->if_xname, name) == 0)
 			break;
@@ -939,7 +949,8 @@ bridge_ioctl_gifs(struct bridge_softc *s
 retry:
 	BRIDGE_LOCK(sc);
 	count = 0;
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next)
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next)
 		count++;
 	BRIDGE_UNLOCK(sc);
 
@@ -959,7 +970,8 @@ retry:
 	BRIDGE_LOCK(sc);
 
 	i = 0;
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next)
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next)
 		i++;
 	if (i > count) {
 		/*
@@ -972,7 +984,8 @@ retry:
 	}
 
 	i = 0;
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		struct ifbreq *breq = &breqs[i++];
 		memset(breq, 0, sizeof(*breq));
 
@@ -1463,7 +1476,8 @@ bridge_output(struct ifnet *ifp, struct 
 		int ss;
 
 		BRIDGE_PSZ_RENTER(ss);
-		LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+		PSLIST_READER_FOREACH(bif, &sc->sc_iflist,
+		    struct bridge_iflist, bif_next) {
 			bif = bridge_try_hold_bif(bif);
 			if (bif == NULL)
 				continue;
@@ -1489,7 +1503,8 @@ bridge_output(struct ifnet *ifp, struct 
 				}
 			}
 
-			if (LIST_NEXT(bif, bif_next) == NULL) {
+			if (PSLIST_READER_NEXT(bif, struct bridge_iflist,
+			    bif_next) == NULL) {
 				used = 1;
 				mc = m;
 			} else {
@@ -1787,7 +1802,8 @@ bridge_input(struct ifnet *ifp, struct m
 		int s;
 
 		BRIDGE_PSZ_RENTER(s);
-		LIST_FOREACH(_bif, &sc->sc_iflist, bif_next) {
+		PSLIST_READER_FOREACH(_bif, &sc->sc_iflist,
+		    struct bridge_iflist, bif_next) {
 			/* It is destined for us. */
 			if (bridge_ourether(_bif, eh, 0)) {
 				_bif = bridge_try_hold_bif(_bif);
@@ -1863,7 +1879,8 @@ bridge_broadcast(struct bridge_softc *sc
 	bmcast = m->m_flags & (M_BCAST|M_MCAST);
 
 	BRIDGE_PSZ_RENTER(s);
-	LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+	PSLIST_READER_FOREACH(bif, &sc->sc_iflist, struct bridge_iflist,
+	    bif_next) {
 		bif = bridge_try_hold_bif(bif);
 		if (bif == NULL)
 			continue;

Index: src/sys/net/if_bridgevar.h
diff -u src/sys/net/if_bridgevar.h:1.26 src/sys/net/if_bridgevar.h:1.27
--- src/sys/net/if_bridgevar.h:1.26	Mon Feb 15 01:11:41 2016
+++ src/sys/net/if_bridgevar.h	Mon Apr 11 02:04:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridgevar.h,v 1.26 2016/02/15 01:11:41 ozaki-r Exp $	*/
+/*	$NetBSD: if_bridgevar.h,v 1.27 2016/04/11 02:04:14 ozaki-r Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -79,6 +79,7 @@
 #include <sys/queue.h>
 #include <sys/mutex.h>
 #include <sys/condvar.h>
+#include <sys/pslist.h>
 
 /*
  * Commands used in the SIOCSDRVSPEC ioctl.  Note the lookup of the
@@ -248,7 +249,7 @@ struct bstp_tcn_unit {
  * Bridge interface list entry.
  */
 struct bridge_iflist {
-	LIST_ENTRY(bridge_iflist) bif_next;
+	struct pslist_entry	bif_next;
 	uint64_t		bif_designated_root;
 	uint64_t		bif_designated_bridge;
 	uint32_t		bif_path_cost;
@@ -311,7 +312,7 @@ struct bridge_softc {
 	uint32_t		sc_brttimeout;	/* rt timeout in seconds */
 	callout_t		sc_brcallout;	/* bridge callout */
 	callout_t		sc_bstpcallout;	/* STP callout */
-	LIST_HEAD(, bridge_iflist) sc_iflist;	/* member interface list */
+	struct pslist_head	sc_iflist;	/* member interface list */
 	kcondvar_t		sc_iflist_cv;
 	pserialize_t		sc_iflist_psz;
 	kmutex_t		*sc_iflist_lock;

Reply via email to