PERFORCE change 123819 for review

Peter Wemm peter at FreeBSD.org
Fri Jul 20 19:00:19 UTC 2007


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

Change 123819 by peter at peter_daintree on 2007/07/20 18:59:32

	IFC @123810

Affected files ...

.. //depot/projects/hammer/release/doc/en_US.ISO8859-1/relnotes/article.sgml#12 integrate
.. //depot/projects/hammer/sys/fs/coda/coda_vfsops.c#2 integrate
.. //depot/projects/hammer/sys/fs/coda/coda_vnops.c#2 integrate
.. //depot/projects/hammer/sys/fs/msdosfs/msdosfs_fat.c#8 integrate
.. //depot/projects/hammer/sys/fs/msdosfs/msdosfs_vnops.c#29 integrate
.. //depot/projects/hammer/sys/i386/linux/linux_machdep.c#27 integrate
.. //depot/projects/hammer/sys/kern/kern_rwlock.c#11 integrate
.. //depot/projects/hammer/sys/kern/tty.c#55 integrate
.. //depot/projects/hammer/sys/net80211/ieee80211_scan_sta.c#4 integrate
.. //depot/projects/hammer/sys/sys/rwlock.h#9 integrate

Differences ...

==== //depot/projects/hammer/release/doc/en_US.ISO8859-1/relnotes/article.sgml#12 (text+ko) ====

@@ -30,7 +30,7 @@
 
   <corpauthor>The &os; Project</corpauthor>
 
-  <pubdate>$FreeBSD: src/release/doc/en_US.ISO8859-1/relnotes/article.sgml,v 1.1051 2007/07/15 01:59:35 delphij Exp $</pubdate>
+  <pubdate>$FreeBSD: src/release/doc/en_US.ISO8859-1/relnotes/article.sgml,v 1.1052 2007/07/20 15:48:02 bmah Exp $</pubdate>
 
   <copyright>
     <year>2000</year>
@@ -416,9 +416,14 @@
       performance improvements.</para>
 
     <para>The ULE process scheduler has been revised to improve its
-      behavior, in particular interactivity under load.  This
-      implementation can commonly be referred to as <quote>ULE
-      2.0</quote>.</para>
+      behavior, in particular interactivity under load, for both
+      uniprocessor and multiprocessor machines.  This
+      implementation has commonly been referred to as <quote>ULE
+      3.0</quote>.  (ULE 3.0 was formerly known as SCHED_SMP,
+      which in turn was based on version 2.0 of the ULE scheduler.
+      ULE 2.0 was never a part of any &os; release, however it
+      was the subject of many development, testing, and
+      benchmarking efforts.)</para>
 
     <para>The <literal>SIGCHLD</literal> signal queuing has been
       added.  For each child process whose status has been changed,
@@ -836,6 +841,9 @@
 	  <filename role="package">net/iwi-firmware</filename>
 	  port/package. &merged;</para>
 
+	<para>The ixgbe driver, which supports the Intel 10G PCI-Express
+	  adapter (82598), has been added.</para>
+
 	<para>The &man.le.4; driver, which supports AMD Am7900 LANCE
 	  and Am79C9xx PCnet NICs,
 	  has been added.  While the &man.lnc.4; driver also supports these
@@ -938,6 +946,14 @@
 	  cards, as well as quarter- and half-channel support
 	  for 802.11a. &merged;</para>
 
+	<para>ISDN4BSD, &man.ng.h4.4;, and netatm have been temporarily
+	  disconnected from the build.  These modules all require
+	  the Giant kernel lock for their operation; disconnecting
+	  them allows the removal of the NET_NEEDS_GIANT compatability
+	  shim and allows the &os; network stack to run completely
+	  without the Giant kernel lock.  It is planned to convert
+	  these modules to fine-grained kernel locking and re-connect
+	  them for &os; 7.1-RELEASE.</para>
       </sect4>
     </sect3>
 

==== //depot/projects/hammer/sys/fs/coda/coda_vfsops.c#2 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vfsops.c,v 1.66 2007/07/12 21:04:57 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vfsops.c,v 1.67 2007/07/20 11:14:51 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -227,6 +227,7 @@
 	printf("coda_unmount: ROOT: vp %p, cp %p\n", mi->mi_rootvp, VTOC(mi->mi_rootvp));
 #endif
 	vrele(mi->mi_rootvp);
