Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Jun 2004 20:35:27 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 55858 for review
Message-ID:  <200406262035.i5QKZRa6074910@repoman.freebsd.org>

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

Change 55858 by rwatson@rwatson_tislabs on 2004/06/26 20:35:25

	Integrate netperf_socket:
	
	- Loop back soabort() comment from rwatson_netperf following CVS
	  merge.
	- Loop back lock coallescing between sbappend/sowakeup and in
	  related situations.
	- Loop back spl removal from tcp usrreq.

Affected files ...

.. //depot/projects/netperf_socket/sys/conf/NOTES#23 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/pmap.c#14 integrate
.. //depot/projects/netperf_socket/sys/kern/imgact_elf.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_fork.c#11 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_kse.c#3 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_thr.c#7 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_thread.c#16 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#25 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#21 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#17 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_divert.c#9 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_mroute.c#8 integrate
.. //depot/projects/netperf_socket/sys/netinet/raw_ip.c#8 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_input.c#15 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_usrreq.c#10 integrate
.. //depot/projects/netperf_socket/sys/netinet/udp_usrreq.c#8 integrate
.. //depot/projects/netperf_socket/sys/sys/proc.h#14 integrate
.. //depot/projects/netperf_socket/sys/vm/vm_map.h#5 integrate

Differences ...

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

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1233 2004/06/22 22:02:57 bms Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1234 2004/06/26 17:19:44 mpp Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -95,7 +95,7 @@
 
 #
 # BLKDEV_IOSIZE sets the default block size used in user block
-# device I/O.  Note that this value will be overriden by the label
+# device I/O.  Note that this value will be overridden by the label
 # when specifying a block device from a label with a non-0
 # partition blocksize.  The default is PAGE_SIZE.
 #
@@ -184,7 +184,7 @@
 # WITNESS enables the witness code which detects deadlocks and cycles
 #         during locking operations.
 # WITNESS_DDB causes the witness code to drop into the kernel debugger if
-#	  a lock heirarchy violation occurs or if locks are held when going to
+#	  a lock hierarchy violation occurs or if locks are held when going to
 #	  sleep.
 # WITNESS_SKIPSPIN disables the witness checks on spin mutexes.
 options 	MUTEX_DEBUG
@@ -328,7 +328,7 @@
 
 #
 # REGRESSION causes optional kernel interfaces necessary only for regression
-# testing to be enabled.  These interfaces may consitute security risks
+# testing to be enabled.  These interfaces may constitute security risks
 # when enabled, as they permit processes to easily modify aspects of the
 # run-time environment to reproduce unlikely or unusual (possibly normally
 # impossible) scenarios.
@@ -408,7 +408,7 @@
 options 	ALTQ_RIO	# RED In/Out
 options 	ALTQ_HFSC	# Hierarchical Packet Scheduler
 options 	ALTQ_CDNR	# Traffic conditioner
-options 	ALTQ_PRIQ	# Prioirity Queueing
+options 	ALTQ_PRIQ	# Priority Queueing
 options 	ALTQ_NOPCC	# Required for SMP build
 options 	ALTQ_DEBUG
 
@@ -589,7 +589,7 @@
 # packets without touching the ttl).  This can be useful to hide firewalls
 # from traceroute and similar tools.
 #
-# PFIL_HOOKS enables an abtraction layer which is meant to be used in
+# PFIL_HOOKS enables an abstraction layer which is meant to be used in
 # network code where filtering is required.  See pfil(9).  This option is
 # required by the IPFILTER option and the PF device.
 #
@@ -657,7 +657,7 @@
 options 	BRIDGE
 
 # Zero copy sockets support.  This enables "zero copy" for sending and
-# receving data via a socket.  The send side works for any type of NIC,
+# receiving data via a socket.  The send side works for any type of NIC,
 # the receive side only works for NICs that support MTUs greater than the
 # page size of your architecture and that support header splitting.  See
 # zero_copy(9) for more details.
@@ -932,8 +932,8 @@
 #
 # The cd driver drives SCSI Read Only Direct Access ("cd") devices.
 #
-# The ses driver drives SCSI Envinronment Services ("ses") and
-# SAF-TE ("SCSI Accessable Fault-Tolerant Enclosure") devices.
+# The ses driver drives SCSI Environment Services ("ses") and
+# SAF-TE ("SCSI Accessible Fault-Tolerant Enclosure") devices.
 #
 # The pt driver drives SCSI Processor devices.
 #
@@ -1554,7 +1554,7 @@
 #
 # MII bus support is required for some PCI 10/100 ethernet NICs,
 # namely those which use MII-compliant transceivers or implement
