Date: Tue, 29 Jan 2008 08:29:53 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 134363 for review Message-ID: <200801290829.m0T8Trrm011072@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=134363 Change 134363 by kmacy@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801290829.m0T8Trrm011072>