PERFORCE change 55287 for review

Robert Watson rwatson at FreeBSD.org
Sat Jun 19 04:24:46 GMT 2004


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

Change 55287 by rwatson at rwatson_paprika on 2004/06/19 04:24:38

	Integrate netperf_socket to loop-back initial sosend/soreceive,
	sbwait/sblock locking.

Affected files ...

.. //depot/projects/netperf_socket/sys/amd64/amd64/fpu.c#5 integrate
.. //depot/projects/netperf_socket/sys/compat/linux/linux_ioctl.c#4 integrate
.. //depot/projects/netperf_socket/sys/compat/linux/linux_ioctl.h#4 integrate
.. //depot/projects/netperf_socket/sys/contrib/dev/ath/freebsd/ah_osdep.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/Osd/OsdHardware.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/Osd/OsdSynch.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_cpu.c#10 integrate
.. //depot/projects/netperf_socket/sys/dev/firewire/sbp.c#5 integrate
.. //depot/projects/netperf_socket/sys/fs/devfs/devfs_devs.c#4 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#2 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_drive.c#4 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_plex.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_volume.c#3 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_exit.c#12 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_thread.c#13 integrate
.. //depot/projects/netperf_socket/sys/kern/subr_prf.c#4 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#20 edit
.. //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#17 edit
.. //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#19 integrate
.. //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#9 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_input.c#14 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_output.c#6 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_usrreq.c#9 integrate
.. //depot/projects/netperf_socket/sys/sys/kernel.h#5 integrate
.. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_snapshot.c#5 integrate

Differences ...

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

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/fpu.c,v 1.153 2004/06/08 01:35:48 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/fpu.c,v 1.154 2004/06/18 04:01:54 peter Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -125,6 +125,8 @@
 	ldmxcsr(mxcsr);
 	fxsave(&fpu_cleanstate);
 	start_emulating();
+	bzero(fpu_cleanstate.sv_fp, sizeof(fpu_cleanstate.sv_fp));
+	bzero(fpu_cleanstate.sv_xmm, sizeof(fpu_cleanstate.sv_xmm));
 	fpu_cleanstate_ready = 1;
 	intr_restore(savecrit);
 }
