Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Feb 2008 04:37:56 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 134955 for review
Message-ID:  <200802070437.m174butB002833@repoman.freebsd.org>

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

Change 134955 by kmacy@kmacy:storage:toehead on 2008/02/07 04:37:44

	improve some of the cxgb_soreceive checks
	reduce debug noise

Affected files ...

.. //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#16 edit

Differences ...

==== //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#16 (text+ko) ====

@@ -28,7 +28,7 @@
 ***************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c,v 1.3 2007/12/18 23:00:25 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c,v 1.4 2008/02/01 19:36:23 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -377,7 +377,8 @@
 	m0->m_flags = (M_EXT|M_NOFREE);
 	m0->m_ext.ext_type = EXT_EXTREF;
 	m0->m_ext.ext_free = cxgb_zero_copy_free;
-	m0->m_ext.ext_args = NULL;
+	m0->m_ext.ext_arg1 = NULL;	/* XXX: probably wrong /phk */
+	m0->m_ext.ext_arg2 = NULL;
     
 	mv = mtomv(m0);
 	mv->mv_count = seg_count;
@@ -535,7 +536,6 @@
  * sb->sb_mb->m_nextpkt which must be restored when the lead mbuf changes.
  * NOTE: 'nextrecord' may be NULL.
  */
-#if 1
 static __inline void
 sockbuf_pushsync(struct sockbuf *sb, struct mbuf *nextrecord)
 {
@@ -562,10 +562,10 @@
         } else if (sb->sb_mb->m_nextpkt == NULL)
                 sb->sb_lastrecord = sb->sb_mb;
 }
-#endif
 
 #define IS_NONBLOCKING(so)	((so)->so_state & SS_NBIO)
 
+
 static int
 t3_soreceive(struct socket *so, int *flagsp, struct uio *uio)
 {
@@ -596,9 +596,10 @@
 	user_ddp_ok = p->ubuf_ddp_ready;
 	p->cancel_ubuf = 0;
 
-	/*
-	 * XXX check urgent
-	 */
+	while (m && m->m_len == 0) {
+		so->so_rcv.sb_mb = m_free(m);
+		m = so->so_rcv.sb_mb;
+	}
 	if (m) 
 		goto got_mbuf;
 
@@ -656,15 +657,17 @@
 		/* One shot at DDP if we already have enough data */
 		if (copied >= target)
 			user_ddp_ok = 0;
-		printf("sbwaiting 1\n");
+
+		DPRINTF("sbwaiting 1\n");
 		if ((err = sbwait(&so->so_rcv)) != 0)
 			goto done;
 //for timers to work			await_ddp_completion(sk, flags, &timeo);
 	} else if (copied >= target)
 		goto done;
 	else {
-		int i = 0;
 		if (copied_unacked) {
+			int i = 0;
+
 			SOCKBUF_UNLOCK(&so->so_rcv);
 			INP_LOCK(inp);
 			t3_cleanup_rbuf(tp, copied_unacked);
@@ -678,13 +681,16 @@
 		
 		if (so->so_rcv.sb_mb)
 			goto restart;
-		printf("sbwaiting 2 copied=%d target=%d avail=%d so=%p mb=%p cc=%d\n", copied, target, avail, so,
+		DPRINTF("sbwaiting 2 copied=%d target=%d avail=%d so=%p mb=%p cc=%d\n", copied, target, avail, so,
 		    so->so_rcv.sb_mb, so->so_rcv.sb_cc);
 		if ((err = sbwait(&so->so_rcv)) != 0)
 			goto done;
 	}
      	goto restart;
 got_mbuf:
+	KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || !(m->m_flags & M_EXT), ("unexpected type M_EXT=%d ext_type=%d m_len=%d m_pktlen=%d\n", !!(m->m_flags & M_EXT), m->m_ext.ext_type, m->m_len, m->m_pkthdr.len));
+	KASSERT(m->m_next != (struct mbuf *)0xffffffff, ("bad next value m_next=%p m_nextpkt=%p m_flags=0x%x m->m_len=%d",
+		m->m_next, m->m_nextpkt, m->m_flags, m->m_len));
 	if (m->m_pkthdr.len == 0) {
 		if ((m->m_ddp_flags & DDP_BF_NOCOPY) == 0)
 			panic("empty mbuf and NOCOPY not set\n");
@@ -789,9 +795,10 @@
 	 */
 	if (avail + offset >= m->m_pkthdr.len) {
 		unsigned int fl = m->m_ddp_flags;
-		int exitnow, count, got_psh = 0, nomoredata = 0;
+		int exitnow, got_psh = 0, nomoredata = 0;
+		int count;
 		struct mbuf *nextrecord;
-		
+
 		if (p->kbuf[0] != NULL && is_ddp(m) && (fl & 1)) {
 			if (is_ddp_psh(m) && user_ddp_pending)
 				got_psh = 1;
@@ -809,15 +816,17 @@
 
 		nextrecord = m->m_nextpkt;
 		count = m->m_pkthdr.len;
-		while (count) {
+		while (count > 0) {
 			count -= m->m_len;
+			KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || !(m->m_flags & M_EXT), ("unexpected type M_EXT=%d ext_type=%d m_len=%d\n", !!(m->m_flags & M_EXT), m->m_ext.ext_type, m->m_len));
 			sbfree(&so->so_rcv, m);
 			so->so_rcv.sb_mb = m_free(m);
-			m = so->so_rcv.sb_mb;	
+			m = so->so_rcv.sb_mb;
 		}
 		sockbuf_pushsync(&so->so_rcv, nextrecord);
-		
-
+#if 0
+		sbdrop_locked(&so->so_rcv, m->m_pkthdr.len);
+#endif		
 		exitnow = got_psh || nomoredata;
 		if  ((so->so_rcv.sb_mb == NULL) && exitnow) {
 			printf("exiting\n");
@@ -916,8 +925,7 @@
 	 */
 	
 	if ((tp->t_flags & TF_TOE) && ((flags & (MSG_WAITALL|MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0)
-	    && (uio->uio_iovcnt == 1) &&
-	    ((so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) && (mp0 == NULL)) {
+	    && (uio->uio_iovcnt == 1) && (mp0 == NULL)) {
 		tdev =  TOE_DEV(so);
 		zcopy_thres = TOM_TUNABLE(tdev, ddp_thres);
 		zcopy_enabled = TOM_TUNABLE(tdev, ddp);
@@ -927,9 +935,12 @@
 			rv = t3_soreceive(so, flagsp, uio);
 			if (rv != EAGAIN)
 				return (rv);
+			else
+				printf("returned EAGAIN\n");
 		} 
 	} else if (tp->t_flags & TF_TOE)
-		printf("skipping t3_soreceive\n");
+		printf("skipping t3_soreceive flags=0x%x iovcnt=%d mp0=%p sb_state=0x%x\n",
+		    flags, uio->uio_iovcnt, mp0, so->so_rcv.sb_state);
 	return pru_soreceive(so, psa, uio, mp0, controlp, flagsp);
 }
 



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