Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Mar 2004 16:16:01 -0800 (PST)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 49927 for review
Message-ID:  <200403300016.i2U0G1Sg009821@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=49927

Change 49927 by rwatson@rwatson_paprika on 2004/03/29 16:15:23

	Integrate netperf_socket:
	
	Death of umapfs recognized, but NFS will work better.
	if_oltr FreeBSD 3.x source compatibility removed.
	KSE comments updated.
	Loop back of if_tun softc locking from rwatson_netperf.
	More kstack size fixes.

Affected files ...

.. //depot/projects/netperf_socket/sys/amd64/amd64/vm_machdep.c#5 integrate
.. //depot/projects/netperf_socket/sys/conf/NOTES#9 integrate
.. //depot/projects/netperf_socket/sys/contrib/dev/oltr/if_oltr.c#3 integrate
.. //depot/projects/netperf_socket/sys/fs/umapfs/umap_vnops.c#2 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/vm_machdep.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_sig.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_default.c#2 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_subr.c#5 integrate
.. //depot/projects/netperf_socket/sys/libkern/index.c#2 integrate
.. //depot/projects/netperf_socket/sys/libkern/rindex.c#2 integrate
.. //depot/projects/netperf_socket/sys/modules/Makefile#7 integrate
.. //depot/projects/netperf_socket/sys/net/if_tun.c#7 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/vm_machdep.c#4 integrate
.. //depot/projects/netperf_socket/sys/sys/vnode.h#3 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/amd64/amd64/vm_machdep.c#5 (text+ko) ====

@@ -41,10 +41,9 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.230 2004/03/25 03:39:38 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.231 2004/03/29 19:38:05 peter Exp $");
 
 #include "opt_isa.h"
-#include "opt_kstack_pages.h"
 #include "opt_cpu.h"
 
 #include <sys/param.h>

==== //depot/projects/netperf_socket/sys/conf/NOTES#9 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1207 2004/03/18 12:22:31 brueffer Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1208 2004/03/29 22:41:20 peter Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -701,7 +701,8 @@
 options 	PSEUDOFS		#Pseudo-filesystem framework
 options 	SMBFS			#SMB/CIFS filesystem
 options 	UDF			#Universal Disk Format
-options 	UMAPFS			#UID map filesystem
+#umapfs is seriously (functionally) broken at this point.
+#options 	UMAPFS			#UID map filesystem
 options 	UNIONFS			#Union filesystem
 # The xFS_ROOT options REQUIRE the associated ``options xFS''
 options 	NFS_ROOT		#NFS usable as root device

==== //depot/projects/netperf_socket/sys/contrib/dev/oltr/if_oltr.c#3 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/contrib/dev/oltr/if_oltr.c,v 1.32 2004/03/17 17:50:23 njl Exp $
+ * $FreeBSD: src/sys/contrib/dev/oltr/if_oltr.c,v 1.33 2004/03/29 21:10:05 imp Exp $
  */
 
 #include <sys/param.h>
@@ -50,11 +50,6 @@
 #include <net/if_media.h>
 #include <net/iso88025.h>
 
-#if (__FreeBSD_version < 400000)
-#include <bpfilter.h>
-#endif
-
-#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
 #include <net/bpf.h>
 
 #ifndef BPF_MTAP
@@ -63,7 +58,6 @@
 		bpf_mtap((_ifp), (_m));			\
 } while (0)
 #endif
-#endif
 
 #include <vm/vm.h>              /* for vtophys */
 #include <vm/pmap.h>            /* for vtophys */
@@ -238,8 +232,6 @@
 static int oltr_ifmedia_upd	__P((struct ifnet *));
 static void oltr_ifmedia_sts	__P((struct ifnet *, struct ifmediareq *));
 
-#if __FreeBSD_version > 400000
-
 static int oltr_pci_probe		__P((device_t));
 static int oltr_pci_attach	__P((device_t));
 static int oltr_pci_detach	__P((device_t));
@@ -488,200 +480,7 @@
 	return;
 }
 