-# tranceiver control interfaces that operate like an MII. Adding
+# transceiver control interfaces that operate like an MII. Adding
 # "device miibus0" to the kernel config pulls in support for
 # the generic miibus API and all of the PHY drivers, including a
 # generic one for PHYs that aren't specifically handled by an
@@ -1644,7 +1644,7 @@
 #       Compaq Netelligent 10/100 cards and the built-in ethernet controllers
 #       in several Compaq Prosignia, Proliant and Deskpro systems.  It also
 #       supports several Olicom 10Mbps and 10/100 boards.
-# tx:   SMC 9432 TX, BTX and FTX cards. (SMC EtherPower II serie)
+# tx:   SMC 9432 TX, BTX and FTX cards. (SMC EtherPower II series)
 # txp:	Support for 3Com 3cR990 cards with the "Typhoon" chipset
 # vr:   Support for various fast ethernet adapters based on the VIA
 #       Technologies VT3043 `Rhine I' and VT86C100A `Rhine II' chips,
@@ -1800,7 +1800,7 @@
 # Gravis UltraSound ISA PnP/non-PnP
 # Crystal Semiconductor CS461x/428x PCI
 # Neomagic 256AV (ac97)
-# Most of the more common ISA/PnP sb/mss/ess compatable cards.
+# Most of the more common ISA/PnP sb/mss/ess compatible cards.
 
 device		pcm
 
@@ -1919,7 +1919,7 @@
 # options 	BROOKTREE_SYSTEM_DEFAULT=BROOKTREE_PAL
 # or
 # options 	BROOKTREE_SYSTEM_DEFAULT=BROOKTREE_NTSC
-# Specifes the default video capture mode.
+# Specifies the default video capture mode.
 # This is required for Dual Crystal (28&35Mhz) boards where PAL is used
 # to prevent hangs during initialisation.  eg VideoLogic Captivator PCI.
 #
@@ -2224,12 +2224,12 @@
 makeoptions	UKBD_DFLT_KEYMAP=it.iso
 
 # options for uplcom:
-options 	UPLCOM_INTR_INTERVAL=100	# interrpt pipe interval
+options 	UPLCOM_INTR_INTERVAL=100	# interrupt pipe interval
 						# in milliseconds
 
 # options for uvscom:
 options 	UVSCOM_DEFAULT_OPKTSIZE=8	# default output packet size
-options 	UVSCOM_INTR_INTERVAL=100	# interrpt pipe interval
+options 	UVSCOM_INTR_INTERVAL=100	# interrupt pipe interval
 						# in milliseconds
 
 #####################################################################

==== //depot/projects/netperf_socket/sys/i386/i386/pmap.c#14 (text+ko) ====

@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.477 2004/06/22 19:35:43 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.478 2004/06/26 19:10:12 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -878,12 +878,14 @@
 				vm_page_hold(m);
 			}
 		} else {
+			sched_pin();
 			pte = *pmap_pte_quick(pmap, va);
 			if (pte != 0 &&
 			    ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
 				m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
 				vm_page_hold(m);
 			}
+			sched_unpin();
 		}
 	}
 	vm_page_unlock_queues();

==== //depot/projects/netperf_socket/sys/kern/imgact_elf.c#8 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/imgact_elf.c,v 1.151 2004/06/05 02:18:28 tjr Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/imgact_elf.c,v 1.152 2004/06/26 18:58:22 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/exec.h>
@@ -910,10 +910,10 @@
 
 static void cb_put_phdr(vm_map_entry_t, void *);
 static void cb_size_segment(vm_map_entry_t, void *);
-static void each_writable_segment(struct proc *, segment_callback, void *);
+static void each_writable_segment(struct thread *, segment_callback, void *);
 static int __elfN(corehdr)(struct thread *, struct vnode *, struct ucred *,
     int, void *, size_t);
-static void __elfN(puthdr)(struct proc *, void *, size_t *, int);
+static void __elfN(puthdr)(struct thread *, void *, size_t *, int);
 static void __elfN(putnote)(void *, size_t *, const char *, int,
     const void *, size_t);
 
@@ -922,11 +922,10 @@
 int
 __elfN(coredump)(td, vp, limit)
 	struct thread *td;