+	vrele(coda_ctlvp);
 	active = coda_kill(vfsp, NOT_DOWNCALL);
 	ASSERT_VOP_LOCKED(mi->mi_rootvp, "coda_unmount");
 	mi->mi_rootvp->v_vflag &= ~VV_ROOT;

==== //depot/projects/hammer/sys/fs/coda/coda_vnops.c#2 (text+ko) ====

@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vnops.c,v 1.75 2007/07/12 21:04:57 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vnops.c,v 1.76 2007/07/20 11:14:51 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -745,11 +745,6 @@
     /* We don't need to send inactive to venus - DCS */
     MARK_ENTRY(CODA_INACTIVE_STATS);
 
-    if (IS_CTL_VP(vp)) {
-	MARK_INT_SAT(CODA_INACTIVE_STATS);
-	return 0;
-    }
-
     CODADEBUG(CODA_INACTIVE, myprintf(("in inactive, %s, vfsp %p\n",
 				  coda_f2s(&cp->c_fid), vp->v_mount));)
  

==== //depot/projects/hammer/sys/fs/msdosfs/msdosfs_fat.c#8 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.41 2007/07/12 16:09:07 bde Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.42 2007/07/20 16:21:47 bde Exp $ */
 /*	$NetBSD: msdosfs_fat.c,v 1.28 1997/11/17 15:36:49 ws Exp $	*/
 
 /*-
@@ -1105,7 +1105,7 @@
 					else
 						bp->b_blkno = blkno;
 				}
-				clrbuf(bp);
+				vfs_bio_clrbuf(bp);
 				if (bpp) {
 					*bpp = bp;
 					bpp = NULL;

==== //depot/projects/hammer/sys/fs/msdosfs/msdosfs_vnops.c#29 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.170 2007/06/12 00:11:58 rwatson Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.172 2007/07/20 17:06:57 bde Exp $ */
 /*	$NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $	*/
 
 /*-
@@ -579,6 +579,9 @@
 		if (uio->uio_offset >= dep->de_FileSize)
 			break;
 		lbn = de_cluster(pmp, uio->uio_offset);
+		rablock = lbn + 1;
+		blsize = pmp->pm_bpcluster;
+		on = uio->uio_offset & pmp->pm_crbomask;
 		/*
 		 * If we are operating on a directory file then be sure to
 		 * do i/o with the vnode for the filesystem instead of the
@@ -593,23 +596,22 @@
 			} else if (error)
 				break;
 			error = bread(pmp->pm_devvp, lbn, blsize, NOCRED, &bp);
+		} else if (de_cn2off(pmp, rablock) >= dep->de_FileSize) {
+			error = bread(vp, lbn, blsize, NOCRED, &bp);
+		} else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) {
+			error = cluster_read(vp, dep->de_FileSize, lbn, blsize,
+			    NOCRED, on + uio->uio_resid, seqcount, &bp);
+		} else if (seqcount > 1) {
+			rasize = blsize;
+			error = breadn(vp, lbn,
+			    blsize, &rablock, &rasize, 1, NOCRED, &bp);
 		} else {
-			blsize = pmp->pm_bpcluster;
-			rablock = lbn + 1;
-			if (seqcount > 1 &&
-			    de_cn2off(pmp, rablock) < dep->de_FileSize) {
-				rasize = pmp->pm_bpcluster;
-				error = breadn(vp, lbn, blsize,
-				    &rablock, &rasize, 1, NOCRED, &bp);
-			} else {
-				error = bread(vp, lbn, blsize, NOCRED, &bp);
-			}
+			error = bread(vp, lbn, blsize, NOCRED, &bp);
 		}
 		if (error) {
 			brelse(bp);
 			break;
 		}
-		on = uio->uio_offset & pmp->pm_crbomask;
 		diff = pmp->pm_bpcluster - on;
 		n = diff > uio->uio_resid ? uio->uio_resid : diff;
 		diff = dep->de_FileSize - uio->uio_offset;
@@ -645,6 +647,7 @@
 	u_long osize;
 	int error = 0;
 	u_long count;
+	int seqcount;
 	daddr_t bn, lastcn;
 	struct buf *bp;
 	int ioflag = ap->a_ioflag;
@@ -730,6 +733,7 @@
 	} else
 		lastcn = de_clcount(pmp, osize) - 1;
 
+	seqcount = ioflag >> IO_SEQSHIFT;
 	do {
 		if (de_cluster(pmp, uio->uio_offset) > lastcn) {
 			error = ENOSPC;
@@ -755,7 +759,7 @@
 			 * then no need to read data from disk.
 			 */
 			bp = getblk(thisvp, bn, pmp->pm_bpcluster, 0, 0, 0);
