PERFORCE change 134955 for review
Kip Macy
kmacy at FreeBSD.org
Wed Feb 6 20:37:57 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134955
Change 134955 by kmacy at 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);
}
More information about the p4-projects
mailing list