@@ -384,7 +386,6 @@
 {
 	struct pcb *pcb;
 	register_t s;
-	u_short control;
 
 	if (PCPU_GET(fpcurthread) == curthread) {
 		printf("fpudna: fpcurthread == curthread %d times\n",
@@ -409,13 +410,10 @@
 
 	if ((pcb->pcb_flags & PCB_FPUINITDONE) == 0) {
 		/*
-		 * This is the first time this thread has used the FPU or
-		 * the PCB doesn't contain a clean FPU state.  Explicitly
-		 * initialize the FPU and load the default control word.
+		 * This is the first time this thread has used the FPU,
+		 * explicitly load sanitized registers.
 		 */
-		fninit();
-		control = __INITIAL_FPUCW__;
-		fldcw(&control);
+		fxrstor(&fpu_cleanstate);
 		pcb->pcb_flags |= PCB_FPUINITDONE;
 	} else
 		fxrstor(&pcb->pcb_save);

==== //depot/projects/netperf_socket/sys/compat/linux/linux_ioctl.c#4 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.114 2004/06/14 07:26:23 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.119 2004/06/18 14:36:24 bms Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1443,20 +1443,22 @@
 	}
 
 	case LINUX_CDROMREADTOCENTRY: {
-		struct linux_cdrom_tocentry lte, *ltep =
-		    (struct linux_cdrom_tocentry *)args->arg;
+		struct linux_cdrom_tocentry lte;
 		struct ioc_read_toc_single_entry irtse;
-		irtse.address_format = ltep->cdte_format;
-		irtse.track = ltep->cdte_track;
+
+		error = copyin((void *)args->arg, &lte, sizeof(lte));
+		if (error)
+			break;
+		irtse.address_format = lte.cdte_format;
+		irtse.track = lte.cdte_track;
 		error = fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse,
 		    td->td_ucred, td);
 		if (!error) {
-			lte = *ltep;
 			lte.cdte_ctrl = irtse.entry.control;
 			lte.cdte_adr = irtse.entry.addr_type;
 			bsd_to_linux_msf_lba(irtse.address_format,
 			    &irtse.entry.addr, &lte.cdte_addr);
-			copyout(&lte, (void *)args->arg, sizeof(lte));
+			error = copyout(&lte, (void *)args->arg, sizeof(lte));
 		}
 		break;
 	}
@@ -1696,6 +1698,10 @@
 		args->cmd = SETDIR(SOUND_MIXER_WRITE_LINE3);
 		return (ioctl(td, (struct ioctl_args *)args));
 
+	case LINUX_SOUND_MIXER_INFO:
+		args->cmd = SETDIR(SOUND_MIXER_INFO);
+		return (ioctl(td, (struct ioctl_args *)args));
+
 	case LINUX_OSS_GETVERSION: {
 		int version = linux_get_oss_version(td);
 		return (copyout(&version, (void *)args->arg, sizeof(int)));
@@ -1705,6 +1711,10 @@
 		args->cmd = SOUND_MIXER_READ_STEREODEVS;
 		return (ioctl(td, (struct ioctl_args *)args));
 
+	case LINUX_SOUND_MIXER_READ_RECMASK:
+		args->cmd = SOUND_MIXER_READ_RECMASK;
+		return (ioctl(td, (struct ioctl_args *)args));
+
 	case LINUX_SOUND_MIXER_READ_DEVMASK:
 		args->cmd = SOUND_MIXER_READ_DEVMASK;
 		return (ioctl(td, (struct ioctl_args *)args));
@@ -1941,11 +1951,14 @@
 		break;
 
 	case LINUX_VT_SETMODE: {
-		struct vt_mode *mode;
+		struct vt_mode mode;
+		if ((error = copyin((void *)args->arg, &mode, sizeof(mode))))
+			break;
+		if (!ISSIGVALID(mode.frsig) && ISSIGVALID(mode.acqsig))
+			mode.frsig = mode.acqsig;
+		if ((error = copyout(&mode, (void *)args->arg, sizeof(mode))))
+			break;
 		args->cmd = VT_SETMODE;
-		mode = (struct vt_mode *)args->arg;
-		if (!ISSIGVALID(mode->frsig) && ISSIGVALID(mode->acqsig))
-			mode->frsig = mode->acqsig;
 		error = (ioctl(td, (struct ioctl_args *)args));
 		break;
 	}
@@ -2076,6 +2089,20 @@
 	if (error != 0)
 		return (error);
 
+	/* handle the 'request buffer size' case */
+	if (ifc.ifc_buf == NULL) {
+		ifc.ifc_len = 0;
+		TAILQ_FOREACH(ifp, &ifnet, if_link) {
+			TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+				struct sockaddr *sa = ifa->ifa_addr;
+				if (sa->sa_family == AF_INET)
+					ifc.ifc_len += sizeof(ifr);
+			}
+		}
+		error = copyout(&ifc, uifc, sizeof(ifc));
+		return (error);
+	}
+
 	/* much easier to use uiomove than keep track ourselves */
 	iov.iov_base = ifc.ifc_buf;
 	iov.iov_len = ifc.ifc_len;

==== //depot/projects/netperf_socket/sys/compat/linux/linux_ioctl.h#4 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/linux/linux_ioctl.h,v 1.18 2004/06/14 07:26:23 phk Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_ioctl.h,v 1.20 2004/06/18 14:36:24 bms Exp $
  */
 
 #ifndef _LINUX_IOCTL_H_
@@ -227,8 +227,10 @@
 #define	LINUX_SOUND_MIXER_WRITE_LINE1	0x4d0E
 #define	LINUX_SOUND_MIXER_WRITE_LINE2	0x4d0F
 #define	LINUX_SOUND_MIXER_WRITE_LINE3	0x4d10
+#define	LINUX_SOUND_MIXER_INFO		0x4d65
 #define	LINUX_OSS_GETVERSION		0x4d76
 #define	LINUX_SOUND_MIXER_READ_STEREODEVS	0x4dfb
+#define	LINUX_SOUND_MIXER_READ_RECMASK	0x4dfd
 #define	LINUX_SOUND_MIXER_READ_DEVMASK	0x4dfe
 #define	LINUX_SOUND_MIXER_WRITE_RECSRC	0x4dff
 #define	LINUX_SNDCTL_DSP_RESET		0x5000

==== //depot/projects/netperf_socket/sys/contrib/dev/ath/freebsd/ah_osdep.c#2 (text+ko) ====

@@ -40,6 +40,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/module.h>
 #include <sys/sysctl.h>
 #include <sys/bus.h>
 #include <sys/malloc.h>

==== //depot/projects/netperf_socket/sys/dev/acpica/Osd/OsdHardware.c#4 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.13 2004/04/14 03:39:08 njl Exp $
+ *	$FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.14 2004/06/18 17:56:45 njl Exp $
  */
 
 /*
@@ -36,11 +36,7 @@
 #include <machine/bus_pio.h>
 #include <machine/bus.h>
 #include <machine/pci_cfgreg.h>
-#if __FreeBSD_version >= 500000
 #include <dev/pci/pcireg.h>
-#else
-#include <pci/pcireg.h>
-#endif
 
 /*
  * ACPICA's rather gung-ho approach to hardware resource ownership is a little

==== //depot/projects/netperf_socket/sys/dev/acpica/Osd/OsdSynch.c#4 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/Osd/OsdSynch.c,v 1.21 2004/05/05 20:07:52 njl Exp $
+ *	$FreeBSD: src/sys/dev/acpica/Osd/OsdSynch.c,v 1.22 2004/06/18 17:58:11 njl Exp $
  */
 
 /*
@@ -37,35 +37,23 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/sysctl.h>
-#if __FreeBSD_version >= 500000
 #include <sys/lock.h>
 #include <sys/mutex.h>
-#endif
 
 #define _COMPONENT	ACPI_OS_SERVICES
 ACPI_MODULE_NAME("SYNCH")
 
 MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore");
 
-#if __FreeBSD_version < 500000
-# define AS_LOCK(as)		s = splhigh()
-# define AS_UNLOCK(as)		splx(s)
-# define AS_LOCK_DECL		int s
-# define msleep(a, b, c, d, e)	tsleep(a, c, d, e)
-#else
-# define AS_LOCK(as)		mtx_lock(&(as)->as_mtx)
-# define AS_UNLOCK(as)		mtx_unlock(&(as)->as_mtx)
-# define AS_LOCK_DECL
-#endif
+#define AS_LOCK(as)	mtx_lock(&(as)->as_mtx)
+#define AS_UNLOCK(as)	mtx_unlock(&(as)->as_mtx)
 
 /*
  * Simple counting semaphore implemented using a mutex.  (Subsequently used
  * in the OSI code to implement a mutex.  Go figure.)
  */
 struct acpi_semaphore {
-#if __FreeBSD_version >= 500000
     struct mtx	as_mtx;
-#endif
     UINT32	as_units;
     UINT32	as_maxunits;
     UINT32	as_pendings;
@@ -101,9 +89,7 @@
     if ((as = malloc(sizeof(*as), M_ACPISEM, M_NOWAIT | M_ZERO)) == NULL)
 	return_ACPI_STATUS (AE_NO_MEMORY);
 
-#if __FreeBSD_version >= 500000
     mtx_init(&as->as_mtx, "ACPI semaphore", NULL, MTX_DEF);
-#endif
     as->as_units = InitialUnits;
     as->as_maxunits = MaxUnits;
     as->as_pendings = as->as_resetting = as->as_timeouts = 0;
@@ -129,9 +115,7 @@
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "destroyed semaphore %p\n", as));
-#if __FreeBSD_version >= 500000
     mtx_destroy(&as->as_mtx);