-			clrbuf(bp);
+			vfs_bio_clrbuf(bp);
 			/*
 			 * Do the bmap now, since pcbmap needs buffers
 			 * for the fat table. (see msdosfs_strategy)
@@ -798,18 +802,31 @@
 			break;
 		}
 
+		/* Prepare for clustered writes in some else clauses. */
+		if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0)
+			bp->b_flags |= B_CLUSTEROK;
+
 		/*
-		 * If they want this synchronous then write it and wait for
-		 * it.  Otherwise, if on a cluster boundary write it
-		 * asynchronously so we can move on to the next block
-		 * without delay.  Otherwise do a delayed write because we
-		 * may want to write somemore into the block later.
+		 * If IO_SYNC, then each buffer is written synchronously.
+		 * Otherwise, if we have a severe page deficiency then
+		 * write the buffer asynchronously.  Otherwise, if on a
+		 * cluster boundary then write the buffer asynchronously,
+		 * combining it with contiguous clusters if permitted and
+		 * possible, since we don't expect more writes into this
+		 * buffer soon.  Otherwise, do a delayed write because we
+		 * expect more writes into this buffer soon.
 		 */
 		if (ioflag & IO_SYNC)
-			(void) bwrite(bp);
-		else if (n + croffset == pmp->pm_bpcluster)
+			(void)bwrite(bp);
+		else if (vm_page_count_severe() || buf_dirty_count_severe())
 			bawrite(bp);
-		else
+		else if (n + croffset == pmp->pm_bpcluster) {
+			if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0)
+				cluster_write(vp, bp, dep->de_FileSize,
+				    seqcount);
+			else
+				bawrite(bp);
+		} else
 			bdwrite(bp);
 		dep->de_flag |= DE_UPDATE;
 	} while (error == 0 && uio->uio_resid > 0);
@@ -1755,12 +1772,16 @@
 	return (error);
 }
 
-/*
- * vp  - address of vnode file the file
- * bn  - which cluster we are interested in mapping to a filesystem block number.
- * vpp - returns the vnode for the block special file holding the filesystem
- *	 containing the file of interest
- * bnp - address of where to return the filesystem relative block number
+/*-
+ * a_vp   - pointer to the file's vnode
+ * a_bn   - logical block number within the file (cluster number for us)
+ * a_bop  - where to return the bufobj of the special file containing the fs
+ * a_bnp  - where to return the "physical" block number corresponding to a_bn
+ *          (relative to the special file; units are blocks of size DEV_BSIZE)
+ * a_runp - where to return the "run past" a_bn.  This is the count of logical
+ *          blocks whose physical blocks (together with a_bn's physical block)
+ *          are contiguous.
+ * a_runb - where to return the "run before" a_bn.
  */
 static int
 msdosfs_bmap(ap)
