Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 May 2007 21:37:49 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 120082 for review
Message-ID:  <200705192137.l4JLbnnx019415@repoman.freebsd.org>

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

Change 120082 by jhb@jhb_mutex on 2007/05/19 21:37:04

	IFC @120081

Affected files ...

.. //depot/projects/smpng/sys/kern/kern_sx.c#50 integrate
.. //depot/projects/smpng/sys/kern/uipc_syscalls.c#106 integrate
.. //depot/projects/smpng/sys/sys/sx.h#29 integrate

Differences ...

==== //depot/projects/smpng/sys/kern/kern_sx.c#50 (text+ko) ====

@@ -40,7 +40,7 @@
 #include "opt_ddb.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_sx.c,v 1.49 2007/05/19 20:18:12 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_sx.c,v 1.50 2007/05/19 21:26:05 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/ktr.h>
@@ -139,7 +139,7 @@
 	struct sx *sx;
 
 	sx = (struct sx *)lock;
-	sx_assert(sx, SX_LOCKED | SX_NOTRECURSED);
+	sx_assert(sx, SA_LOCKED | SA_NOTRECURSED);
 	if (sx_xlocked(sx)) {
 		sx_xunlock(sx);
 		return (1);
@@ -273,7 +273,7 @@
 	MPASS(curthread != NULL);
 	KASSERT(sx->sx_lock != SX_LOCK_DESTROYED,
 	    ("sx_sunlock() of destroyed sx @ %s:%d", file, line));
-	_sx_assert(sx, SX_SLOCKED, file, line);
+	_sx_assert(sx, SA_SLOCKED, file, line);
 	curthread->td_locks--;
 	WITNESS_UNLOCK(&sx->lock_object, 0, file, line);
 	LOCK_LOG_LOCK("SUNLOCK", &sx->lock_object, 0, 0, file, line);
@@ -289,7 +289,7 @@
 	MPASS(curthread != NULL);
 	KASSERT(sx->sx_lock != SX_LOCK_DESTROYED,
 	    ("sx_xunlock() of destroyed sx @ %s:%d", file, line));
-	_sx_assert(sx, SX_XLOCKED, file, line);
+	_sx_assert(sx, SA_XLOCKED, file, line);
 	curthread->td_locks--;
 	WITNESS_UNLOCK(&sx->lock_object, LOP_EXCLUSIVE, file, line);
 	LOCK_LOG_LOCK("XUNLOCK", &sx->lock_object, 0, sx->sx_recurse, file,
@@ -312,7 +312,7 @@
 
 	KASSERT(sx->sx_lock != SX_LOCK_DESTROYED,
 	    ("sx_try_upgrade() of destroyed sx @ %s:%d", file, line));
-	_sx_assert(sx, SX_SLOCKED, file, line);
+	_sx_assert(sx, SA_SLOCKED, file, line);
 
 	/*
 	 * Try to switch from one shared lock to an exclusive lock.  We need
@@ -339,7 +339,7 @@
 
 	KASSERT(sx->sx_lock != SX_LOCK_DESTROYED,
 	    ("sx_downgrade() of destroyed sx @ %s:%d", file, line));
-	_sx_assert(sx, SX_XLOCKED | SX_NOTRECURSED, file, line);
+	_sx_assert(sx, SA_XLOCKED | SA_NOTRECURSED, file, line);
 #ifndef INVARIANTS
 	if (sx_recursed(sx))
 		panic("downgrade of a recursed lock");
@@ -845,16 +845,16 @@
 	if (panicstr != NULL)
 		return;
 	switch (what) {
-	case SX_SLOCKED:
-	case SX_SLOCKED | SX_NOTRECURSED:
-	case SX_SLOCKED | SX_RECURSED:
+	case SA_SLOCKED:
+	case SA_SLOCKED | SA_NOTRECURSED:
+	case SA_SLOCKED | SA_RECURSED:
 #ifndef WITNESS
 		slocked = 1;
 		/* FALLTHROUGH */
 #endif
-	case SX_LOCKED:
-	case SX_LOCKED | SX_NOTRECURSED:
-	case SX_LOCKED | SX_RECURSED:
+	case SA_LOCKED:
+	case SA_LOCKED | SA_NOTRECURSED:
+	case SA_LOCKED | SA_RECURSED:
 #ifdef WITNESS
 		witness_assert(&sx->lock_object, what, file, line);
 #else
@@ -872,31 +872,31 @@
 
 		if (!(sx->sx_lock & SX_LOCK_SHARED)) {
 			if (sx_recursed(sx)) {
-				if (what & SX_NOTRECURSED)
+				if (what & SA_NOTRECURSED)
 					panic("Lock %s recursed @ %s:%d\n",
 					    sx->lock_object.lo_name, file,
 					    line);
-			} else if (what & SX_RECURSED)
+			} else if (what & SA_RECURSED)
 				panic("Lock %s not recursed @ %s:%d\n",
 				    sx->lock_object.lo_name, file, line);
 		}
 #endif
 		break;
-	case SX_XLOCKED:
-	case SX_XLOCKED | SX_NOTRECURSED:
-	case SX_XLOCKED | SX_RECURSED:
+	case SA_XLOCKED:
+	case SA_XLOCKED | SA_NOTRECURSED:
+	case SA_XLOCKED | SA_RECURSED:
 		if (sx_xholder(sx) != curthread)
 			panic("Lock %s not exclusively locked @ %s:%d\n",
 			    sx->lock_object.lo_name, file, line);
 		if (sx_recursed(sx)) {
-			if (what & SX_NOTRECURSED)
+			if (what & SA_NOTRECURSED)
 				panic("Lock %s recursed @ %s:%d\n",
 				    sx->lock_object.lo_name, file, line);
-		} else if (what & SX_RECURSED)
+		} else if (what & SA_RECURSED)
 			panic("Lock %s not recursed @ %s:%d\n",
 			    sx->lock_object.lo_name, file, line);
 		break;