-#endif
     free(Handle, M_ACPISEM);
 #endif /* !ACPI_NO_SEMAPHORES */
 
@@ -151,7 +135,6 @@
     struct acpi_semaphore	*as = (struct acpi_semaphore *)Handle;
     int				rv, tmo;
     struct timeval		timeouttv, currenttv, timelefttv;
-    AS_LOCK_DECL;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -223,11 +206,9 @@
 	    break;
 	}
 
-#if __FreeBSD_version >= 500000
 	ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
 	    "semaphore blocked, calling msleep(%p, %p, %d, \"acsem\", %d)\n",
 	    as, &as->as_mtx, PCATCH, tmo));
-#endif
 
 	as->as_pendings++;
 
@@ -310,7 +291,6 @@
 {
 #ifndef ACPI_NO_SEMAPHORES
     struct acpi_semaphore	*as = (struct acpi_semaphore *)Handle;
-    AS_LOCK_DECL;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_cpu.c#10 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.39 2004/06/05 07:02:17 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.40 2004/06/19 02:27:23 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -1046,15 +1046,21 @@
     struct sbuf	 sb;
     char	 buf[128];
     int		 i;
-    u_int	 sum;
+    uint64_t	 fract, sum, whole;
 
-    /* Avoid divide by 0 potential error. */
-    sum = 1;
+    sum = 0;
     for (i = 0; i < cpu_cx_count; i++)
 	sum += cpu_cx_stats[i];
     sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
-    for (i = 0; i < cpu_cx_count; i++)
-	sbuf_printf(&sb, "%u%% ", (cpu_cx_stats[i] * 100) / sum);
+    for (i = 0; i < cpu_cx_count; i++) {
+	if (sum > 0) {
+	    whole = cpu_cx_stats[i] * 100;
+	    fract = (whole % sum) * 100;
+	    sbuf_printf(&sb, "%u.%02u%% ", (u_int)(whole / sum),
+		(u_int)(fract / sum));
+	} else
+	    sbuf_printf(&sb, "0%% ");
+    }
     sbuf_trim(&sb);
     sbuf_finish(&sb);
     sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);

