From owner-p4-projects@FreeBSD.ORG Fri Mar 7 05:07:28 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1DEF31065674; Fri, 7 Mar 2008 05:07:28 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D231E1065676 for ; Fri, 7 Mar 2008 05:07:27 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id C16C88FC25 for ; Fri, 7 Mar 2008 05:07:27 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m2757Rff096068 for ; Fri, 7 Mar 2008 05:07:27 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m2757Rc2096066 for perforce@freebsd.org; Fri, 7 Mar 2008 05:07:27 GMT (envelope-from kmacy@freebsd.org) Date: Fri, 7 Mar 2008 05:07:27 GMT Message-Id: <200803070507.m2757Rc2096066@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 137051 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Mar 2008 05:07:28 -0000 http://perforce.freebsd.org/chv.cgi?CH=137051 Change 137051 by kmacy@kmacy:entropy:iwarp on 2008/03/07 05:07:04 fix race between shutting down offload and ddp pending Affected files ... .. //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#20 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#16 edit Differences ... ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#20 (text+ko) ==== @@ -1064,6 +1064,7 @@ struct tcpcb *tp = toep->tp_tp; struct toedev *tdev = toep->tp_toedev; struct t3cdev *cdev; + struct socket *so; unsigned int tid = toep->tp_tid; if (!tdev) @@ -1093,8 +1094,21 @@ toep->tp_tp = NULL; if (tp) { INP_LOCK_ASSERT(tp->t_inpcb); + so = tp->t_inpcb->inp_socket; + + /* + * cancel any offloaded reads + * + */ + SOCKBUF_LOCK(&so->so_rcv); tp->t_toe = NULL; tp->t_flags &= ~TF_TOE; + if (toep->tp_ddp_state.user_ddp_pending) { + t3_cancel_ubuf(toep); + toep->tp_ddp_state.user_ddp_pending = 0; + } + sorwakeup_locked(so); + } if (toep->tp_state == TCPS_SYN_SENT) { ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c#16 (text+ko) ==== @@ -578,22 +578,29 @@ return (err); SOCKBUF_LOCK(&so->so_rcv); + if ((tp->t_flags & TF_TOE) == 0) { + SOCKBUF_UNLOCK(&so->so_rcv); + err = EAGAIN; + goto done_unlocked; + } + p->user_ddp_pending = 0; restart: + if ((tp->t_flags & TF_TOE) == 0) { + SOCKBUF_UNLOCK(&so->so_rcv); + err = EAGAIN; + goto done_unlocked; + } + len = uio->uio_resid; m = so->so_rcv.sb_mb; target = (flags & MSG_WAITALL) ? len : so->so_rcv.sb_lowat; user_ddp_ok = p->ubuf_ddp_ready; p->cancel_ubuf = 0; - + if (len == 0) goto done; -#if 0 - while (m && m->m_len == 0) { - so->so_rcv.sb_mb = m_free(m); - m = so->so_rcv.sb_mb; - } -#endif + if (m) goto got_mbuf; @@ -774,6 +781,12 @@ if (avail != (resid - uio->uio_resid)) printf("didn't copy all bytes :-/ avail=%d offset=%d pktlen=%d resid=%d uio_resid=%d copied=%d copied_unacked=%d is_ddp(m)=%d\n", avail, offset, m->m_pkthdr.len, resid, uio->uio_resid, copied, copied_unacked, is_ddp(m)); + + if ((tp->t_flags & TF_TOE) == 0) { + SOCKBUF_UNLOCK(&so->so_rcv); + err = EAGAIN; + goto done_unlocked; + } } copied += avail; @@ -839,6 +852,11 @@ goto restart; done: + if ((tp->t_flags & TF_TOE) == 0) { + SOCKBUF_UNLOCK(&so->so_rcv); + err = EAGAIN; + goto done_unlocked; + } /* * If we can still receive decide what to do in preparation for the * next receive. Note that RCV_SHUTDOWN is set if the connection @@ -846,8 +864,6 @@ */ if (__predict_true((so->so_state & (SS_ISDISCONNECTING|SS_ISDISCONNECTED)) == 0)) { if (p->user_ddp_pending) { - SOCKBUF_UNLOCK(&so->so_rcv); - SOCKBUF_LOCK(&so->so_rcv); user_ddp_ok = 0; t3_cancel_ubuf(toep); if (so->so_rcv.sb_mb) { @@ -882,7 +898,7 @@ #endif SOCKBUF_UNLOCK(&so->so_rcv); done_unlocked: - if (copied_unacked) { + if (copied_unacked && (tp->t_flags & TF_TOE)) { INP_LOCK(inp); t3_cleanup_rbuf(tp, copied_unacked); INP_UNLOCK(inp); @@ -915,7 +931,6 @@ * - iovcnt is 1 * */ - if ((tp->t_flags & TF_TOE) && uio && ((flags & (MSG_WAITALL|MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0) && (uio->uio_iovcnt == 1) && (mp0 == NULL)) { tdev = TOE_DEV(so); @@ -924,6 +939,8 @@ if ((uio->uio_resid > zcopy_thres) && (uio->uio_iovcnt == 1) && zcopy_enabled) { + CTR3(KTR_CXGB, "cxgb_soreceive: t_flags=0x%x flags=0x%x uio_resid=%d", + tp->t_flags, flags, uio->uio_resid); rv = t3_soreceive(so, flagsp, uio); if (rv != EAGAIN) return (rv);