-	register struct vnode *vp;
+	struct vnode *vp;
 	off_t limit;
 {
-	register struct proc *p = td->td_proc;
-	register struct ucred *cred = td->td_ucred;
+	struct ucred *cred = td->td_ucred;
 	int error = 0;
 	struct sseg_closure seginfo;
 	void *hdr;
@@ -935,7 +934,7 @@
 	/* Size the program segments. */
 	seginfo.count = 0;
 	seginfo.size = 0;
-	each_writable_segment(p, cb_size_segment, &seginfo);
+	each_writable_segment(td, cb_size_segment, &seginfo);
 
 	/*
 	 * Calculate the size of the core file header area by making
@@ -943,7 +942,7 @@
 	 * size is calculated.
 	 */
 	hdrsize = 0;
-	__elfN(puthdr)(p, (void *)NULL, &hdrsize, seginfo.count);
+	__elfN(puthdr)(td, (void *)NULL, &hdrsize, seginfo.count);
 
 	if (hdrsize + seginfo.size >= limit)
 		return (EFAULT);
@@ -1036,11 +1035,12 @@
  * caller-supplied data.
  */
 static void
-each_writable_segment(p, func, closure)
-	struct proc *p;
+each_writable_segment(td, func, closure)
+	struct thread *td;
 	segment_callback func;
 	void *closure;
 {
+	struct proc *p = td->td_proc;
 	vm_map_t map = &p->p_vmspace->vm_map;
 	vm_map_entry_t entry;
 
@@ -1103,13 +1103,12 @@
 	size_t hdrsize;
 	void *hdr;
 {
-	struct proc *p = td->td_proc;
 	size_t off;
 
 	/* Fill in the header. */
 	bzero(hdr, hdrsize);
 	off = 0;
-	__elfN(puthdr)(p, hdr, &off, numsegs);
+	__elfN(puthdr)(td, hdr, &off, numsegs);
 
 	/* Write it to the core file. */
 	return (vn_rdwr_inchunks(UIO_WRITE, vp, hdr, hdrsize, (off_t)0,
@@ -1118,7 +1117,7 @@
 }
 
 static void
-__elfN(puthdr)(struct proc *p, void *dst, size_t *off, int numsegs)
+__elfN(puthdr)(struct thread *td, void *dst, size_t *off, int numsegs)
 {
 	struct {
 		prstatus_t status;
@@ -1128,9 +1127,12 @@
 	prstatus_t *status;
 	prfpregset_t *fpregset;
 	prpsinfo_t *psinfo;
-	struct thread *first, *thr;
+	struct proc *p;
+	struct thread *thr;
 	size_t ehoff, noteoff, notesz, phoff;
 
+	p = td->td_proc;
+
 	ehoff = *off;
 	*off += sizeof(Elf_Ehdr);
 
@@ -1169,22 +1171,16 @@
 	    sizeof *psinfo);
 
 	/*
-	 * We want to start with the registers of the initial thread in the
-	 * process so that the .reg and .reg2 pseudo-sections created by bfd
-	 * will be identical to the .reg/$PID and .reg2/$PID pseudo-sections.
-	 * This makes sure that any tool that only looks for .reg and .reg2
-	 * and not for .reg/$PID and .reg2/$PID will behave the same as
-	 * before. The first thread is the thread with an ID equal to the
-	 * process' ID.
-	 * Note that the initial thread may already be gone. In that case
-	 * 'first' is NULL.
+	 * For backward compatibility, we dump the registers of the current
+	 * thread (as passed to us in td) first and set pr_pid to the PID of
+	 * the process.  We then dump the other threads, but with pr_pid set
+	 * to the TID of the thread itself. This has two advantages:
+	 * 1) We preserve the meaning of pr_pid for as much as is possible.
+	 * 2) The debugger will select the current thread as its initial
+	 *    "thread", which is likely what we want.
 	 */
-	thr = first = TAILQ_FIRST(&p->p_threads);
-	while (first != NULL && first->td_tid > PID_MAX)
-		first = TAILQ_NEXT(first, td_plist);
-	if (first != NULL)
-		thr = first;
-	do {
+	thr = td;
+	while (thr != NULL) {
 		if (dst != NULL) {
 			status->pr_version = PRSTATUS_VERSION;
 			status->pr_statussz = sizeof(prstatus_t);
@@ -1192,7 +1188,7 @@
 			status->pr_fpregsetsz = sizeof(fpregset_t);
 			status->pr_osreldate = osreldate;
 			status->pr_cursig = p->p_sig;
-			status->pr_pid = thr->td_tid;
+			status->pr_pid = (thr == td) ? p->p_pid : thr->td_tid;
 			fill_regs(thr, &status->pr_reg);
 			fill_fpregs(thr, fpregset);
 		}
@@ -1200,12 +1196,14 @@
 		    sizeof *status);
 		__elfN(putnote)(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
 		    sizeof *fpregset);
+
 		/* XXX allow for MD specific notes. */
-		thr = (thr == first) ? TAILQ_FIRST(&p->p_threads) :
+
+		thr = (thr == td) ? TAILQ_FIRST(&p->p_threads) :
 		    TAILQ_NEXT(thr, td_plist);
-		if (thr == first && thr != NULL)
+		if (thr == td)
 			thr = TAILQ_NEXT(thr, td_plist);
-	} while (thr != NULL);
+	}
 
 	notesz = *off - noteoff;
 
@@ -1266,7 +1264,7 @@
 		/* All the writable segments from the program. */
 		phc.phdr = phdr;
 		phc.offset = *off;
-		each_writable_segment(p, cb_put_phdr, &phc);
+		each_writable_segment(td, cb_put_phdr, &phc);
 	}
 }
 

==== //depot/projects/netperf_socket/sys/kern/kern_fork.c#11 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_fork.c,v 1.226 2004/04/05 21:03:34 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_fork.c,v 1.227 2004/06/26 18:58:22 marcel Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_mac.h"
@@ -493,7 +493,6 @@
 	    (unsigned) RANGEOF(struct ksegrp, kg_startcopy, kg_endcopy));
 #undef RANGEOF
 
-	td2->td_tid = p2->p_pid;
 	td2->td_sigstk = td->td_sigstk;
 
 	/* Set up the thread as an active thread (as if runnable). */

==== //depot/projects/netperf_socket/sys/kern/kern_kse.c#3 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_kse.c,v 1.181 2004/06/11 17:48:20 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_kse.c,v 1.182 2004/06/26 18:58:22 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -872,10 +872,8 @@
 
 	if (td->td_standin)
 		return;
-	if (spare == NULL) {
+	if (spare == NULL)
 		spare = thread_alloc();
-		spare->td_tid = thread_new_tid();
-	}
 	td->td_standin = spare;
 	bzero(&spare->td_startzero,
 	    (unsigned)RANGEOF(struct thread, td_startzero, td_endzero));

==== //depot/projects/netperf_socket/sys/kern/kern_thr.c#7 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_thr.c,v 1.19 2004/04/19 14:20:01 mtm Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_thr.c,v 1.20 2004/06/26 18:58:22 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -130,7 +130,6 @@
 
 	/* Initialize our td. */
 	td0 = thread_alloc();
-	td0->td_tid = thread_new_tid();
 
 	/*
 	 * Try the copyout as soon as we allocate the td so we don't have to

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

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_thread.c,v 1.184 2004/06/21 20:44:02 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_thread.c,v 1.185 2004/06/26 18:58:22 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -149,7 +149,6 @@
 	struct thread	*td;
 
 	td = (struct thread *)mem;
-	td->td_tid = 0;
 	td->td_state = TDS_INACTIVE;
 	td->td_oncpu	= NOCPU;
 
@@ -175,28 +174,9 @@
 thread_dtor(void *mem, int size, void *arg)
 {
 	struct thread *td;
-	struct tid_bitmap_part *bmp;
-	lwpid_t tid;
-	int bit, idx;
 
 	td = (struct thread *)mem;
 
-	if (td->td_tid > PID_MAX) {
-		STAILQ_FOREACH(bmp, &tid_bitmap, bmp_next) {
-			if (td->td_tid >= bmp->bmp_base &&
-			    td->td_tid < bmp->bmp_base + TID_IDS_PER_PART)
-				break;
-		}
-		KASSERT(bmp != NULL, ("No TID bitmap?"));
-		mtx_lock(&tid_lock);
-		tid = td->td_tid - bmp->bmp_base;
-		idx = tid / TID_IDS_PER_IDX;
-		bit = 1UL << (tid % TID_IDS_PER_IDX);
-		bmp->bmp_bitmap[idx] |= bit;
-		bmp->bmp_free++;
-		mtx_unlock(&tid_lock);
-	}
-
 #ifdef INVARIANTS
 	/* Verify that this thread is in a safe state to free. */
 	switch (td->td_state) {
@@ -225,9 +205,47 @@
 static void
 thread_init(void *mem, int size)
 {
-	struct thread	*td;
+	struct thread *td;
+	struct tid_bitmap_part *bmp, *new;
+	int bit, idx;
 
 	td = (struct thread *)mem;
+
+	mtx_lock(&tid_lock);
+	STAILQ_FOREACH(bmp, &tid_bitmap, bmp_next) {
+		if (bmp->bmp_free)
+			break;
+	}
+	/* Create a new bitmap if we run out of free bits. */
+	if (bmp == NULL) {
+		mtx_unlock(&tid_lock);
+		new = uma_zalloc(tid_zone, M_WAITOK);
+		mtx_lock(&tid_lock);
+		bmp = STAILQ_LAST(&tid_bitmap, tid_bitmap_part, bmp_next);
+		if (bmp == NULL || bmp->bmp_free < TID_IDS_PER_PART/2) {
+			/* 1=free, 0=assigned. This way we can use ffsl(). */
+			memset(new->bmp_bitmap, ~0U, sizeof(new->bmp_bitmap));
+			new->bmp_base = (bmp == NULL) ? TID_MIN :
+			    bmp->bmp_base + TID_IDS_PER_PART;
+			new->bmp_free = TID_IDS_PER_PART;
+			STAILQ_INSERT_TAIL(&tid_bitmap, new, bmp_next);
+			bmp = new;
+			new = NULL;
+		}
+	} else
+		new = NULL;
+	/* We have a bitmap with available IDs. */
+	idx = 0;
+	while (idx < TID_BITMAP_SIZE && bmp->bmp_bitmap[idx] == 0UL)
+		idx++;
+	bit = ffsl(bmp->bmp_bitmap[idx]) - 1;
+	td->td_tid = bmp->bmp_base + idx * TID_IDS_PER_IDX + bit;
+	bmp->bmp_bitmap[idx] &= ~(1UL << bit);
+	bmp->bmp_free--;
+	mtx_unlock(&tid_lock);
+	if (new != NULL)
+		uma_zfree(tid_zone, new);
+
 	vm_thread_new(td, 0);
 	cpu_thread_setup(td);
 	td->td_sleepqueue = sleepq_alloc();
@@ -241,12 +259,29 @@
 static void
 thread_fini(void *mem, int size)
 {
-	struct thread	*td;
+	struct thread *td;
+	struct tid_bitmap_part *bmp;
+	lwpid_t tid;
+	int bit, idx;
 
 	td = (struct thread *)mem;
 	turnstile_free(td->td_turnstile);
 	sleepq_free(td->td_sleepqueue);
 	vm_thread_dispose(td);
+
+	STAILQ_FOREACH(bmp, &tid_bitmap, bmp_next) {
+		if (td->td_tid >= bmp->bmp_base &&
+		    td->td_tid < bmp->bmp_base + TID_IDS_PER_PART)
+			break;
+	}
+	KASSERT(bmp != NULL, ("No TID bitmap?"));
+	mtx_lock(&tid_lock);
+	tid = td->td_tid - bmp->bmp_base;
+	idx = tid / TID_IDS_PER_IDX;
+	bit = 1UL << (tid % TID_IDS_PER_IDX);
+	bmp->bmp_bitmap[idx] |= bit;
+	bmp->bmp_free++;
+	mtx_unlock(&tid_lock);
 }
 
 /*
@@ -536,55 +571,6 @@
 }
 
 /*
- * Assign a thread ID.
- */
-lwpid_t
-thread_new_tid(void)
-{
-	struct tid_bitmap_part *bmp, *new;
-	lwpid_t tid;
-	int bit, idx;
-
-	mtx_lock(&tid_lock);
-	STAILQ_FOREACH(bmp, &tid_bitmap, bmp_next) {
-		if (bmp->bmp_free)
-			break;
-	}
-	/* Create a new bitmap if we run out of free bits. */
-	if (bmp == NULL) {
-		mtx_unlock(&tid_lock);
-		new = uma_zalloc(tid_zone, M_WAITOK);
-		mtx_lock(&tid_lock);
-		bmp = STAILQ_LAST(&tid_bitmap, tid_bitmap_part, bmp_next);
-		if (bmp == NULL || bmp->bmp_free < TID_IDS_PER_PART/2) {
-			/* 1=free, 0=assigned. This way we can use ffsl(). */
-			memset(new->bmp_bitmap, ~0U, sizeof(new->bmp_bitmap));
-			new->bmp_base = (bmp == NULL) ? TID_MIN :
-			    bmp->bmp_base + TID_IDS_PER_PART;
-			new->bmp_free = TID_IDS_PER_PART;
-			STAILQ_INSERT_TAIL(&tid_bitmap, new, bmp_next);
-			bmp = new;
-			new = NULL;
-		}
-	} else
-		new = NULL;
-	/* We have a bitmap with available IDs. */
-	idx = 0;
-	while (idx < TID_BITMAP_SIZE && bmp->bmp_bitmap[idx] == 0UL)
-		idx++;
-	bit = ffsl(bmp->bmp_bitmap[idx]) - 1;
-	tid = bmp->bmp_base + idx * TID_IDS_PER_IDX + bit;
-	bmp->bmp_bitmap[idx] &= ~(1UL << bit);
-	bmp->bmp_free--;
-	mtx_unlock(&tid_lock);
-
-	if (new != NULL)
-		uma_zfree(tid_zone, new);
-	return (tid);
-}
-
-
-/*
  * Discard the current thread and exit from its context.
  * Always called with scheduler locked.
  *

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

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.189 2004/06/24 04:28:30 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.190 2004/06/26 17:12:29 rwatson Exp $");
 
 #include "opt_inet.h"
 #include "opt_mac.h"
@@ -432,7 +432,10 @@
 }
 
 /*
- * Must be called at splnet...
+ * soabort() must not be called with any socket locks held, as it calls
+ * into the protocol, which will call back into the socket code causing
+ * it to acquire additional socket locks that may cause recursion or lock
+ * order reversals.
  */
 int
 soabort(so)

==== //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#21 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.135 2004/06/24 01:37:03 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.136 2004/06/26 19:10:38 rwatson Exp $");
 
 #include "opt_mac.h"
 #include "opt_param.h"
@@ -171,13 +171,11 @@
 	SOCK_UNLOCK(so);
 	SOCKBUF_LOCK(&so->so_rcv);
 	so->so_rcv.sb_state |= SBS_CANTRCVMORE;
-	SOCKBUF_UNLOCK(&so->so_rcv);
+	sorwakeup_locked(so);
 	SOCKBUF_LOCK(&so->so_snd);
 	so->so_snd.sb_state |= SBS_CANTSENDMORE;
-	SOCKBUF_UNLOCK(&so->so_snd);
+	sowwakeup_locked(so);
 	wakeup(&so->so_timeo);
-	sowwakeup(so);
-	sorwakeup(so);
 }
 
 void
@@ -190,20 +188,19 @@
 	 * SOCKBUF_LOCK(&so->so_rcv) even though they are the same mutex to
 	 * avoid introducing the assumption  that they are the same.
 	 */
+	/* XXXRW: so_state locking? */
 	SOCK_LOCK(so);
 	so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
 	so->so_state |= SS_ISDISCONNECTED;
 	SOCK_UNLOCK(so);
 	SOCKBUF_LOCK(&so->so_rcv);
 	so->so_rcv.sb_state |= SBS_CANTRCVMORE;
-	SOCKBUF_UNLOCK(&so->so_rcv);
+	sorwakeup_locked(so);
 	SOCKBUF_LOCK(&so->so_snd);
 	so->so_snd.sb_state |= SBS_CANTSENDMORE;
 	sbdrop_locked(&so->so_snd, so->so_snd.sb_cc);
-	SOCKBUF_UNLOCK(&so->so_snd);
+	sowwakeup_locked(so);
 	wakeup(&so->so_timeo);
-	sowwakeup(so);
-	sorwakeup(so);
 }
 
 /*

==== //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#17 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.130 2004/06/25 20:12:06 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.131 2004/06/26 19:10:38 rwatson Exp $");
 
 #include "opt_mac.h"
 
@@ -302,8 +302,7 @@
 		    newhiwat, RLIM_INFINITY);
 		unp->unp_cc = so->so_rcv.sb_cc;
 		SOCKBUF_UNLOCK(&so->so_rcv);
-		SOCKBUF_UNLOCK(&so2->so_snd);
-		sowwakeup(so2);
+		sowwakeup_locked(so2);
 		break;
 
 	default:
@@ -371,8 +370,7 @@
 			from = &sun_noname;
 		SOCKBUF_LOCK(&so2->so_rcv);
 		if (sbappendaddr_locked(&so2->so_rcv, from, m, control)) {
-			SOCKBUF_UNLOCK(&so2->so_rcv);
-			sorwakeup(so2);
+			sorwakeup_locked(so2);
 			m = NULL;
 			control = NULL;
 		} else {
@@ -431,8 +429,7 @@
 		(void)chgsbsize(so->so_cred->cr_uidinfo, &so->so_snd.sb_hiwat,
 		    newhiwat, RLIM_INFINITY);
 		unp->unp_conn->unp_cc = so2->so_rcv.sb_cc;
-		SOCKBUF_UNLOCK(&so2->so_rcv);
-		sorwakeup(so2);
+		sorwakeup_locked(so2);
 		m = NULL;
 		break;
 

==== //depot/projects/netperf_socket/sys/netinet/ip_divert.c#9 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/netinet/ip_divert.c,v 1.92 2004/06/22 04:00:51 rwatson Exp $
+ * $FreeBSD: src/sys/netinet/ip_divert.c,v 1.93 2004/06/26 19:10:38 rwatson Exp $
  */
 
 #include "opt_inet.h"
@@ -228,12 +228,14 @@
 		/* XXX why does only one socket match? */
 		if (inp->inp_lport == nport) {
 			sa = inp->inp_socket;
-			if (sbappendaddr(&sa->so_rcv,
+			SOCKBUF_LOCK(&sa->so_rcv);
+			if (sbappendaddr_locked(&sa->so_rcv,
 			    (struct sockaddr *)&divsrc, m,
-			    (struct mbuf *)0) == 0)
+			    (struct mbuf *)0) == 0) {
 				sa = NULL;	/* force mbuf reclaim below */
-			else
-				sorwakeup(sa);
+				SOCKBUF_UNLOCK(&sa->so_rcv);
+			} else
+				sorwakeup_locked(sa);
 			INP_UNLOCK(inp);
 			break;
 		}

==== //depot/projects/netperf_socket/sys/netinet/ip_mroute.c#8 (text+ko) ====

@@ -17,7 +17,7 @@
  * and PIM-SMv2 and PIM-DM support, advanced API support,
  * bandwidth metering and signaling
  *
- * $FreeBSD: src/sys/netinet/ip_mroute.c,v 1.101 2004/06/24 02:01:48 rwatson Exp $
+ * $FreeBSD: src/sys/netinet/ip_mroute.c,v 1.102 2004/06/26 19:10:38 rwatson Exp $
  */
 
 #include "opt_mac.h"
@@ -1307,10 +1307,13 @@
 socket_send(struct socket *s, struct mbuf *mm, struct sockaddr_in *src)
 {
     if (s) {
-	if (sbappendaddr(&s->so_rcv, (struct sockaddr *)src, mm, NULL) != 0) {
-	    sorwakeup(s);
+	SOCKBUF_LOCK(&s->so_rcv);
+	if (sbappendaddr_locked(&s->so_rcv, (struct sockaddr *)src, mm,
+	    NULL) != 0) {
+	    sorwakeup_locked(s);
 	    return 0;
 	}
+	SOCKBUF_UNLOCK(&s->so_rcv);
     }
     m_freem(mm);
     return -1;

==== //depot/projects/netperf_socket/sys/netinet/raw_ip.c#8 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)raw_ip.c	8.7 (Berkeley) 5/15/95
- * $FreeBSD: src/sys/netinet/raw_ip.c,v 1.134 2004/06/09 20:10:38 ru Exp $
+ * $FreeBSD: src/sys/netinet/raw_ip.c,v 1.135 2004/06/26 19:10:39 rwatson Exp $
  */
 
 #include "opt_inet6.h"
@@ -160,18 +160,22 @@
 #endif
 	if (!policyfail) {
 		struct mbuf *opts = NULL;
+		struct socket *so;
 
+		so = last->inp_socket;
 		if ((last->inp_flags & INP_CONTROLOPTS) ||
-		    (last->inp_socket->so_options & SO_TIMESTAMP))
+		    (so->so_options & SO_TIMESTAMP))
 			ip_savecontrol(last, &opts, ip, n);
-		if (sbappendaddr(&last->inp_socket->so_rcv,
+		SOCKBUF_LOCK(&so->so_rcv);
+		if (sbappendaddr_locked(&so->so_rcv,
 		    (struct sockaddr *)&ripsrc, n, opts) == 0) {
 			/* should notify about lost packet */
 			m_freem(n);
 			if (opts)
 				m_freem(opts);
+			SOCKBUF_UNLOCK(&so->so_rcv);
 		} else
-			sorwakeup(last->inp_socket);
+			sorwakeup_locked(so);
 	} else
 		m_freem(n);
 	return policyfail;

==== //depot/projects/netperf_socket/sys/netinet/tcp_input.c#15 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)tcp_input.c	8.12 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.247 2004/06/25 04:11:26 ps Exp $
+ * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.248 2004/06/26 19:10:39 rwatson Exp $
  */
 
 #include "opt_ipfw.h"		/* for ipfw_fwd		*/
@@ -353,22 +353,24 @@
 	q = LIST_FIRST(&tp->t_segq);
 	if (!q || q->tqe_th->th_seq != tp->rcv_nxt)
 		return (0);
+	SOCKBUF_LOCK(&so->so_rcv);
 	do {
 		tp->rcv_nxt += q->tqe_len;
 		flags = q->tqe_th->th_flags & TH_FIN;
 		nq = LIST_NEXT(q, tqe_q);
 		LIST_REMOVE(q, tqe_q);
+		/* Unlocked read. */
 		if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
 			m_freem(q->tqe_m);
 		else
-			sbappendstream(&so->so_rcv, q->tqe_m);
+			sbappendstream_locked(&so->so_rcv, q->tqe_m);
 		uma_zfree(tcp_reass_zone, q);
 		tp->t_segqlen--;
 		tcp_reass_qsize--;
 		q = nq;
 	} while (q && q->tqe_th->th_seq == tp->rcv_nxt);
 	ND6_HINT(tp);
-	sorwakeup(so);
+	sorwakeup_locked(so);
 	return (flags);
 }
 
@@ -1264,13 +1266,15 @@
 #endif
 			 * Add data to socket buffer.
 			 */
+			/* Unlocked read. */
+			SOCKBUF_LOCK(&so->so_rcv);
 			if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
 				m_freem(m);
 			} else {
 				m_adj(m, drop_hdrlen);	/* delayed header drop */
-				sbappendstream(&so->so_rcv, m);
+				sbappendstream_locked(&so->so_rcv, m);
 			}
-			sorwakeup(so);
+			sorwakeup_locked(so);
 			if (DELAY_ACK(tp)) {
 				tp->t_flags |= TF_DELACK;
 			} else {
@@ -2155,8 +2159,7 @@
 			tp->snd_wnd -= acked;
 			ourfinisacked = 0;
 		}
-		SOCKBUF_UNLOCK(&so->so_snd);
-		sowwakeup(so);
+		sowwakeup_locked(so);
 		/* detect una wraparound */
 		if ((tcp_do_newreno || tp->sack_enable) && 
 		    !IN_FASTRECOVERY(tp) &&
@@ -2365,11 +2368,13 @@
 			tcpstat.tcps_rcvpack++;
 			tcpstat.tcps_rcvbyte += tlen;
 			ND6_HINT(tp);
+			/* Unlocked read. */
+			SOCKBUF_LOCK(&so->so_rcv);
 			if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
 				m_freem(m);
 			else
-				sbappendstream(&so->so_rcv, m);
-			sorwakeup(so);
+				sbappendstream_locked(&so->so_rcv, m);
+			sorwakeup_locked(so);
 		} else {
 			thflags = tcp_reass(tp, th, &tlen, m);
 			tp->t_flags |= TF_ACKNOW;

==== //depot/projects/netperf_socket/sys/netinet/tcp_usrreq.c#10 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	From: @(#)tcp_usrreq.c	8.2 (Berkeley) 1/3/94
- * $FreeBSD: src/sys/netinet/tcp_usrreq.c,v 1.102 2004/06/18 20:22:21 rwatson Exp $
+ * $FreeBSD: src/sys/netinet/tcp_usrreq.c,v 1.103 2004/06/26 17:50:50 rwatson Exp $
  */
 
 #include "opt_ipsec.h"

==== //depot/projects/netperf_socket/sys/netinet/udp_usrreq.c#8 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)udp_usrreq.c	8.6 (Berkeley) 5/23/95
- * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.155 2004/06/16 08:50:14 bms Exp $
+ * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.156 2004/06/26 19:10:39 rwatson Exp $
  */
 
 #include "opt_ipsec.h"
@@ -447,6 +447,7 @@
 	int off;
 {
 	struct sockaddr *append_sa;
+	struct socket *so;
 	struct mbuf *opts = 0;
 
 	INP_LOCK_ASSERT(last);
@@ -496,13 +497,17 @@
 #endif
 	append_sa = (struct sockaddr *)&udp_in;
 	m_adj(n, off);
-	if (sbappendaddr(&last->inp_socket->so_rcv, append_sa, n, opts) == 0) {
+
+	so = last->inp_socket;
+	SOCKBUF_LOCK(&so->so_rcv);
+	if (sbappendaddr_locked(&so->so_rcv, append_sa, n, opts) == 0) {
 		m_freem(n);
 		if (opts)
 			m_freem(opts);
 		udpstat.udps_fullsock++;
+		SOCKBUF_UNLOCK(&so->so_rcv);
 	} else
-		sorwakeup(last->inp_socket);
+		sorwakeup_locked(so);
 }
 
 /*

==== //depot/projects/netperf_socket/sys/sys/proc.h#14 (text+ko) ====

@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)proc.h	8.15 (Berkeley) 5/19/95
- * $FreeBSD: src/sys/sys/proc.h,v 1.381 2004/06/19 17:58:32 marcel Exp $
+ * $FreeBSD: src/sys/sys/proc.h,v 1.382 2004/06/26 18:58:22 marcel Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -903,7 +903,6 @@
 int	thread_export_context(struct thread *td, int willexit);
 void	thread_free(struct thread *td);
 void	thread_link(struct thread *td, struct ksegrp *kg);
-lwpid_t	thread_new_tid(void);
 void	thread_reap(void);
 struct thread *thread_schedule_upcall(struct thread *td, struct kse_upcall *ku);
 int	thread_single(int how);

==== //depot/projects/netperf_socket/sys/vm/vm_map.h#5 (text+ko) ====

@@ -57,7 +57,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/vm_map.h,v 1.109 2004/04/24 03:46:44 alc Exp $
+ * $FreeBSD: src/sys/vm/vm_map.h,v 1.110 2004/06/26 19:16:35 alc Exp $
  */
 
 /*
@@ -223,8 +223,7 @@
 	int vm_refcnt;		/* number of references */
 	struct shmmap_state *vm_shm;	/* SYS5 shared memory private data XXX */
 /* we copy between vm_startcopy and vm_endcopy on fork */
-#define vm_startcopy vm_rssize
-	segsz_t vm_rssize;	/* current resident set size in pages */
+#define vm_startcopy vm_swrss

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



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