PERFORCE change 134363 for review
Kip Macy
kmacy at FreeBSD.org
Tue Jan 29 00:29:56 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134363
Change 134363 by kmacy at kmacy:storage:toehead on 2008/01/29 08:28:52
enable timestamps
disable socket buffer usage assert
don't coalesce on RX for now
s/Linux/FreeBSD/
fix lock ordering issue in connection shutdown
fix offset accounting for copied_seq in t3_soreceive
fix SOCKBUF locking in t3_soreceive
enable DDP for nonblocking case for now for testing purposes
add some annoying debug info to cxgb_soreceive
Affected files ...
.. //depot/projects/toehead/sys/dev/cxgb/common/cxgb_t3_hw.c#2 edit
.. //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#10 edit
.. //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#11 edit
Differences ...
==== //depot/projects/toehead/sys/dev/cxgb/common/cxgb_t3_hw.c#2 (text+ko) ====
@@ -2503,7 +2503,7 @@
F_TCPCHECKSUMOFFLOAD | V_IPTTL(64));
t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) |
F_MTUENABLE | V_WINDOWSCALEMODE(1) |
- V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1));
+ V_TIMESTAMPSMODE(1) | V_SACKMODE(1) | V_SACKRX(1));
t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) |
V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) |
==== //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#10 (text+ko) ====
@@ -1099,7 +1099,8 @@
* or we need to add this
*/
so->so_snd.sb_flags |= SB_NOCOALESCE;
-
+ so->so_rcv.sb_flags |= SB_NOCOALESCE;
+
tp->t_toe = toep;
toep->tp_tp = tp;
toep->tp_toedev = dev;
@@ -1193,7 +1194,7 @@
req = mtod(m, struct cpl_act_open_req *);
m->m_pkthdr.len = m->m_len = sizeof(*req);
-
+
req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, atid));
req->local_port = inp->inp_lport;
@@ -1890,10 +1891,17 @@
DPRINTF("rx_data so=%p flags=0x%x len=%d\n", so, so->so_rcv.sb_flags, m->m_pkthdr.len);
sbappend_locked(&so->so_rcv, m);
+
+#ifdef notyet
+ /*
+ * We're giving too many credits to the card - but disable this check so we can keep on moving :-|
+ *
+ */
KASSERT(so->so_rcv.sb_cc < (so->so_rcv.sb_mbmax << 1),
("so=%p, data contents exceed mbmax, sb_cc=%d sb_mbmax=%d",
so, so->so_rcv.sb_cc, so->so_rcv.sb_mbmax));
+#endif
INP_UNLOCK(tp->t_inpcb);
DPRINTF("sb_cc=%d sb_mbcnt=%d\n",
@@ -2389,6 +2397,8 @@
"process_abort_rpl: GTS rpl pending %d",
sock_flag(sk, ABORT_RPL_PENDING));
#endif
+
+ INP_INFO_WLOCK(&tcbinfo);
INP_LOCK(tp->t_inpcb);
if (toep->tp_flags & TP_ABORT_RPL_PENDING) {
@@ -2403,16 +2413,14 @@
!is_t3a(TOE_DEV(so))) {
if (toep->tp_flags & TP_ABORT_REQ_RCVD)
panic("TP_ABORT_REQ_RCVD set");
- INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(tp->t_inpcb);
t3_release_offload_resources(toep);
tp = tcp_close(tp);
- INP_INFO_WUNLOCK(&tcbinfo);
}
}
}
if (tp)
INP_UNLOCK(tp->t_inpcb);
+ INP_INFO_WUNLOCK(&tcbinfo);
m_free(m);
}
@@ -2472,7 +2480,7 @@
}
/*
- * Convert the status code of an ABORT_REQ into a Linux error code. Also
+ * Convert the status code of an ABORT_REQ into a FreeBSD error code. Also
* indicate whether RST should be sent in response.
*/
static int
@@ -2894,7 +2902,8 @@
struct tcphdr th;
struct inpcb *inp;
int mss, wsf, sack, ts;
-
+ uint32_t rcv_isn = ntohl(req->rcv_isn);
+
bzero(&to, sizeof(struct tcpopt));
inp = sotoinpcb(lso);
@@ -2903,10 +2912,10 @@
*/
inc.inc_fport = th.th_sport = req->peer_port;
inc.inc_lport = th.th_dport = req->local_port;
- toep->tp_iss = th.th_seq = req->rcv_isn;
+ th.th_seq = req->rcv_isn;
th.th_flags = TH_SYN;
- toep->tp_delack_seq = toep->tp_rcv_wup = toep->tp_copied_seq = ntohl(req->rcv_isn);
+ toep->tp_iss = toep->tp_delack_seq = toep->tp_rcv_wup = toep->tp_copied_seq = rcv_isn;
inc.inc_isipv6 = 0;
inc.inc_len = 0;
@@ -3171,7 +3180,7 @@
/*
* Called when a connection is established to translate the TCP options
- * reported by HW to Linux's native format.
+ * reported by HW to FreeBSD's native format.
*/
static void
assign_rxopt(struct socket *so, unsigned int opt)
==== //depot/projects/toehead/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#11 (text+ko) ====
@@ -527,8 +527,8 @@
if (err)
return (err);
TRACE_ENTER;
+ SOCKBUF_LOCK(&so->so_rcv);
restart:
- SOCKBUF_LOCK(&so->so_rcv);
len = uio->uio_resid;
m = so->so_rcv.sb_mb;
target = (flags & MSG_WAITALL) ? min(len, so->so_rcv.sb_hiwat) : so->so_rcv.sb_lowat;
@@ -571,6 +571,7 @@
INP_LOCK(inp);
t3_cleanup_rbuf(tp);
INP_UNLOCK(inp);
+ SOCKBUF_LOCK(&so->so_rcv);
goto restart;
}
if (p->ubuf && user_ddp_ok && !user_ddp_pending &&
@@ -597,6 +598,7 @@
INP_LOCK(inp);
t3_cleanup_rbuf(tp);
INP_UNLOCK(inp);
+ SOCKBUF_LOCK(&so->so_rcv);
if ((err = sbwait(&so->so_rcv)) != 0)
goto done;
}
@@ -610,10 +612,10 @@
m = so->so_rcv.sb_mb = m_free(m);
goto done;
}
- offset = toep->tp_copied_seq - m->m_seq;
- if (offset > m->m_pkthdr.len)
- panic("t3_soreceive: BUG: OFFSET > LEN seq 0x%x "
- "pktlen %d ddp flags 0x%x", m->m_seq,
+ offset = toep->tp_copied_seq - m->m_seq + 1 /* OFF by one somewhere :-{ */;
+ if (offset >= m->m_pkthdr.len)
+ panic("t3_soreceive: BUG: OFFSET > LEN offset %d copied_seq 0x%x seq 0x%x "
+ "pktlen %d ddp flags 0x%x", offset, toep->tp_copied_seq, m->m_seq,
m->m_pkthdr.len, m->m_ddp_flags);
avail = m->m_pkthdr.len - offset;
if (len < avail) {
@@ -786,21 +788,29 @@
*
*/
if ((tp->t_flags & TF_TOE) && ((flags & (MSG_WAITALL|MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0)
- && ((so->so_state & SS_NBIO) == 0) && (uio->uio_iovcnt == 1) &&
+#ifdef notyet
+ && ((so->so_state & SS_NBIO) == 0)
+#endif
+ && (uio->uio_iovcnt == 1) &&
((so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) && (mp0 == NULL)) {
tdev = TOE_DEV(so);
zcopy_thres = TOM_TUNABLE(tdev, ddp_thres);
zcopy_enabled = TOM_TUNABLE(tdev, ddp);
+
if ((uio->uio_resid > zcopy_thres) &&
- (uio->uio_iovcnt == 1) && ((so->so_state & SS_NBIO) == 0)
+ (uio->uio_iovcnt == 1)
+#if 0
+ && ((so->so_state & SS_NBIO) == 0)
+#endif
&& zcopy_enabled) {
- printf("uio_resid=%d zcopy_thres=%d\n",
- uio->uio_resid, zcopy_thres);
rv = t3_soreceive(so, flagsp, uio);
if (rv != EAGAIN)
return (rv);
}
}
+ if (uio->uio_resid > PAGE_SIZE)
+ printf("flags=0x%x nonblocking=0x%x iovcnt=%d mp0=%p uio_resid=%d \n",
+ flags, !!(so->so_state && SS_NBIO), uio->uio_iovcnt, mp0, uio->uio_resid);
return pru_soreceive(so, psa, uio, mp0, controlp, flagsp);
}
More information about the p4-projects
mailing list