==== //depot/projects/netperf_socket/sys/dev/firewire/sbp.c#5 (text+ko) ====

@@ -31,7 +31,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/sbp.c,v 1.77 2004/06/15 16:03:49 dfr Exp $
+ * $FreeBSD: src/sys/dev/firewire/sbp.c,v 1.78 2004/06/18 08:02:49 simokawa Exp $
  *
  */
 
@@ -139,7 +139,7 @@
 SYSCTL_INT(_hw_firewire_sbp, OID_AUTO, max_speed, CTLFLAG_RW, &max_speed, 0,
 	"SBP transfer max speed");
 SYSCTL_INT(_hw_firewire_sbp, OID_AUTO, exclusive_login, CTLFLAG_RW,
-	&ex_login, 0, "SBP transfer max speed");
+	&ex_login, 0, "SBP enable exclusive login");
 SYSCTL_INT(_hw_firewire_sbp, OID_AUTO, login_delay, CTLFLAG_RW,
 	&login_delay, 0, "SBP login delay in msec");
 SYSCTL_INT(_hw_firewire_sbp, OID_AUTO, scan_delay, CTLFLAG_RW,

==== //depot/projects/netperf_socket/sys/fs/devfs/devfs_devs.c#4 (text+ko) ====

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000
+ * Copyright (c) 2000,2004
  *	Poul-Henning Kamp.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -25,7 +25,7 @@
  *
  * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vfsops.c 1.36
  *
- * $FreeBSD: src/sys/fs/devfs/devfs_devs.c,v 1.30 2004/06/16 09:47:03 phk Exp $
+ * $FreeBSD: src/sys/fs/devfs/devfs_devs.c,v 1.31 2004/06/18 08:08:47 phk Exp $
  */
 
 #include "opt_devfs.h"
@@ -58,7 +58,6 @@
 static int devfs_noverflow;
 static unsigned devfs_generation;
 
-static void devfs_attemptoverflow(int insist);
 static struct devfs_dirent *devfs_find (struct devfs_dirent *dd, const char *name, int namelen);
 
 SYSCTL_NODE(_vfs, OID_AUTO, devfs, CTLFLAG_RW, 0, "DEVFS filesystem");
@@ -137,43 +136,6 @@
 	return (NULL);
 }
 
-static void
-devfs_attemptoverflow(int insist)
-{
-	struct cdev ***ot;
-	int *or;
-	int n, nb;
-
-	/* Check if somebody beat us to it */
-	if (devfs_overflow != NULL)
-		return;
-	ot = NULL;
-	or = NULL;
-	n = devfs_noverflowwant;
-	nb = sizeof (struct cdev **) * n;
-	MALLOC(ot, struct cdev ***, nb, M_DEVFS, (insist ? M_WAITOK : M_NOWAIT) | M_ZERO);
-	if (ot == NULL)
-		goto bail;
-	nb = sizeof (int) * n;
-	MALLOC(or, int *, nb, M_DEVFS, (insist ? M_WAITOK : M_NOWAIT) | M_ZERO);
-	if (or == NULL)
-		goto bail;
-	if (!atomic_cmpset_ptr(&devfs_overflow, NULL, ot))
-		goto bail;
-	devfs_refoverflow = or;
-	devfs_noverflow = n;
-	printf("DEVFS Overflow table with %d entries allocated when %d in use\n", n, devfs_numino);
-	return;
-
-bail:
-	/* Somebody beat us to it, or something went wrong. */
-	if (ot != NULL)
-		FREE(ot, M_DEVFS);
-	if (or != NULL)
-		FREE(or, M_DEVFS);
-	return;
-}
-
 static struct devfs_dirent *
 devfs_find(struct devfs_dirent *dd, const char *name, int namelen)
 {
@@ -367,20 +329,26 @@
 			de->de_dir = dd;
 			devfs_rules_apply(dm, de);
 			TAILQ_INSERT_TAIL(&dd->de_dlist, de, de_list);
-#if 0
-			printf("Add ino%d %s\n", i, dev->si_name);
-#endif
 		}
 	}
 	lockmgr(&dm->dm_lock, LK_DOWNGRADE, 0, curthread);
 	return (0);
 }
 