@@ -1773,26 +1794,54 @@
 		int *a_runb;
 	} */ *ap;
 {
-	struct denode *dep = VTODE(ap->a_vp);
-	daddr_t blkno;
-	int error;
+	struct denode *dep;
+	struct mount *mp;
+	struct msdosfsmount *pmp;
+	struct vnode *vp;
+	daddr_t runbn;
+	u_long cn;
+	int bnpercn, error, maxio, maxrun, run;
 
+	vp = ap->a_vp;
+	dep = VTODE(vp);
+	pmp = dep->de_pmp;
 	if (ap->a_bop != NULL)
-		*ap->a_bop = &dep->de_pmp->pm_devvp->v_bufobj;
+		*ap->a_bop = &pmp->pm_devvp->v_bufobj;
 	if (ap->a_bnp == NULL)
 		return (0);
-	if (ap->a_runp) {
-		/*
-		 * Sequential clusters should be counted here.
-		 */
+	if (ap->a_runp != NULL)
 		*ap->a_runp = 0;
+	if (ap->a_runb != NULL)
+		*ap->a_runb = 0;
+	cn = ap->a_bn;
+	if (cn != ap->a_bn)
+		return (EFBIG);
+	error = pcbmap(dep, cn, ap->a_bnp, NULL, NULL);
+	if (error != 0 || (ap->a_runp == NULL && ap->a_runb == NULL))
+		return (error);
+
+	mp = vp->v_mount;
+	maxio = mp->mnt_iosize_max / mp->mnt_stat.f_iosize;
+	bnpercn = de_cn2bn(pmp, 1);
+	if (ap->a_runp != NULL) {
+		maxrun = ulmin(maxio - 1, pmp->pm_maxcluster - cn);
+		for (run = 1; run <= maxrun; run++) {
+			if (pcbmap(dep, cn + run, &runbn, NULL, NULL) != 0 ||
+			    runbn != *ap->a_bnp + run * bnpercn)
+				break;
+		}
+		*ap->a_runp = run - 1;
 	}
-	if (ap->a_runb) {
-		*ap->a_runb = 0;
+	if (ap->a_runb != NULL) {
+		maxrun = ulmin(maxio - 1, cn);
+		for (run = 1; run < maxrun; run++) {
+			if (pcbmap(dep, cn - run, &runbn, NULL, NULL) != 0 ||
+			    runbn != *ap->a_bnp - run * bnpercn)
+				break;
+		}
+		*ap->a_runb = run - 1;
 	}
-	error = pcbmap(dep, ap->a_bn, &blkno, 0, 0);
-	*ap->a_bnp = blkno;
-	return (error);
+	return (0);
 }
 
 static int

==== //depot/projects/hammer/sys/i386/linux/linux_machdep.c#27 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.77 2007/07/04 23:06:43 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.78 2007/07/20 08:35:18 attilio Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -846,9 +846,7 @@
 	iia.start = args->start;
 	iia.length = args->length;
 	iia.enable = args->enable;
-	mtx_lock(&Giant);
 	error = i386_set_ioperm(td, &iia);
-	mtx_unlock(&Giant);
 	return (error);
 }
 
@@ -884,10 +882,8 @@
 		ldt.start = 0;
 		ldt.descs = uap->ptr;
 		ldt.num = uap->bytecount / sizeof(union descriptor);
-		mtx_lock(&Giant);
 		error = i386_get_ldt(td, &ldt);
 		td->td_retval[0] *= sizeof(union descriptor);
-		mtx_unlock(&Giant);
 		break;
 	case 0x01: /* write_ldt */
 	case 0x11: /* write_ldt */
@@ -912,9 +908,7 @@
 		desc.sd.sd_xx = 0;
 		desc.sd.sd_def32 = ld.seg_32bit;
 		desc.sd.sd_gran = ld.limit_in_pages;
-		mtx_lock(&Giant);
 		error = i386_set_ldt(td, &ldt, &desc);
-		mtx_unlock(&Giant);
 		break;
 	default:
 		error = EINVAL;

==== //depot/projects/hammer/sys/kern/kern_rwlock.c#11 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_rwlock.c,v 1.27 2007/06/26 21:31:56 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_rwlock.c,v 1.28 2007/07/20 08:43:41 attilio Exp $");
 
 #include "opt_ddb.h"
 #include "opt_no_adaptive_rwlocks.h"
@@ -45,7 +45,7 @@
 #include <sys/rwlock.h>
 #include <sys/systm.h>
 #include <sys/turnstile.h>
-#include <sys/lock_profile.h>
+
 #include <machine/cpu.h>
 
 CTASSERT((RW_RECURSE & LO_CLASSFLAGS) == RW_RECURSE);
@@ -221,8 +221,10 @@
 #ifdef ADAPTIVE_RWLOCKS
 	volatile struct thread *owner;
 #endif
+#ifdef LOCK_PROFILING_SHARED
 	uint64_t waittime = 0;
 	int contested = 0;
+#endif
 	uintptr_t x;
 
 	KASSERT(rw->rw_lock != RW_DESTROYED,
@@ -265,22 +267,22 @@
 			MPASS((x & RW_LOCK_READ_WAITERS) == 0);
 			if (atomic_cmpset_acq_ptr(&rw->rw_lock, x,
 			    x + RW_ONE_READER)) {
+#ifdef LOCK_PROFILING_SHARED
+				if (RW_READERS(x) == 0)
+					lock_profile_obtain_lock_success(
+					    &rw->lock_object, contested,
+					    waittime, file, line);
+#endif
 				if (LOCK_LOG_TEST(&rw->lock_object, 0))
 					CTR4(KTR_LOCK,
 					    "%s: %p succeed %p -> %p", __func__,
 					    rw, (void *)x,
 					    (void *)(x + RW_ONE_READER));
-				if (RW_READERS(x) == 0)
-					lock_profile_obtain_lock_success(
-					    &rw->lock_object, contested, waittime,
-					    file, line);
 				break;
 			}
 			cpu_spinwait();
 			continue;
 		}
-		lock_profile_obtain_lock_failed(&rw->lock_object, &contested,
-		    &waittime);
 
 		/*
 		 * Okay, now it's the hard case.  Some other thread already
@@ -331,6 +333,10 @@
 			if (LOCK_LOG_TEST(&rw->lock_object, 0))
 				CTR3(KTR_LOCK, "%s: spinning on %p held by %p",
 				    __func__, rw, owner);
+#ifdef LOCK_PROFILING_SHARED
+			lock_profile_obtain_lock_failed(&rw->lock_object,
+			    &contested, &waittime);
+#endif
 			while ((struct thread*)RW_OWNER(rw->rw_lock)== owner &&
 			    TD_IS_RUNNING(owner))
 				cpu_spinwait();
@@ -345,6 +351,10 @@
 		if (LOCK_LOG_TEST(&rw->lock_object, 0))
 			CTR2(KTR_LOCK, "%s: %p blocking on turnstile", __func__,
 			    rw);
+#ifdef LOCK_PROFILING_SHARED
+		lock_profile_obtain_lock_failed(&rw->lock_object, &contested,
+		    &waittime);
+#endif
 		turnstile_wait(ts, rw_owner(rw), TS_SHARED_QUEUE);
 		if (LOCK_LOG_TEST(&rw->lock_object, 0))
 			CTR2(KTR_LOCK, "%s: %p resuming from turnstile",
@@ -403,6 +413,9 @@
 		 */
 		KASSERT(!(x & RW_LOCK_READ_WAITERS),
 		    ("%s: waiting readers", __func__));
+#ifdef LOCK_PROFILING_SHARED
+		lock_profile_release_lock(&rw->lock_object);
+#endif
 
 		/*
 		 * If there aren't any waiters for a write lock, then try
@@ -479,7 +492,6 @@
 		turnstile_chain_unlock(&rw->lock_object);
 		break;
 	}
-	lock_profile_release_lock(&rw->lock_object);
 }
 
 /*
@@ -494,7 +506,9 @@
 #ifdef ADAPTIVE_RWLOCKS
 	volatile struct thread *owner;
 #endif
+	uint64_t waittime = 0;
 	uintptr_t v;
+	int contested = 0;
 
 	if (rw_wlocked(rw)) {
 		KASSERT(rw->lock_object.lo_flags & RW_RECURSE,
@@ -578,6 +592,8 @@
 			if (LOCK_LOG_TEST(&rw->lock_object, 0))
 				CTR3(KTR_LOCK, "%s: spinning on %p held by %p",
 				    __func__, rw, owner);
+			lock_profile_obtain_lock_failed(&rw->lock_object,
+			    &contested, &waittime);
 			while ((struct thread*)RW_OWNER(rw->rw_lock)== owner &&
 			    TD_IS_RUNNING(owner))
 				cpu_spinwait();
@@ -592,11 +608,15 @@
 		if (LOCK_LOG_TEST(&rw->lock_object, 0))
 			CTR2(KTR_LOCK, "%s: %p blocking on turnstile", __func__,
 			    rw);
+		lock_profile_obtain_lock_failed(&rw->lock_object, &contested,
+		    &waittime);
 		turnstile_wait(ts, rw_owner(rw), TS_EXCLUSIVE_QUEUE);
 		if (LOCK_LOG_TEST(&rw->lock_object, 0))
 			CTR2(KTR_LOCK, "%s: %p resuming from turnstile",
 			    __func__, rw);
 	}
+	lock_profile_obtain_lock_success(&rw->lock_object, contested, waittime,
+	    file, line);
 }
 
 /*

==== //depot/projects/hammer/sys/kern/tty.c#55 (text+ko) ====

@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/tty.c,v 1.272 2007/07/01 00:17:59 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/tty.c,v 1.273 2007/07/20 09:41:54 kib Exp $");
 
 #include "opt_compat.h"
 #include "opt_tty.h"

==== //depot/projects/hammer/sys/net80211/ieee80211_scan_sta.c#4 (text+ko) ====

@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_scan_sta.c,v 1.3 2007/07/12 17:22:43 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_scan_sta.c,v 1.4 2007/07/20 11:38:12 sephe Exp $");
 
 /*
  * IEEE 802.11 station scanning support.
@@ -376,17 +376,23 @@
 			break;
 
 		c = ieee80211_find_channel(ic, freq[i], modeflags);
-		if (c == NULL || isexcluded(ic, c))
+		if (c != NULL && isexcluded(ic, c))
 			continue;
 		if (mode == IEEE80211_MODE_AUTO) {
 			/*
 			 * XXX special-case 11b/g channels so we select
-			 *     the g channel if both are present.
+			 *     the g channel if both are present or there
+			 *     are only g channels.
 			 */
-			if (IEEE80211_IS_CHAN_B(c) &&
-			    (cg = find11gchannel(ic, i, c->ic_freq)) != NULL)
-				c = cg;
+			if (c == NULL || IEEE80211_IS_CHAN_B(c)) {
+				cg = find11gchannel(ic, i, freq[i]);
+				if (cg != NULL)
+					c = cg;
+			}
 		}