-#else
-
-static const char *oltr_pci_probe	__P((pcici_t, pcidi_t));
-static void oltr_pci_attach		__P((pcici_t, int));
-
-static unsigned long oltr_count = 0;
-
-static struct pci_device oltr_device = {
-	"oltr",
-	oltr_pci_probe,
-	oltr_pci_attach,
-	&oltr_count,
-	NULL
-};
-
-DATA_SET(pcidevice_set, oltr_device);
-
-static const char *
-oltr_pci_probe(pcici_t config_id, pcidi_t device_id)
-{
-        int                     i, rc;
-        char                    PCIConfigHeader[64];
-        TRlldAdapterConfig_t    config;
-	
-	if (((device_id & 0xffff) == PCI_VENDOR_OLICOM) && (
-	    (((device_id >> 16) & 0xffff) == 0x0001) ||
-	    (((device_id >> 16) & 0xffff) == 0x0004) ||
-	    (((device_id >> 16) & 0xffff) == 0x0005) ||
-	    (((device_id >> 16) & 0xffff) == 0x0007) ||
-	    (((device_id >> 16) & 0xffff) == 0x0008))) {
-	
-		for (i = 0; i < 64; i++)
-			PCIConfigHeader[i] = pci_cfgread(config_id, i, /* bytes */ 1);
-
-		rc = TRlldPCIConfig(&LldDriver, &config, PCIConfigHeader);
-
-		if (rc == TRLLD_PCICONFIG_FAIL) {
-			printf("oltr: TRlldPciConfig failed!\n");
-			return(NULL);
-		}
-		if (rc == TRLLD_PCICONFIG_VERSION) {
-			printf("oltr: wrong LLD version.\n");
-			return(NULL);
-		}
-		return(AdapterName[config.type]);
-	}
-
-	return(NULL);
-}
-
 static void
