From owner-p4-projects@FreeBSD.ORG Mon Nov 26 05:33:31 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1146616A421; Mon, 26 Nov 2007 05:33:31 +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 9E8BC16A418 for ; Mon, 26 Nov 2007 05:33:30 +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 8DACD13C448 for ; Mon, 26 Nov 2007 05:33:30 +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 lAQ5XUVu090489 for ; Mon, 26 Nov 2007 05:33:30 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lAQ5XUhA090486 for perforce@freebsd.org; Mon, 26 Nov 2007 05:33:30 GMT (envelope-from kmacy@freebsd.org) Date: Mon, 26 Nov 2007 05:33:30 GMT Message-Id: <200711260533.lAQ5XUhA090486@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 129545 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: Mon, 26 Nov 2007 05:33:31 -0000 http://perforce.freebsd.org/chv.cgi?CH=129545 Change 129545 by kmacy@kmacy:storage:toestack on 2007/11/26 05:33:29 - set SB_TOE on socket buffers so as not to mess up accounting - pass toepcb to cxgb_alloc_atid so that all rpl routines expect a toepcb Affected files ... .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#26 edit Differences ... ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#26 (text+ko) ==== @@ -265,7 +265,7 @@ cdev = d->cdev; last = tail = so->so_snd.sb_sndptr ? so->so_snd.sb_sndptr : so->so_snd.sb_mb; total_bytes = 0; - DPRINTF("tail=%p snd.cc=%d tp_last=%p\n", tail, so->so_snd.sb_cc, + printf("tail=%p snd.cc=%d tp_last=%p\n", tail, so->so_snd.sb_cc, toep->tp_m_last); if (last && toep->tp_m_last == last) { @@ -273,7 +273,8 @@ last = tail = tail->m_next; } - if ((toep->tp_wr_avail == 0 ) || (tail == NULL)) { + if ((toep->tp_wr_avail == 0 ) || (tail == NULL)) { + DPRINTF("wr_avail=%d tail=%p\n", toep->tp_wr_avail, tail); SOCKBUF_UNLOCK(&so->so_snd); return (0); } @@ -298,6 +299,9 @@ */ segp->ds_addr = (bus_addr_t)tail->m_data; segp->ds_len = tail->m_len; + DPRINTF("count=%d wr_needed=%d ds_addr=%p ds_len=%d\n", + count, mbuf_wrs[count], tail->m_data, tail->m_len); + segp++; tail = tail->m_next; } @@ -308,7 +312,9 @@ toep->tp_m_last = NULL; } else toep->tp_m_last = so->so_snd.sb_sndptr = last; - + + DPRINTF("toep->tp_m_last=%p\n", toep->tp_m_last); + so->so_snd.sb_sndptroff += bytes; total_bytes += bytes; toep->tp_write_seq += bytes; @@ -812,13 +818,10 @@ static inline void free_atid(struct t3cdev *cdev, unsigned int tid) { - struct socket *so = cxgb_free_atid(cdev, tid); - if (so) { - struct tcpcb *tp = sototcpcb(so); - struct toepcb *toep = tp->t_toe; + struct toepcb *toep = cxgb_free_atid(cdev, tid); + if (toep) toepcb_release(toep); - } } /* @@ -936,21 +939,20 @@ * Assign offload parameters to some socket fields. This code is used by * both active and passive opens. */ -static inline int +static inline void init_offload_socket(struct socket *so, struct toedev *dev, unsigned int tid, - struct l2t_entry *e, struct rtentry *dst) + struct l2t_entry *e, struct rtentry *dst, struct toepcb *toep) { struct tcpcb *tp = sototcpcb(so); - struct toepcb *toep; struct t3c_data *td = T3C_DATA(TOM_DATA(dev)->cdev); - toep = toepcb_alloc(); - if (toep == NULL) - return (ENOMEM); printf("initializing offload socket\n"); + so->so_rcv.sb_flags |= SB_TOE; + so->so_snd.sb_flags |= SB_TOE; + tp->t_toe = toep; - + toep->tp_tp = tp; toep->tp_toedev = dev; toep->tp_tid = tid; @@ -968,7 +970,6 @@ reset_wr_list(tp); DPRINTF("initialization done\n"); - return (0); } /* @@ -1120,7 +1121,9 @@ do_act_open_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) { struct toepcb *toep = (struct toepcb *)ctx; - struct socket *so = toeptoso(toep); + struct socket *so; + + so = toeptoso(toep); #ifdef notyet struct cpl_act_open_rpl *rpl = cplhdr(m); @@ -1178,9 +1181,13 @@ struct rtentry *dst = inp->inp_route.ro_rt; struct toepcb *toep; /* allocated by init_offload_socket */ - int atid, err; + int atid; - if ((atid = cxgb_alloc_atid(d->cdev, d->client, so)) < 0) + toep = toepcb_alloc(); + if (toep == NULL) + goto out_err; + + if ((atid = cxgb_alloc_atid(d->cdev, d->client, toep)) < 0) goto out_err; e = t3_l2t_get(d->cdev, dst, egress_ifp); @@ -1188,21 +1195,23 @@ goto free_tid; m = m_gethdr(MT_DATA, M_WAITOK); - m_set_toep(m, tp->t_toe); #if 0 m->m_toe.mt_toepcb = tp->t_toe; set_arp_failure_handler((struct mbuf *)m, act_open_req_arp_failure); #endif - if ((err = init_offload_socket(so, tdev, atid, e, dst))) - return (err); - + init_offload_socket(so, tdev, atid, e, dst, toep); + install_offload_ops(so); + mk_act_open_req(so, m, atid, e); soisconnecting(so); + toep = tp->t_toe; + m_set_toep(m, tp->t_toe); + + DPRINTF("toep=%p toep->tp_tp=%p\n", toep, toep->tp_tp); + l2t_send(d->cdev, (struct mbuf *)m, e); - - toep = tp->t_toe; if (toep->tp_ulp_mode) t3_enable_ddp(so, 0); return (0); @@ -1432,6 +1441,19 @@ SOCKBUF_LOCK(&so->so_rcv); if (sb_notify(&so->so_rcv)) printf("rx_data so=%p flags=0x%x len=%d\n", so, so->so_rcv.sb_flags, m->m_pkthdr.len); + if (m->m_pkthdr.len == 80) { + int i; + uint64_t *data; + + data = mtod(m, uint64_t *); + printf("80 byte packet:\n"); + for (i = 0; i < 10; i++, data++) { + uint8_t *dp = (uint8_t *)data; + + printf("%02x%02x%02x%02x%02x%02x%02x%02x\n", + dp[0],dp[1],dp[2],dp[3],dp[4],dp[5],dp[6],dp[7]); + } + } sbappendstream_locked(&so->so_rcv, m); @@ -2862,6 +2884,8 @@ } tp = sototcpcb(so); + so->so_snd.sb_flags |= SB_TOE; + so->so_rcv.sb_flags |= SB_TOE; toep->tp_tp = tp; tp->t_toe = toep; reset_wr_list(tp); @@ -3017,11 +3041,11 @@ struct cpl_act_establish *req = cplhdr(m); unsigned int tid = GET_TID(req); unsigned int atid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); - struct socket *so = (struct socket *)ctx; - struct toedev *tdev = TOE_DEV(so); + struct toepcb *toep = (struct toepcb *)ctx; + struct tcpcb *tp = toep->tp_tp; + struct socket *so = toeptoso(toep); + struct toedev *tdev = TOE_DEV(so); /* blow up here if link was down */ struct tom_data *d = TOM_DATA(tdev); - struct tcpcb *tp = sototcpcb(so); - struct toepcb *toep = tp->t_toe; INP_LOCK(tp->t_inpcb); @@ -3134,7 +3158,7 @@ if (so->so_snd.sb_sndptroff < so->so_snd.sb_cc) t3_push_frames(so, 0); - + out_free: INP_UNLOCK(tp->t_inpcb); m_free(m);