+		if (c == NULL)
+			continue;
+
 		ss->ss_chans[ss->ss_last++] = c;
 	}
 #undef N

==== //depot/projects/hammer/sys/sys/rwlock.h#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/sys/rwlock.h,v 1.13 2007/06/26 21:31:56 attilio Exp $
+ * $FreeBSD: src/sys/sys/rwlock.h,v 1.14 2007/07/20 08:43:42 attilio Exp $
  */
 
 #ifndef _SYS_RWLOCK_H_
@@ -34,6 +34,7 @@
 
 #include <sys/_lock.h>
 #include <sys/_rwlock.h>
+#include <sys/lock_profile.h>
 
 #ifdef _KERNEL
 #include <sys/pcpu.h>
@@ -98,18 +99,14 @@
  */
 
 /* Acquire a write lock. */
-#define	__rw_wlock(rw, tid, file, line) do {	\
+#define	__rw_wlock(rw, tid, file, line) do {				\
 	uintptr_t _tid = (uintptr_t)(tid);				\
-	int contested = 0;                                              \
-        uint64_t waitstart = 0;                                         \
 						                        \
-	if (!_rw_write_lock((rw), _tid)) {				\
-		lock_profile_obtain_lock_failed(&(rw)->lock_object,	\
-		    &contested, &waitstart);				\
+	if (!_rw_write_lock((rw), _tid))				\
 		_rw_wlock_hard((rw), _tid, (file), (line));		\
-	}                                                               \
-	lock_profile_obtain_lock_success(&(rw)->lock_object, contested,	\
-	    waitstart, (file), (line));					\
+	else								\
+		lock_profile_obtain_lock_success(&(rw)->lock_object, 0,	\
+		    0, (file), (line));					\
 } while (0)
 
 /* Release a write lock. */


More information about the p4-projects mailing list