PERFORCE change 48518 for review

Robert Watson rwatson at FreeBSD.org
Tue Mar 9 12:31:46 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=48518

Change 48518 by rwatson at rwatson_paprika on 2004/03/09 12:31:40

	Loop back locking of global variables for if_faith, if_stf.
	Merg NDIS cleanup.

Affected files ...

.. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis_pccard.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis_pci.c#3 integrate
.. //depot/projects/netperf_socket/sys/net/if_faith.c#2 integrate
.. //depot/projects/netperf_socket/sys/net/if_stf.c#3 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis_pccard.c#2 (text+ko) ====

@@ -31,14 +31,11 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pccard.c,v 1.1 2004/03/07 02:49:06 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pccard.c,v 1.2 2004/03/09 20:29:21 wpaul Exp $");
 
 #include <sys/ctype.h>
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/sockio.h>
-#include <sys/mbuf.h>
-#include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/queue.h>
@@ -46,24 +43,15 @@
 
 #include <net/if.h>
 #include <net/if_arp.h>
-#include <net/ethernet.h>
-#include <net/if_dl.h>
 #include <net/if_media.h>
 
-#include <net/bpf.h>
-
-#include <machine/bus_memio.h>
-#include <machine/bus_pio.h>
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 
 #include <net80211/ieee80211_var.h>
-#include <net80211/ieee80211_ioctl.h>
 
-#include <dev/wi/if_wavelan_ieee.h>
-
 #include <compat/ndis/pe_var.h>
 #include <compat/ndis/resource_var.h>
 #include <compat/ndis/ntoskrnl_var.h>
@@ -200,8 +188,6 @@
 	struct ndis_pccard_type	*t;
 	int			devidx = 0;
 	const char		*prodstr, *vendstr;
-	struct resource_list	*rl;
-	struct resource_list_entry	*rle;
 
 	sc = device_get_softc(dev);
 	unit = device_get_unit(dev);

==== //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis_pci.c#3 (text+ko) ====

@@ -31,13 +31,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.2 2004/03/09 18:39:40 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.3 2004/03/09 20:29:21 wpaul Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/sockio.h>
-#include <sys/mbuf.h>
-#include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/queue.h>
@@ -45,23 +42,14 @@
 
 #include <net/if.h>
 #include <net/if_arp.h>
-#include <net/ethernet.h>
-#include <net/if_dl.h>
 #include <net/if_media.h>
 
-#include <net/bpf.h>
-
-#include <machine/bus_memio.h>
-#include <machine/bus_pio.h>
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 
 #include <net80211/ieee80211_var.h>
-#include <net80211/ieee80211_ioctl.h>
-
-#include <dev/wi/if_wavelan_ieee.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>

==== //depot/projects/netperf_socket/sys/net/if_faith.c#2 (text+ko) ====

@@ -32,7 +32,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/net/if_faith.c,v 1.25 2003/12/28 03:55:59 sam Exp $
+ * $FreeBSD: src/sys/net/if_faith.c,v 1.26 2004/03/09 19:23:06 rwatson Exp $
  */
 /*
  * derived from
@@ -99,11 +99,13 @@
 
 static int faithmodevent(module_t, int, void *);
 
+static struct mtx faith_mtx;
 static MALLOC_DEFINE(M_FAITH, FAITHNAME, "Firewall Assisted Tunnel Interface");
 static LIST_HEAD(, faith_softc) faith_softc_list;
 
 int	faith_clone_create(struct if_clone *, int);
 void	faith_clone_destroy(struct ifnet *);
+static void	faith_destroy(struct faith_softc *);
 
 struct if_clone faith_cloner = IF_CLONE_INITIALIZER(FAITHNAME,
     faith_clone_create, faith_clone_destroy, 0, IF_MAXUNIT);
@@ -116,9 +118,11 @@
 	int type;
 	void *data;
 {
+	struct faith_softc *sc;
 
 	switch (type) {
 	case MOD_LOAD:
+		mtx_init(&faith_mtx, "faith_mtx", NULL, MTX_DEF);
 		LIST_INIT(&faith_softc_list);
 		if_clone_attach(&faith_cloner);
 
@@ -134,10 +138,15 @@
 
 		if_clone_detach(&faith_cloner);
 
-		while (!LIST_EMPTY(&faith_softc_list))
-			faith_clone_destroy(
-			    &LIST_FIRST(&faith_softc_list)->sc_if);
-
+		mtx_lock(&faith_mtx);
+		while ((sc = LIST_FIRST(&faith_softc_list)) != NULL) {
+			LIST_REMOVE(sc, sc_list);
+			mtx_unlock(&faith_mtx);
+			faith_destroy(sc);
+			mtx_lock(&faith_mtx);
+		}
+		mtx_unlock(&faith_mtx);
+		mtx_destroy(&faith_mtx);
 		break;
 	}
 	return 0;
@@ -176,21 +185,32 @@
 	sc->sc_if.if_snd.ifq_maxlen = ifqmaxlen;
 	if_attach(&sc->sc_if);
 	bpfattach(&sc->sc_if, DLT_NULL, sizeof(u_int));
+	mtx_lock(&faith_mtx);
 	LIST_INSERT_HEAD(&faith_softc_list, sc, sc_list);
+	mtx_unlock(&faith_mtx);
 	return (0);
 }
 
+static void
+faith_destroy(struct faith_softc *sc)
+{
+
+	bpfdetach(&sc->sc_if);
+	if_detach(&sc->sc_if);
+	free(sc, M_FAITH);
+}
+
 void
 faith_clone_destroy(ifp)
 	struct ifnet *ifp;
 {
 	struct faith_softc *sc = (void *) ifp;
 
+	mtx_lock(&faith_mtx);
 	LIST_REMOVE(sc, sc_list);
-	bpfdetach(ifp);
-	if_detach(ifp);
+	mtx_unlock(&faith_mtx);
 
-	free(sc, M_FAITH);
+	faith_destroy(sc);
 }
 
 int

==== //depot/projects/netperf_socket/sys/net/if_stf.c#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/net/if_stf.c,v 1.36 2004/03/07 05:15:42 rwatson Exp $	*/
+/*	$FreeBSD: src/sys/net/if_stf.c,v 1.37 2004/03/09 20:29:19 rwatson Exp $	*/
 /*	$KAME: if_stf.c,v 1.73 2001/12/03 11:08:30 keiichi Exp $	*/
 
 /*
@@ -138,6 +138,13 @@
 	LIST_ENTRY(stf_softc) sc_list;	/* all stf's are linked */
 };
 