-	case SX_UNLOCKED:
+	case SA_UNLOCKED:
 #ifdef WITNESS
 		witness_assert(&sx->lock_object, what, file, line);
 #else

==== //depot/projects/smpng/sys/kern/uipc_syscalls.c#106 (text+ko) ====

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.255 2007/05/16 20:41:08 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.256 2007/05/19 20:50:59 andre Exp $");
 
 #include "opt_sctp.h"
 #include "opt_compat.h"
@@ -1819,8 +1819,8 @@
 	struct mbuf *m = NULL;
 	struct sf_buf *sf;
 	struct vm_page *pg;
-	off_t off, xfsize, sbytes = 0, rem = 0;
-	int error, mnw = 0;
+	off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0;
+	int error, hdrlen = 0, mnw = 0;
 	int vfslocked;
 
 	NET_LOCK_GIANT();
@@ -1916,6 +1916,7 @@
 				error = mnw ? EAGAIN : ENOBUFS;
 				goto out;
 			}
+			hdrlen = m_length(m, NULL);
 		}
 	}
 
@@ -1933,7 +1934,7 @@
 	 * The outer loop checks the state and available space of the socket
 	 * and takes care of the overall progress.
 	 */
-	for (off = uap->offset; ; ) {
+	for (off = uap->offset, rem = uap->nbytes; ; ) {
 		int loopbytes = 0;
 		int space = 0;
 		int done = 0;
@@ -1998,6 +1999,13 @@
 		SOCKBUF_UNLOCK(&so->so_snd);
 
 		/*
+		 * Reduce space in the socket buffer by the size of
+		 * the header mbuf chain.
+		 * hdrlen is set to 0 after the first loop.
+		 */
+		space -= hdrlen;
+
+		/*
 		 * Loop and construct maximum sized mbuf chain to be bulk
 		 * dumped into socket buffer.
 		 */
@@ -2015,12 +2023,12 @@
 			pgoff = (vm_offset_t)(off & PAGE_MASK);
 			xfsize = omin(PAGE_SIZE - pgoff,
 			    obj->un_pager.vnp.vnp_size - uap->offset -
-			    sbytes - loopbytes);
+			    fsbytes - loopbytes);
 			if (uap->nbytes)
-				rem = (uap->nbytes - sbytes - loopbytes);
+				rem = (uap->nbytes - fsbytes - loopbytes);
 			else
-				rem = obj->un_pager.vnp.vnp_size - uap->offset -
-				    sbytes - loopbytes;
+				rem = obj->un_pager.vnp.vnp_size -
+				    uap->offset - fsbytes - loopbytes;
 			xfsize = omin(rem, xfsize);
 			if (xfsize <= 0) {
 				VM_OBJECT_UNLOCK(obj);
@@ -2038,9 +2046,8 @@
 			}
 
 			/*
-			 * Attempt to look up the page.
-			 * Allocate if not found or
-			 * wait and loop if busy.
+			 * Attempt to look up the page.  Allocate
+			 * if not found or wait and loop if busy.
 			 */
 			pindex = OFF_TO_IDX(off);
 			pg = vm_page_grab(obj, pindex, VM_ALLOC_NOBUSY |
@@ -2161,7 +2168,7 @@
 
 		/* Add the buffer chain to the socket buffer. */
 		if (m != NULL) {
-			int mlen;
+			int mlen, err;
 
 			mlen = m_length(m, NULL);
 			SOCKBUF_LOCK(&so->so_snd);
@@ -2171,10 +2178,27 @@
 				goto done;
 			}
 			SOCKBUF_UNLOCK(&so->so_snd);
-			error = (*so->so_proto->pr_usrreqs->pru_send)
+			/* Avoid error aliasing. */
+			err = (*so->so_proto->pr_usrreqs->pru_send)
 				    (so, 0, m, NULL, NULL, td);
-			if (!error)
+			if (err == 0) {
+				/*
+				 * We need two counters to get the
+				 * file offset and nbytes to send
+				 * right:
+				 * - sbytes contains the total amount
+				 *   of bytes sent, including headers.
+				 * - fsbytes contains the total amount
+				 *   of bytes sent from the file.
+				 */
 				sbytes += mlen;
+				fsbytes += mlen;
+				if (hdrlen) {
+					fsbytes -= hdrlen;
+					hdrlen = 0;
+				}
+			} else if (error == 0)
+				error = err;
 			m = NULL;	/* pru_send always consumes */
 		}
 

==== //depot/projects/smpng/sys/sys/sx.h#29 (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/sx.h,v 1.33 2007/05/19 20:18:12 jhb Exp $
+ * $FreeBSD: src/sys/sys/sx.h,v 1.34 2007/05/19 21:26:05 jhb Exp $
  */
 
 #ifndef	_SYS_SX_H_
@@ -245,10 +245,15 @@
 #define	SX_ADAPTIVESPIN		0x10
 #define	SX_RECURSE		0x20
 
-/*
- * XXX: These options should be renamed as SA_*
- */
 #if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
+#define	SA_LOCKED		LA_LOCKED
+#define	SA_SLOCKED		LA_SLOCKED
+#define	SA_XLOCKED		LA_XLOCKED
+#define	SA_UNLOCKED		LA_UNLOCKED
+#define	SA_RECURSED		LA_RECURSED
+#define	SA_NOTRECURSED		LA_NOTRECURSED
+
+/* Backwards compatability. */
 #define	SX_LOCKED		LA_LOCKED
 #define	SX_SLOCKED		LA_SLOCKED
 #define	SX_XLOCKED		LA_XLOCKED



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