-oltr_pci_attach(pcici_t config_id, int unit)
-{
-        int 			i, s, rc = 0, scratch_size;
-	int			media = IFM_TOKEN|IFM_TOK_UTP16;
-	u_long 			command;
-	char 			PCIConfigHeader[64];
-	struct oltr_softc		*sc;
-	struct ifnet		*ifp; /* = &sc->arpcom.ac_if; */
-
-        s = splimp();
-
-	sc = malloc(sizeof(struct oltr_softc), M_DEVBUF, M_NOWAIT | M_ZERO);
-	if (sc == NULL) {
-		printf("oltr%d: no memory for softc struct!\n", unit);
-		goto config_failed;
-	}
-	sc->unit = unit;
-	sc->state = OL_UNKNOWN;
-	ifp = &sc->arpcom.ac_if;
-
-	for (i = 0; i < sizeof(PCIConfigHeader); i++)
-		PCIConfigHeader[i] = pci_cfgread(config_id, i, 1);
-
-	switch(TRlldPCIConfig(&LldDriver, &sc->config, PCIConfigHeader)) {
-	case TRLLD_PCICONFIG_OK:
-		break;
-	case TRLLD_PCICONFIG_SET_COMMAND:
-		printf("oltr%d: enabling bus master mode\n", unit);
-		command = pci_conf_read(config_id, PCIR_COMMAND);
-		pci_conf_write(config_id, PCIR_COMMAND, (command | PCIM_CMD_BUSMASTEREN));
-		command = pci_conf_read(config_id, PCIR_COMMAND);
-		if (!(command & PCIM_CMD_BUSMASTEREN)) {
-			printf("oltr%d: failed to enable bus master mode\n", unit);
-			goto config_failed;
-		}
-		break;
-	case TRLLD_PCICONFIG_FAIL:
-		printf("oltr%d: TRlldPciConfig failed!\n", unit);
-		goto config_failed;
-		break;
-	case TRLLD_PCICONFIG_VERSION:
-		printf("oltr%d: wrong LLD version\n", unit);
-		goto config_failed;
-		break;
-	}
-	printf("oltr%d: MAC address %6D\n", unit, sc->config.macaddress, ":");
-
-	scratch_size = TRlldAdapterSize();
-	if (bootverbose)
-		printf("oltr%d: adapter memory block size %d bytes\n", unit, scratch_size);
-	sc->TRlldAdapter = (TRlldAdapter_t)malloc(scratch_size, M_DEVBUF, M_NOWAIT);
-	if (sc->TRlldAdapter == NULL) {
-		printf("oltr%d: couldn't allocate scratch buffer (%d bytes)\n",unit, scratch_size);
-		goto config_failed;
-	}
-
-	/*
-	 * Allocate RX/TX Pools
-	 */
-	for (i = 0; i < RING_BUFFER_LEN; i++) {
-		sc->rx_ring[i].index = i;
-		sc->rx_ring[i].data = (char *)malloc(RX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
-		sc->rx_ring[i].address = vtophys(sc->rx_ring[i].data);
-		sc->tx_ring[i].index = i;
-		sc->tx_ring[i].data = (char *)malloc(TX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
-		sc->tx_ring[i].address = vtophys(sc->tx_ring[i].data);
-		if ((!sc->rx_ring[i].data) || (!sc->tx_ring[i].data)) {
-			printf("oltr%d: unable to allocate ring buffers\n", unit);
-			while (i > 0) {
-				if (sc->rx_ring[i].data)
-					free(sc->rx_ring[i].data, M_DEVBUF);
-				if (sc->tx_ring[i].data)
-					free(sc->tx_ring[i].data, M_DEVBUF);
-				i--;
-			}
-			goto config_failed;
-		}
-	}
-	
-	/*
-	 * Allocate interrupt and DMA channel
-	 */
-	if (!pci_map_int(config_id, oltr_intr, sc, &net_imask)) {
-		printf("oltr%d: couldn't setup interrupt\n", unit);
-		goto config_failed;
-	}
-
-	/*
-	 * Do the ifnet initialization
-	 */
-	ifp->if_softc	= sc;
-	ifp->if_unit	= unit;
-	ifp->if_name	= "oltr";
-	ifp->if_output	= iso88025_output;
-	ifp->if_init	= oltr_init;
-	ifp->if_start	= oltr_start;
-	ifp->if_ioctl	= oltr_ioctl;
-	ifp->if_flags	= IFF_BROADCAST;
-	bcopy(sc->config.macaddress, sc->arpcom.ac_enaddr, sizeof(sc->config.macaddress));
-
-	/*
-	 * Do ifmedia setup.
-	 */
-	ifmedia_init(&sc->ifmedia, 0, oltr_ifmedia_upd, oltr_ifmedia_sts);
-	rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
-	switch(sc->config.type) {
-	case TRLLD_ADAPTER_PCI7:	/* OC-3540 */
-		ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP100, 0, NULL);
-		/* FALL THROUGH */
-	case TRLLD_ADAPTER_PCI4:	/* OC-3139 */
-	case TRLLD_ADAPTER_PCI5:	/* OC-3140 */
-	case TRLLD_ADAPTER_PCI6:	/* OC-3141 */
-		ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_AUTO, 0, NULL);
-		media = IFM_TOKEN|IFM_AUTO;
-		rc = TRlldSetSpeed(sc->TRlldAdapter, 0);
-		/* FALL THROUGH */
-	default:
-		ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP4, 0, NULL);
-		ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16, 0, NULL);
-		break;
-	}
-	sc->ifmedia.ifm_media = media;
-	ifmedia_set(&sc->ifmedia, media);
-
-	/*
-	 * Attach the interface
-	 */
-	if_attach(ifp);
-	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
-	iso88025_ifattach(ifp);
-
-	splx(s);
-	return;
-
-config_failed:
-        (void)splx(s);
-
-	return;
-}
-
-#endif
-
-static void
 oltr_intr(void *xsc)
 {
 	struct oltr_softc		*sc = (struct oltr_softc *)xsc;
@@ -761,9 +560,7 @@
 	sc->tx_head = RING_BUFFER((sc->tx_head + sc->frame_ring[frame].FragmentCount));
 	sc->tx_frame++;
 
-#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
 	BPF_MTAP(ifp, m0);
-#endif
 	/*ifp->if_opackets++;*/
 
 bad:

==== //depot/projects/netperf_socket/sys/fs/umapfs/umap_vnops.c#2 (text+ko) ====

@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)umap_vnops.c	8.6 (Berkeley) 5/22/95
- * $FreeBSD: src/sys/fs/umapfs/umap_vnops.c,v 1.38 2003/03/03 19:15:39 njl Exp $
+ * $FreeBSD: src/sys/fs/umapfs/umap_vnops.c,v 1.39 2004/03/29 22:41:20 peter Exp $
  */
 
 /*
@@ -363,6 +363,15 @@
 	} */ *ap;
 {
 
+	/*
+	 * vop_nolock no longer exists.  I could have pasted the code
+	 * in so that it compiles, but that would be doing our users a
+	 * great disservice.  umapfs is about 5 years behind the nullfs
+	 * code that it is derived from.  The stub locking here guarantees
+	 * a deadlock the moment a VOP_INACTIVE arrives.  There is no point
+	 * pasting the code that makes it compile either, because that just
+	 * makes it Even More Wrong.
+	 */
 	vop_nolock(ap);
 	if ((ap->a_flags & LK_TYPE_MASK) == LK_DRAIN)
 		return (0);

==== //depot/projects/netperf_socket/sys/i386/i386/vm_machdep.c#8 (text+ko) ====

@@ -41,10 +41,9 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.233 2004/03/22 00:28:38 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.234 2004/03/29 19:38:05 peter Exp $");
 
 #include "opt_isa.h"
-#include "opt_kstack_pages.h"
 #include "opt_npx.h"
 #ifdef PC98
 #include "opt_pc98.h"

==== //depot/projects/netperf_socket/sys/kern/kern_sig.c#5 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_sig.c,v 1.273 2004/03/05 22:39:53 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_sig.c,v 1.274 2004/03/29 22:46:54 peter Exp $");
 
 #include "opt_compat.h"
 #include "opt_ktrace.h"
@@ -1875,10 +1875,8 @@
 		mtx_unlock_spin(&sched_lock);
 		goto out;
 		/*
-		 * XXXKSE  What about threads that are waiting on mutexes?
-		 * Shouldn't they abort too?
-		 * No, hopefully mutexes are short lived.. They'll
-		 * eventually hit thread_suspend_check().
+		 * Mutexes are short lived. Threads waiting on them will
+		 * hit thread_suspend_check() soon.
 		 */
 	}  else if (p->p_state == PRS_NORMAL) {
 		if ((p->p_flag & P_TRACED) || (action != SIG_DFL) ||

==== //depot/projects/netperf_socket/sys/kern/vfs_default.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_default.c,v 1.91 2003/11/05 04:30:07 kan Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_default.c,v 1.92 2004/03/29 22:41:20 peter Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -369,166 +369,6 @@
 }
 
 /*
- * Stubs to use when there is no locking to be done on the underlying object.
- * A minimal shared lock is necessary to ensure that the underlying object
- * is not revoked while an operation is in progress. So, an active shared
- * count is maintained in an auxillary vnode lock structure.
- */
-int
-vop_sharedlock(ap)
-	struct vop_lock_args /* {
-		struct vnode *a_vp;
-		int a_flags;
-		struct thread *a_td;
-	} */ *ap;
-{
-	/*
-	 * This code cannot be used until all the non-locking filesystems
-	 * (notably NFS) are converted to properly lock and release nodes.
-	 * Also, certain vnode operations change the locking state within
-	 * the operation (create, mknod, remove, link, rename, mkdir, rmdir,
-	 * and symlink). Ideally these operations should not change the
-	 * lock state, but should be changed to let the caller of the
-	 * function unlock them. Otherwise all intermediate vnode layers
-	 * (such as union, umapfs, etc) must catch these functions to do
-	 * the necessary locking at their layer. Note that the inactive
-	 * and lookup operations also change their lock state, but this
-	 * cannot be avoided, so these two operations will always need
-	 * to be handled in intermediate layers.
-	 */
-	struct vnode *vp = ap->a_vp;
-	int vnflags, flags = ap->a_flags;
-
-	switch (flags & LK_TYPE_MASK) {
-	case LK_DRAIN:
-		vnflags = LK_DRAIN;
-		break;
-	case LK_EXCLUSIVE:
-#ifdef DEBUG_VFS_LOCKS
-		/*
-		 * Normally, we use shared locks here, but that confuses
-		 * the locking assertions.
-		 */
-		vnflags = LK_EXCLUSIVE;
-		break;
-#endif
-	case LK_SHARED:
-		vnflags = LK_SHARED;
-		break;
-	case LK_UPGRADE:
-	case LK_EXCLUPGRADE:
-	case LK_DOWNGRADE:
-		return (0);
-	case LK_RELEASE:
-	default:
-		panic("vop_sharedlock: bad operation %d", flags & LK_TYPE_MASK);
-	}
-	vnflags |= flags & (LK_INTERLOCK | LK_EXTFLG_MASK);
-#ifndef	DEBUG_LOCKS
-	return (lockmgr(vp->v_vnlock, vnflags, VI_MTX(vp), ap->a_td));
-#else
-	return (debuglockmgr(vp->v_vnlock, vnflags, VI_MTX(vp), ap->a_td,
-	    "vop_sharedlock", vp->filename, vp->line));
-#endif
-}
-
-/*
- * Stubs to use when there is no locking to be done on the underlying object.
- * A minimal shared lock is necessary to ensure that the underlying object
- * is not revoked while an operation is in progress. So, an active shared
- * count is maintained in an auxillary vnode lock structure.
- */
-int
-vop_nolock(ap)
-	struct vop_lock_args /* {
-		struct vnode *a_vp;
-		int a_flags;
-		struct thread *a_td;
-	} */ *ap;
-{
-#ifdef notyet
-	/*
-	 * This code cannot be used until all the non-locking filesystems
-	 * (notably NFS) are converted to properly lock and release nodes.
-	 * Also, certain vnode operations change the locking state within
-	 * the operation (create, mknod, remove, link, rename, mkdir, rmdir,
-	 * and symlink). Ideally these operations should not change the
-	 * lock state, but should be changed to let the caller of the
-	 * function unlock them. Otherwise all intermediate vnode layers
-	 * (such as union, umapfs, etc) must catch these functions to do
-	 * the necessary locking at their layer. Note that the inactive
-	 * and lookup operations also change their lock state, but this
-	 * cannot be avoided, so these two operations will always need
-	 * to be handled in intermediate layers.
-	 */
-	struct vnode *vp = ap->a_vp;
-	int vnflags, flags = ap->a_flags;
-
-	switch (flags & LK_TYPE_MASK) {
-	case LK_DRAIN:
-		vnflags = LK_DRAIN;
-		break;
-	case LK_EXCLUSIVE:
-	case LK_SHARED:
-		vnflags = LK_SHARED;
-		break;
-	case LK_UPGRADE:
-	case LK_EXCLUPGRADE:
-	case LK_DOWNGRADE:
-		return (0);
-	case LK_RELEASE:
-	default:
-		panic("vop_nolock: bad operation %d", flags & LK_TYPE_MASK);
-	}
-	vnflags |= flags & (LK_INTERLOCK | LK_EXTFLG_MASK);
-	return(lockmgr(vp->v_vnlock, vnflags, VI_MTX(vp), ap->a_td));
-#else /* for now */
-	/*
-	 * Since we are not using the lock manager, we must clear
-	 * the interlock here.
-	 */
-	if (ap->a_flags & LK_INTERLOCK)
-		VI_UNLOCK(ap->a_vp);
-	return (0);
-#endif
-}
-
-/*
- * Do the inverse of vop_nolock, handling the interlock in a compatible way.
- */
-int
-vop_nounlock(ap)
-	struct vop_unlock_args /* {
-		struct vnode *a_vp;
-		int a_flags;
-		struct thread *a_td;
-	} */ *ap;
-{
-
-	/*
-	 * Since we are not using the lock manager, we must clear
-	 * the interlock here.
-	 */
-	if (ap->a_flags & LK_INTERLOCK)
-		VI_UNLOCK(ap->a_vp);
-	return (0);
-}
-
-/*
- * Return whether or not the node is in use.
- */
-int
-vop_noislocked(ap)
-	struct vop_islocked_args /* {
-		struct vnode *a_vp;
-		struct thread *a_td;
-	} */ *ap;
-{
-
-	return (0);
-}
-
-/*
  * Return our mount point, as we will take charge of the writes.
  */
 int

==== //depot/projects/netperf_socket/sys/kern/vfs_subr.c#5 (text+ko) ====

@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.487 2004/03/11 18:02:35 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.488 2004/03/29 22:45:33 peter Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mac.h"
@@ -532,7 +532,7 @@
 	struct mount *mp, *nmp;
 	int done;
 	struct proc *p = vnlruproc;
-	struct thread *td = FIRST_THREAD_IN_PROC(p);	/* XXXKSE */
+	struct thread *td = FIRST_THREAD_IN_PROC(p);
 
 	mtx_lock(&Giant);
 
@@ -1487,7 +1487,7 @@
 	struct vnode *vp;
 	struct mount *mp;
 	long starttime;
-	struct thread *td = FIRST_THREAD_IN_PROC(updateproc);  /* XXXKSE */
+	struct thread *td = FIRST_THREAD_IN_PROC(updateproc);
 
 	mtx_lock(&Giant);
 
@@ -1591,7 +1591,6 @@
  * Request the syncer daemon to speed up its work.
  * We never push it to speed up more than half of its
  * normal turn time, otherwise it could take over the cpu.
- * XXXKSE  only one update?
  */
 int
 speedup_syncer()

==== //depot/projects/netperf_socket/sys/libkern/index.c#2 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/libkern/index.c,v 1.7 2003/06/11 05:23:04 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/libkern/index.c,v 1.8 2004/03/29 21:15:41 robert Exp $");
 
 #include <sys/param.h>
 #include <sys/libkern.h>
@@ -51,7 +51,7 @@
 	for (;; ++u.p) {
 		if (*u.p == ch)
 			return(u.p);
-		if (!*u.p)
+		if (*u.p == '\0')
 			return(NULL);
 	}
 	/* NOTREACHED */

==== //depot/projects/netperf_socket/sys/libkern/rindex.c#2 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/libkern/rindex.c,v 1.8 2003/06/11 05:23:04 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/libkern/rindex.c,v 1.9 2004/03/29 21:15:41 robert Exp $");
 
 #include <sys/param.h>
 #include <sys/libkern.h>
@@ -52,7 +52,7 @@
 	for (save = NULL;; ++u.p) {
 		if (*u.p == ch)
 			save = u.p;
-		if (!*u.p)
+		if (*u.p == '\0')
 			return(save);
 	}
 	/* NOTREACHED */

==== //depot/projects/netperf_socket/sys/modules/Makefile#7 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/modules/Makefile,v 1.374 2004/03/25 17:20:45 rik Exp $
+# $FreeBSD: src/sys/modules/Makefile,v 1.375 2004/03/29 22:41:21 peter Exp $
 
 # pcic -- currently broken and being worked on out of tree.
 # oldcard -- specialized use for debugging only.
@@ -222,7 +222,6 @@
 	uhid \
 	ukbd \
 	ulpt \
-	umapfs \
 	umass \
 	umct \
 	umodem \

==== //depot/projects/netperf_socket/sys/net/if_tun.c#7 (text+ko) ====

@@ -13,7 +13,7 @@
  * UCL. This driver is based much more on read/write/poll mode of
  * operation though.
  *
- * $FreeBSD: src/sys/net/if_tun.c,v 1.138 2004/03/29 18:42:51 rwatson Exp $
+ * $FreeBSD: src/sys/net/if_tun.c,v 1.139 2004/03/29 22:16:39 rwatson Exp $
  */
 
 #include "opt_atalk.h"
@@ -55,6 +55,11 @@
 
 #include <sys/queue.h>
 
+/*
+ * tun_list is protected by global tunmtx.  Other mutable fields are
+ * protected by tun->tun_mtx, or by their owning subsystem.  tun_dev is
+ * static for the duration of a tunnel interface.
+ */
 struct tun_softc {
 	TAILQ_ENTRY(tun_softc)	tun_list;
 	dev_t			tun_dev;
@@ -82,6 +87,7 @@
 	struct	ifnet tun_if;		/* the interface */
 	struct  sigio *tun_sigio;	/* information for async I/O */
 	struct	selinfo	tun_rsel;	/* read select */
+	struct mtx	tun_mtx;	/* protect mutable softc fields */
 };
 
 #define TUNDEBUG	if (tundebug) if_printf
@@ -158,6 +164,7 @@
 {
 	dev_t dev;
 
+	/* Unlocked read. */
 	KASSERT((tp->tun_flags & TUN_OPEN) == 0,
 	    ("tununits is out of sync - unit %d", tp->tun_if.if_dunit));
 
@@ -165,6 +172,7 @@
 	bpfdetach(&tp->tun_if);
 	if_detach(&tp->tun_if);
 	destroy_dev(dev);
+	mtx_destroy(&tp->tun_mtx);
 	free(tp, M_TUN);
 }
 
@@ -213,12 +221,16 @@
 {
 	struct tun_softc *tp = ifp->if_softc;
 
+	mtx_lock(&tp->tun_mtx);
 	if (tp->tun_flags & TUN_RWAIT) {
 		tp->tun_flags &= ~TUN_RWAIT;
 		wakeup(tp);
 	}
-	if (tp->tun_flags & TUN_ASYNC && tp->tun_sigio)
+	if (tp->tun_flags & TUN_ASYNC && tp->tun_sigio) {
+		mtx_unlock(&tp->tun_mtx);
 		pgsigio(&tp->tun_sigio, SIGIO, 0);
+	} else
+		mtx_unlock(&tp->tun_mtx);
 	selwakeuppri(&tp->tun_rsel, PZERO + 1);
 }
 
@@ -231,6 +243,7 @@
 	dev->si_flags &= ~SI_CHEAPCLONE;
 
 	MALLOC(sc, struct tun_softc *, sizeof(*sc), M_TUN, M_WAITOK | M_ZERO);
+	mtx_init(&sc->tun_mtx, "tun_mtx", NULL, MTX_DEF);
 	sc->tun_flags = TUN_INITED;
 	sc->tun_dev = dev;
 	mtx_lock(&tunmtx);
@@ -258,17 +271,31 @@
 	struct ifnet	*ifp;
 	struct tun_softc *tp;
 
+	/*
+	 * XXXRW: Non-atomic test and set of dev->si_drv1 requires
+	 * synchronization.
+	 */
 	tp = dev->si_drv1;
 	if (!tp) {
 		tuncreate(dev);
 		tp = dev->si_drv1;
 	}
 
-	if (tp->tun_pid != 0 && tp->tun_pid != td->td_proc->p_pid)
+	/*
+	 * XXXRW: This use of tun_pid is subject to error due to the
+	 * fact that a reference to the tunnel can live beyond the
+	 * death of the process that created it.  Can we replace this
+	 * with a simple busy flag?
+	 */
+	mtx_lock(&tp->tun_mtx);
+	if (tp->tun_pid != 0 && tp->tun_pid != td->td_proc->p_pid) {
+		mtx_unlock(&tp->tun_mtx);
 		return (EBUSY);
+	}
 	tp->tun_pid = td->td_proc->p_pid;
 
 	tp->tun_flags |= TUN_OPEN;
+	mtx_unlock(&tp->tun_mtx);
 	ifp = &tp->tun_if;
 	TUNDEBUG(ifp, "open\n");
 
@@ -289,8 +316,10 @@
 	tp = dev->si_drv1;
 	ifp = &tp->tun_if;
 
+	mtx_lock(&tp->tun_mtx);
 	tp->tun_flags &= ~TUN_OPEN;
 	tp->tun_pid = 0;
+	mtx_unlock(&tp->tun_mtx);
 
 	/*
 	 * junk all pending output
@@ -310,6 +339,7 @@
 		/* find internet addresses and delete routes */
 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
 			if (ifa->ifa_addr->sa_family == AF_INET)
+				/* Unlocked read. */
 				rtinit(ifa, (int)RTM_DELETE,
 				    tp->tun_flags & TUN_DSTADDR ? RTF_HOST : 0);
 		ifp->if_flags &= ~IFF_RUNNING;
@@ -345,12 +375,14 @@
 			    struct sockaddr_in *si;
 
 			    si = (struct sockaddr_in *)ifa->ifa_addr;
+			    mtx_lock(&tp->tun_mtx);
 			    if (si->sin_addr.s_addr)
 				    tp->tun_flags |= TUN_IASET;
 
 			    si = (struct sockaddr_in *)ifa->ifa_dstaddr;
 			    if (si && si->sin_addr.s_addr)
 				    tp->tun_flags |= TUN_DSTADDR;
+			    mtx_unlock(&tp->tun_mtx);
 			}
 #endif
 		}