+/*
+ * All mutable global variables in if_stf.c are protected by stf_mtx.
+ * XXXRW: Note that mutable fields in the softc are not currently locked:
+ * in particular, sc_ro needs to be protected from concurrent entrance
+ * of stf_output().
+ */
+static struct mtx stf_mtx;
 static LIST_HEAD(, stf_softc) stf_softc_list;
 
 static MALLOC_DEFINE(M_STF, STFNAME, "6to4 Tunnel Interface");
@@ -197,24 +204,36 @@
 	sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN;
 	if_attach(&sc->sc_if);
 	bpfattach(&sc->sc_if, DLT_NULL, sizeof(u_int));
+	mtx_lock(&stf_mtx);
 	LIST_INSERT_HEAD(&stf_softc_list, sc, sc_list);
+	mtx_unlock(&stf_mtx);
 	return (0);
 }
 
+static void
+stf_destroy(struct stf_softc *sc)
+{
+	int err;
+
+	err = encap_detach(sc->encap_cookie);
+	KASSERT(err == 0, ("Unexpected error detaching encap_cookie"));
+	bpfdetach(&sc->sc_if);
+	if_detach(&sc->sc_if);
+
+	free(sc, M_STF);
+}
+
 void
 stf_clone_destroy(ifp)
 	struct ifnet *ifp;
 {
-	int err;
 	struct stf_softc *sc = (void *) ifp;
 
+	mtx_lock(&stf_mtx);
 	LIST_REMOVE(sc, sc_list);
-	err = encap_detach(sc->encap_cookie);
-	KASSERT(err == 0, ("Unexpected error detaching encap_cookie"));
-	bpfdetach(ifp);
-	if_detach(ifp);
+	mtx_unlock(&stf_mtx);
 
-	free(sc, M_STF);
+	stf_destroy(sc);
 }
 
 static int
@@ -223,9 +242,11 @@
 	int type;
 	void *data;
 {
+	struct stf_softc *sc;
 
 	switch (type) {
 	case MOD_LOAD:
+		mtx_init(&stf_mtx, "stf_mtx", NULL, MTX_DEF);
 		LIST_INIT(&stf_softc_list);
 		if_clone_attach(&stf_cloner);
 
@@ -233,8 +254,15 @@
 	case MOD_UNLOAD:
 		if_clone_detach(&stf_cloner);
 
-		while (!LIST_EMPTY(&stf_softc_list))
-			stf_clone_destroy(&LIST_FIRST(&stf_softc_list)->sc_if);
+		mtx_lock(&stf_mtx);
+		while ((sc = LIST_FIRST(&stf_softc_list)) != NULL) {
+			LIST_REMOVE(sc, sc_list);
+			mtx_unlock(&stf_mtx);
+			stf_destroy(sc);
+			mtx_lock(&stf_mtx);
+		}
+		mtx_unlock(&stf_mtx);
+		mtx_destroy(&stf_mtx);
 		break;
 	}
 
@@ -467,6 +495,9 @@
 	else
 		ip_ecn_ingress(ECN_NOCARE, &ip->ip_tos, &tos);
 
+	/*
+	 * XXXRW: Locking of sc_ro required.
+	 */
 	dst4 = (struct sockaddr_in *)&sc->sc_ro.ro_dst;
 	if (dst4->sin_family != AF_INET ||
 	    bcmp(&dst4->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst)) != 0) {


More information about the p4-projects mailing list