+/*
+ * devfs_create() and devfs_destroy() are called from kern_conf.c and
+ * in both cases the devlock() mutex is held, so no further locking
+ * is necesary and no sleeping allowed.
+ */
+
 void
 devfs_create(struct cdev *dev)
 {
 	int ino, i, *ip;
 	struct cdev **dp;
+	struct cdev **ot;
+	int *or;
+	int n;
 
 	for (;;) {
 		/* Grab the next inode number */
@@ -389,56 +357,70 @@
 		/* wrap around when we reach the end */
 		if (i >= NDEVFSINO + devfs_noverflow)
 			i = 3;
-		if (!atomic_cmpset_int(&devfs_nextino, ino, i))
-			continue;
+		devfs_nextino = i;
 
 		/* see if it was occupied */
 		dp = devfs_itod(ino);
-		if (dp == NULL)
-			Debugger("dp == NULL\n");
+		KASSERT(dp != NULL, ("DEVFS: No devptr inode %d", ino));
 		if (*dp != NULL)
 			continue;
 		ip = devfs_itor(ino);
-		if (ip == NULL)
-			Debugger("ip == NULL\n");
+		KASSERT(ip != NULL, ("DEVFS: No iptr inode %d", ino));
 		if (*ip != 0)
 			continue;
+		break;
+	}
 
-		if (!atomic_cmpset_ptr(dp, NULL, dev))
-			continue;
+	*dp = dev;
+	dev->si_inode = ino;
+	if (i > devfs_topino)
+		devfs_topino = i;
+
+	devfs_numino++;
+	devfs_generation++;
+
+	if (devfs_overflow != NULL || devfs_numino + 100 < NDEVFSINO)
+		return;
 
-		dev->si_inode = ino;
-		for (;;) {
-			i = devfs_topino;
-			if (i >= ino)
-				break;
-			if (atomic_cmpset_int(&devfs_topino, i, ino))
-				break;
-			printf("failed topino %d %d\n", i, ino);
-		}
-		break;
+	/*
+	 * Try to allocate overflow table
+	 * XXX: we can probably be less panicy these days and a linked
+	 * XXX: list of PAGESIZE/PTRSIZE entries might be a better idea.
+	 *
+	 * XXX: we may be into witness unlove here.
+	 */
+	n = devfs_noverflowwant;
+	ot = malloc(sizeof(*ot) * n, M_DEVFS, M_NOWAIT | M_ZERO);
+	if (ot == NULL)
+		return;
+	or = malloc(sizeof(*or) * n, M_DEVFS, M_NOWAIT | M_ZERO);
+	if (or == NULL) {
+		free(ot, M_DEVFS);
+		return;
 	}
-
-	atomic_add_int(&devfs_numino, 1);
-	atomic_add_int(&devfs_generation, 1);
-	if (devfs_overflow == NULL && devfs_numino + 100 > NDEVFSINO)
-		devfs_attemptoverflow(0);
+	devfs_overflow = ot;
+	devfs_refoverflow = or;
+	devfs_noverflow = n;
+	printf("DEVFS Overflow table with %d entries allocated\n", n);
+	return;
 }
 
 void
 devfs_destroy(struct cdev *dev)
 {
-	int ino, i;
+	int ino;
+	struct cdev **dp;
 
 	ino = dev->si_inode;
 	dev->si_inode = 0;
 	if (ino == 0)
 		return;
-	if (atomic_cmpset_ptr(devfs_itod(ino), dev, NULL)) {
-		atomic_add_int(&devfs_generation, 1);
-		atomic_add_int(&devfs_numino, -1);
-		i = devfs_nextino;
-		if (ino < i)
-			atomic_cmpset_int(&devfs_nextino, i, ino);
-	}
+	dp = devfs_itod(ino);
+	KASSERT(*dp == dev,
+	    ("DEVFS: destroying wrong cdev ino %d", ino));
+	*dp = NULL;
+	devfs_numino--;
+	devfs_generation++;
+	if (ino < devfs_nextino)
+		devfs_nextino = ino;
 }