@@ -373,9 +405,11 @@
 	switch(cmd) {
 	case SIOCGIFSTATUS:
 		ifs = (struct ifstat *)data;
+		mtx_lock(&tp->tun_mtx);
 		if (tp->tun_pid)
 			sprintf(ifs->ascii + strlen(ifs->ascii),
 			    "\tOpened by PID %d\n", tp->tun_pid);
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case SIOCSIFADDR:
 		error = tuninit(ifp);
@@ -411,6 +445,7 @@
 	struct rtentry *rt)
 {
 	struct tun_softc *tp = ifp->if_softc;
+	u_short cached_tun_flags;
 #ifdef MAC
 	int error;
 #endif
@@ -425,7 +460,11 @@
 	}
 #endif
 
-	if ((tp->tun_flags & TUN_READY) != TUN_READY) {
+	/* Could be unlocked read? */
+	mtx_lock(&tp->tun_mtx);
+	cached_tun_flags = tp->tun_flags;
+	mtx_unlock(&tp->tun_mtx);
+	if ((cached_tun_flags & TUN_READY) != TUN_READY) {
 		TUNDEBUG (ifp, "not ready 0%o\n", tp->tun_flags);
 		m_freem (m0);
 		return (EHOSTDOWN);
@@ -450,7 +489,7 @@
 	}
 
 	/* prepend sockaddr? this may abort if the mbuf allocation fails */
-	if (tp->tun_flags & TUN_LMODE) {
+	if (cached_tun_flags & TUN_LMODE) {
 		/* allocate space for sockaddr */
 		M_PREPEND(m0, dst->sa_len, M_DONTWAIT);
 
@@ -464,7 +503,7 @@
 		}
 	}
 
-	if (tp->tun_flags & TUN_IFHEAD) {
+	if (cached_tun_flags & TUN_IFHEAD) {
 		/* Prepend the address family */
 		M_PREPEND(m0, 4, M_DONTWAIT);
 
@@ -529,21 +568,28 @@
 		*(int *)data = tundebug;
 		break;
 	case TUNSLMODE:
+		mtx_lock(&tp->tun_mtx);
 		if (*(int *)data) {
 			tp->tun_flags |= TUN_LMODE;
 			tp->tun_flags &= ~TUN_IFHEAD;
 		} else
 			tp->tun_flags &= ~TUN_LMODE;
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case TUNSIFHEAD:
+		mtx_lock(&tp->tun_mtx);
 		if (*(int *)data) {
 			tp->tun_flags |= TUN_IFHEAD;
 			tp->tun_flags &= ~TUN_LMODE;
 		} else
 			tp->tun_flags &= ~TUN_IFHEAD;
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case TUNGIFHEAD:
+		/* Could be unlocked read? */
+		mtx_lock(&tp->tun_mtx);
 		*(int *)data = (tp->tun_flags & TUN_IFHEAD) ? 1 : 0;
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case TUNSIFMODE:
 		/* deny this if UP */
@@ -562,15 +608,19 @@
 		}
 		break;
 	case TUNSIFPID:
+		mtx_lock(&tp->tun_mtx);
 		tp->tun_pid = curthread->td_proc->p_pid;
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case FIONBIO:
 		break;
 	case FIOASYNC:
+		mtx_lock(&tp->tun_mtx);
 		if (*(int *)data)
 			tp->tun_flags |= TUN_ASYNC;
 		else
 			tp->tun_flags &= ~TUN_ASYNC;
+		mtx_unlock(&tp->tun_mtx);
 		break;
 	case FIONREAD:
 		s = splimp();
@@ -617,12 +667,15 @@
 	int		error=0, len, s;
 
 	TUNDEBUG (ifp, "read\n");
+	mtx_lock(&tp->tun_mtx);
 	if ((tp->tun_flags & TUN_READY) != TUN_READY) {
+		mtx_unlock(&tp->tun_mtx);
 		TUNDEBUG (ifp, "not ready 0%o\n", tp->tun_flags);
 		return (EHOSTDOWN);
 	}
 
 	tp->tun_flags &= ~TUN_RWAIT;
+	mtx_unlock(&tp->tun_mtx);
 
 	s = splimp();
 	do {
@@ -632,7 +685,9 @@
 				splx(s);
 				return (EWOULDBLOCK);
 			}
+			mtx_lock(&tp->tun_mtx);
 			tp->tun_flags |= TUN_RWAIT;
+			mtx_unlock(&tp->tun_mtx);
 			if((error = tsleep(tp, PCATCH | (PZERO + 1),
 					"tunread", 0)) != 0) {
 				splx(s);
@@ -719,14 +774,19 @@
 	mac_create_mbuf_from_ifnet(ifp, top);
 #endif
 
+	/* Could be unlocked read? */
+	mtx_lock(&tp->tun_mtx);
 	if (tp->tun_flags & TUN_IFHEAD) {
+		mtx_unlock(&tp->tun_mtx);
 		if (top->m_len < sizeof(family) &&
 		    (top = m_pullup(top, sizeof(family))) == NULL)
 			return (ENOBUFS);
 		family = ntohl(*mtod(top, u_int32_t *));
 		m_adj(top, sizeof(family));
-	} else
+	} else {
+		mtx_unlock(&tp->tun_mtx);
 		family = AF_INET;
+	}
 
 	BPF_MTAP2(ifp, &family, sizeof(family), top);
 

==== //depot/projects/netperf_socket/sys/powerpc/powerpc/vm_machdep.c#4 (text+ko) ====

@@ -38,7 +38,7 @@
  *
  *	from: @(#)vm_machdep.c	7.3 (Berkeley) 5/13/91
  *	Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
- * $FreeBSD: src/sys/powerpc/powerpc/vm_machdep.c,v 1.98 2004/03/16 19:04:28 alc Exp $
+ * $FreeBSD: src/sys/powerpc/powerpc/vm_machdep.c,v 1.99 2004/03/29 19:38:05 peter Exp $
  */
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -67,8 +67,6 @@
  * rights to redistribute these changes.
  */
 
-#include "opt_kstack_pages.h"
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
@@ -139,8 +137,8 @@
 
 	p1 = td1->td_proc;
 
-	pcb = (struct pcb *)((td2->td_kstack + KSTACK_PAGES * PAGE_SIZE -
-	    sizeof(struct pcb)) & ~0x2fU);
+	pcb = (struct pcb *)((td2->td_kstack +
+	    td2->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb)) & ~0x2fU);
 	td2->td_pcb = pcb;
 
 	/* Copy the pcb */
@@ -357,7 +355,7 @@
 {
 	struct pcb *pcb;
 
-	pcb = (struct pcb *)((td->td_kstack + KSTACK_PAGES * PAGE_SIZE -
+	pcb = (struct pcb *)((td->td_kstack + td2->td_kstack_pages * PAGE_SIZE -
 	    sizeof(struct pcb)) & ~0x2fU);
 	td->td_pcb = pcb;
 	td->td_frame = (struct trapframe *)pcb - 1;

==== //depot/projects/netperf_socket/sys/sys/vnode.h#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)vnode.h	8.7 (Berkeley) 2/4/94
- * $FreeBSD: src/sys/sys/vnode.h,v 1.234 2004/03/11 16:33:11 phk Exp $
+ * $FreeBSD: src/sys/sys/vnode.h,v 1.235 2004/03/29 22:41:21 peter Exp $
  */
 
 #ifndef _SYS_VNODE_H_
@@ -697,14 +697,10 @@

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403300016.i2U0G1Sg009821>