==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum.c,v 1.1 2004/06/12 21:16:10 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum.c,v 1.2 2004/06/18 19:53:33 le Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -520,6 +520,9 @@
 	struct g_geom *gp2;
 	struct gv_softc *sc;
 	struct gv_drive *d, *d2;
+	struct gv_plex *p, *p2;
+	struct gv_sd *s, *s2;
+	struct gv_volume *v, *v2;
 	struct gv_freelist *fl, *fl2;
 
 	g_trace(G_T_TOPOLOGY, "gv_destroy_geom: %s", gp->name);
@@ -539,7 +542,9 @@
 			return (EBUSY);
 	}
 
+	/* Clean up and deallocate what we allocated. */
 	LIST_FOREACH_SAFE(d, &sc->drives, drive, d2) {
+		LIST_REMOVE(d, drive);
 		g_free(d->hdr);
 		d->hdr = NULL;
 		LIST_FOREACH_SAFE(fl, &d->freelist, freelist, fl2) {
@@ -548,11 +553,40 @@
 			g_free(fl);
 			fl = NULL;
 		}
-		LIST_REMOVE(d, drive);
+		d->geom->softc = NULL;
+		g_free(d);
+	}
+
+	LIST_FOREACH_SAFE(s, &sc->subdisks, sd, s2) {
+		LIST_REMOVE(s, sd);
+		s->drive_sc = NULL;
+		s->plex_sc = NULL;
+		s->provider = NULL;
+		s->consumer = NULL;
+		g_free(s);
+	}
+
+	LIST_FOREACH_SAFE(p, &sc->plexes, plex, p2) {
+		LIST_REMOVE(p, plex);
+		gv_kill_thread(p);
+		p->vol_sc = NULL;
+		p->geom->softc = NULL;
+		p->provider = NULL;
+		p->consumer = NULL;
+		if (p->org == GV_PLEX_RAID5) {
+			mtx_destroy(&p->worklist_mtx);
+		}
+		g_free(p);
+	}
+
+	LIST_FOREACH_SAFE(v, &sc->volumes, volume, v2) {
+		LIST_REMOVE(v, volume);
+		v->geom->softc = NULL;
+		g_free(v);
 	}
 
+	gp->softc = NULL;
 	g_free(sc);
-	sc = NULL;
 	g_wither_geom(gp, ENXIO);
 	return (0);
 }

==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_drive.c#4 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_drive.c,v 1.3 2004/06/16 14:41:04 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_drive.c,v 1.4 2004/06/18 19:53:33 le Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -281,13 +281,15 @@
 	if (!LIST_EMPTY(&gp->consumer))
 		return;
 	d = gp->softc;
-	printf("gvinum: lost drive '%s'\n", d->name);
-	d->geom = NULL;
-	LIST_FOREACH(s, &d->subdisks, from_drive) {
-		s->provider = NULL;
-		s->consumer = NULL;
+	if (d != NULL) {
+		printf("gvinum: lost drive '%s'\n", d->name);
+		d->geom = NULL;
+		LIST_FOREACH(s, &d->subdisks, from_drive) {
+			s->provider = NULL;
+			s->consumer = NULL;
+		}
+		gv_set_drive_state(d, GV_DRIVE_DOWN, GV_SETSTATE_FORCE);
 	}
-	gv_set_drive_state(d, GV_DRIVE_DOWN, GV_SETSTATE_FORCE);
 	gp->softc = NULL;
 	g_wither_geom(gp, error);
 }
@@ -465,12 +467,9 @@
 gv_drive_destroy_geom(struct gctl_req *req, struct g_class *mp,
     struct g_geom *gp)
 {
-	/*struct gv_drive *d;*/
-
 	g_trace(G_T_TOPOLOGY, "gv_drive_destroy_geom: %s", gp->name);
 	g_topology_assert();
 
-	/* g_free(sc); */
 	g_wither_geom(gp, ENXIO);
 	return (0);
 }

==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_plex.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_plex.c,v 1.2 2004/06/16 14:41:04 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_plex.c,v 1.3 2004/06/18 19:53:33 le Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -66,11 +66,13 @@
 		return;
 
 	p = gp->softc;
-	gv_kill_thread(p);
-	p->geom = NULL;
+	if (p != NULL) {
+		gv_kill_thread(p);
+		p->geom = NULL;
+		p->provider = NULL;
+		p->consumer = NULL;
+	}
 	gp->softc = NULL;
-	p->provider = NULL;
-	p->consumer = NULL;
 	g_wither_geom(gp, error);
 }
 

==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_volume.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_volume.c,v 1.2 2004/06/16 14:41:04 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_volume.c,v 1.3 2004/06/18 19:53:33 le Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -62,7 +62,8 @@
 	if (!LIST_EMPTY(&gp->consumer))
 		return;
 	v = gp->softc;
-	v->geom = NULL;
+	if (v != NULL)
+		v->geom = NULL;
 	gp->softc = NULL;
 	g_wither_geom(gp, error);
 }
@@ -243,11 +244,7 @@
 {
 	g_trace(G_T_TOPOLOGY, "gv_volume_destroy_geom: %s", gp->name);
 	g_topology_assert();
-/*
-	if (gp->softc != NULL)
-		g_free(gp->softc);
-	gp->softc = NULL;
-*/
+
 	g_wither_geom(gp, ENXIO);
 	return (0);
 }

==== //depot/projects/netperf_socket/sys/kern/kern_exit.c#12 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_exit.c,v 1.234 2004/06/08 10:37:29 tjr Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_exit.c,v 1.236 2004/06/18 11:13:49 davidxu Exp $");
 
 #include "opt_compat.h"
 #include "opt_ktrace.h"
@@ -133,6 +133,7 @@
 	 */
 	PROC_LOCK(p);
 	if (p->p_flag & P_SA || p->p_numthreads > 1) {
+retry:
 		/*
 		 * First check if some other thread got here before us..
 		 * if so, act apropriatly, (exit or suspend);
@@ -152,9 +153,13 @@
 		 * to return to userland will thread_exit() from userret().
 		 * thread_exit() will unsuspend us when the last other
 		 * thread exits.
+		 * If there is already a thread singler after resumption,
+		 * calling thread_single will fail, in the case, we just
+		 * re-check all suspension request, the thread should
+		 * either be suspended there or exit.
 		 */
 		if (thread_single(SINGLE_EXIT))
-			panic ("Exit: Single threading fouled up");
+			goto retry;
 		/*
 		 * All other activity in this process is now stopped.
 		 * Remove excess KSEs and KSEGRPS. XXXKSE (when we have them)

==== //depot/projects/netperf_socket/sys/kern/kern_thread.c#13 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_thread.c,v 1.181 2004/06/11 17:48:20 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_thread.c,v 1.182 2004/06/18 06:15:21 davidxu Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -849,6 +849,7 @@
 	struct thread *td;
 	struct thread *td2;
 	struct proc *p;
+	int remaining;
 
 	td = curthread;
 	p = td->td_proc;
@@ -870,7 +871,11 @@
 	p->p_flag |= P_STOPPED_SINGLE;
 	mtx_lock_spin(&sched_lock);
 	p->p_singlethread = td;
-	while ((p->p_numthreads - p->p_suspcount) != 1) {
+	if (force_exit == SINGLE_EXIT)
+		remaining = p->p_numthreads;
+	else
+		remaining = p->p_numthreads - p->p_suspcount;
+	while (remaining != 1) {
 		FOREACH_THREAD_IN_PROC(p, td2) {
 			if (td2 == td)
 				continue;
@@ -898,10 +903,15 @@
 				}
 			}
 		}
+		if (force_exit == SINGLE_EXIT)
+			remaining = p->p_numthreads;
+		else
+			remaining = p->p_numthreads - p->p_suspcount;
+
 		/*
 		 * Maybe we suspended some threads.. was it enough?
 		 */
-		if ((p->p_numthreads - p->p_suspcount) == 1)
+		if (remaining == 1)
 			break;
 
 		/*
@@ -914,6 +924,10 @@
 		mtx_unlock_spin(&sched_lock);
 		PROC_LOCK(p);
 		mtx_lock_spin(&sched_lock);
+		if (force_exit == SINGLE_EXIT)
+			remaining = p->p_numthreads;
+		else
+			remaining = p->p_numthreads - p->p_suspcount;
 	}
 	if (force_exit == SINGLE_EXIT) {
 		if (td->td_upcall)

==== //depot/projects/netperf_socket/sys/kern/subr_prf.c#4 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_prf.c,v 1.110 2004/04/05 21:03:35 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_prf.c,v 1.111 2004/06/18 20:12:42 green Exp $");
 
 #include "opt_ddb.h"
 
@@ -97,7 +97,12 @@
 static int      log_console_output = 1;
 TUNABLE_INT("kern.log_console_output", &log_console_output);
 SYSCTL_INT(_kern, OID_AUTO, log_console_output, CTLFLAG_RW,
-    &log_console_output, 0, "");
+    &log_console_output, 0, "Duplicate console output to the syslog.");
+
+static int	always_console_output = 0;
+TUNABLE_INT("kern.always_console_output", &always_console_output);
+SYSCTL_INT(_kern, OID_AUTO, always_console_output, CTLFLAG_RW,
+    &always_console_output, 0, "Always output to console despite TIOCCONS.");
 
 /*
  * Warn that a system table is full.
@@ -345,8 +350,12 @@
 	} else {
 		if ((flags & TOTTY) && tp != NULL)
 			tputchar(c, tp);
-		if ((flags & TOCONS) && constty != NULL)
-			msgbuf_addchar(&consmsgbuf, c);
+		if (flags & TOCONS) {
+			if (constty != NULL)
+				msgbuf_addchar(&consmsgbuf, c);
+			if (always_console_output && c != '\0')
+				cnputc(c);
+		}
 	}
 	if ((flags & TOLOG))
 		msglogchar(c, ap->pri);

==== //depot/projects/netperf_socket/sys/kern/uipc_socket.c#20 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.180 2004/06/18 02:57:55 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.182 2004/06/19 03:23:14 rwatson Exp $");
 
 #include "opt_inet.h"
 #include "opt_mac.h"
@@ -600,8 +600,9 @@
 	SOCKBUF_LOCK(&so->so_snd);
 	error = sblock(&so->so_snd, SBLOCKWAIT(flags));
 	if (error)
-		goto out;
+		goto out_locked;
 	do {
+		SOCKBUF_LOCK_ASSERT(&so->so_snd);
 		if (so->so_snd.sb_state & SBS_CANTSENDMORE)
 			snderr(EPIPE);
 		if (so->so_error) {
@@ -640,6 +641,7 @@
 				goto release;
 			continue;
 		}
+		SOCKBUF_UNLOCK(&so->so_snd);
 		mp = &top;
 		space -= clen;
 		do {
@@ -654,7 +656,6 @@
 #ifdef ZERO_COPY_SOCKETS
 			cow_send = 0;
 #endif /* ZERO_COPY_SOCKETS */
-			SOCKBUF_UNLOCK(&so->so_snd);
 			if (resid >= MINCLSIZE) {
 #ifdef ZERO_COPY_SOCKETS
 				if (top == NULL) {
@@ -735,13 +736,14 @@
 			else
 #endif /* ZERO_COPY_SOCKETS */
 			error = uiomove(mtod(m, void *), (int)len, uio);
-			SOCKBUF_LOCK(&so->so_snd);
 			resid = uio->uio_resid;
 			m->m_len = len;
 			*mp = m;
 			top->m_pkthdr.len += len;
-			if (error)
+			if (error) {
+				SOCKBUF_LOCK(&so->so_snd);
 				goto release;
+			}
 			mp = &m->m_next;
 			if (resid <= 0) {
 				if (flags & MSG_EOR)
@@ -777,22 +779,30 @@
 			/* If there is more to send set PRUS_MORETOCOME */
 			(resid > 0 && space > 0) ? PRUS_MORETOCOME : 0,
 			top, addr, control, td);
-		    if (dontroute)
+		    if (dontroute) {
+			    SOCK_LOCK(so);
 			    so->so_options &= ~SO_DONTROUTE;
+			    SOCK_UNLOCK(so);
+		    }
 		    clen = 0;
 		    control = NULL;
 		    top = NULL;
 		    mp = &top;
-		    if (error)
+		    if (error) {
+			SOCKBUF_LOCK(&so->so_snd);
 			goto release;

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


More information about the p4-projects mailing list