From owner-p4-projects@FreeBSD.ORG Sat Dec 15 04:29:46 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4244F16A417; Sat, 15 Dec 2007 04:29:45 +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 AB49016A421 for ; Sat, 15 Dec 2007 04:29:44 +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 966C313C45A for ; Sat, 15 Dec 2007 04:29:44 +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 lBF4TiMZ015121 for ; Sat, 15 Dec 2007 04:29:44 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBF4TiEn015118 for perforce@freebsd.org; Sat, 15 Dec 2007 04:29:44 GMT (envelope-from kmacy@freebsd.org) Date: Sat, 15 Dec 2007 04:29:44 GMT Message-Id: <200712150429.lBF4TiEn015118@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 130940 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: Sat, 15 Dec 2007 04:29:46 -0000 http://perforce.freebsd.org/chv.cgi?CH=130940 Change 130940 by kmacy@kmacy:storage:toestack on 2007/12/15 04:29:02 add synq to listen_ctx add support for sending reset in SYN_RCVD state style fixes to inline functions Affected files ... .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#34 edit .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_defs.h#13 edit .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_listen.c#7 edit .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h#4 edit .. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_tom.h#16 edit Differences ... ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#34 (text+ko) ==== @@ -140,7 +140,7 @@ extern int tcp_autorcvbuf_max; extern int tcp_autosndbuf_max; -static void t3_send_reset(struct socket *so); +static void t3_send_reset(struct toepcb *toep); static void send_abort_rpl(struct mbuf *m, struct toedev *tdev, int rst_status); static inline void free_atid(struct t3cdev *cdev, unsigned int tid); static void handle_syncache_event(int event, void *arg); @@ -550,17 +550,15 @@ static int cxgb_toe_abort(struct tcpcb *tp) { - struct socket *so; - struct toepcb *toep; + struct toepcb *toep = tp->t_toe; + - so = tp->t_inpcb->inp_socket; - t3_send_reset(so); + t3_send_reset(toep); /* * unhook from socket */ tp->t_flags &= ~TF_TOE; - toep = tp->t_toe; toep->tp_tp = NULL; tp->t_toe = NULL; return (0); @@ -1301,24 +1299,31 @@ * an ABORT_REQ wasn't generated after all, 0 otherwise. */ static void -t3_send_reset(struct socket *so) +t3_send_reset(struct toepcb *toep) { struct cpl_abort_req *req; - struct tcpcb *tp = sototcpcb(so); - struct toepcb *toep = tp->t_toe; unsigned int tid = toep->tp_tid; int mode = CPL_ABORT_SEND_RST; + struct tcpcb *tp = toep->tp_tp; + struct toedev *tdev = toep->tp_toedev; + struct socket *so = NULL; struct mbuf *m; - INP_LOCK_ASSERT(tp->t_inpcb); - if (__predict_false((toep->tp_flags & TP_ABORT_SHUTDOWN) || !TOE_DEV(so))) + if (tp) { + INP_LOCK_ASSERT(tp->t_inpcb); + so = toeptoso(toep); + } + + if (__predict_false((toep->tp_flags & TP_ABORT_SHUTDOWN) || + tdev == NULL)) return; toep->tp_flags |= (TP_ABORT_RPL_PENDING|TP_ABORT_SHUTDOWN); /* Purge the send queue so we don't send anything after an abort. */ - sbflush(&so->so_snd); - if ((toep->tp_flags & TP_CLOSE_CON_REQUESTED) && is_t3a(TOE_DEV(so))) + if (so) + sbflush(&so->so_snd); + if ((toep->tp_flags & TP_CLOSE_CON_REQUESTED) && is_t3a(tdev)) mode |= CPL_ABORT_POST_CLOSE_REQ; m = m_gethdr_nofail(sizeof(*req)); @@ -1329,14 +1334,13 @@ req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ)); req->wr.wr_lo = htonl(V_WR_TID(tid)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, tid)); - req->rsvd0 = htonl(tp->snd_nxt); + req->rsvd0 = tp ? htonl(tp->snd_nxt) : 0; req->rsvd1 = !(toep->tp_flags & TP_DATASENT); req->cmd = mode; - INP_LOCK_ASSERT(tp->t_inpcb); - if (tp->t_state == TCPS_SYN_SENT) + if (tp && (tp->t_state == TCPS_SYN_SENT)) mbufq_tail(&toep->out_of_order_queue, m); // defer else - l2t_send(T3C_DEV(so), m, toep->tp_l2t); + l2t_send(TOEP_T3C_DEV(toep), m, toep->tp_l2t); } static int @@ -2633,7 +2637,11 @@ printf("inserting tid=%d\n", tid); cxgb_insert_tid(cdev, d->client, newtoep, tid); - + SOCK_LOCK(so); + LIST_INSERT_HEAD(&lctx->synq_head, newtoep, synq_entry); + SOCK_UNLOCK(so); + + if (lctx->ulp_mode) { ddp_mbuf = m_gethdr(M_NOWAIT, MT_DATA); @@ -2653,6 +2661,8 @@ toepcb_hold(newtoep); syncache_add_accept_req(req, so, newtoep); + + rpl = cplhdr(reply_mbuf); reply_mbuf->m_pkthdr.len = reply_mbuf->m_len = sizeof(*rpl); rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); @@ -2892,8 +2902,11 @@ so = lso = toeptoso(toep); tdev = toep->tp_toedev; + + SOCK_LOCK(so); + LIST_REMOVE(toep, synq_entry); + SOCK_UNLOCK(so); - INP_INFO_WLOCK(&tcbinfo); if (!syncache_expand_establish_req(req, &so, toep)) { /* @@ -3235,7 +3248,9 @@ static void t3_reset_listen_child(struct socket *child) { - t3_send_reset(child); + struct tcpcb *tp = sototcpcb(child); + + t3_send_reset(tp->t_toe); } /* @@ -3267,17 +3282,20 @@ */ void -t3_reset_synq(struct socket *listen_so) +t3_reset_synq(struct listen_ctx *lctx) { - struct socket *so; - struct tcpcb *tp; + struct toepcb *toep; - TAILQ_FOREACH(so, &listen_so->so_incomp, so_list) { - tp = sototcpcb(so); - - if (tp->t_flags & TF_TOE) - t3_reset_listen_child(so); + SOCK_LOCK(lctx->lso); + while (!LIST_EMPTY(&lctx->synq_head)) { + toep = LIST_FIRST(&lctx->synq_head); + LIST_REMOVE(toep, synq_entry); + toep->tp_tp = NULL; + t3_send_reset(toep); + cxgb_remove_tid(TOEP_T3C_DEV(toep), toep, toep->tp_tid); + toepcb_release(toep); } + SOCK_UNLOCK(lctx->lso); } void ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_defs.h#13 (text+ko) ==== @@ -40,6 +40,8 @@ #define toeptoso(toep) ((toep)->tp_tp->t_inpcb->inp_socket) #define sototoep(so) (sototcpcb((so))->t_toe) +struct listen_ctx; + typedef void (*defer_handler_t)(struct toedev *dev, struct mbuf *m); void t3tom_register_cpl_handler(unsigned int opcode, cxgb_cpl_handler_func h); @@ -59,7 +61,7 @@ void t3_disconnect_acceptq(struct socket *listen_so); -void t3_reset_synq(struct socket *listen_so); +void t3_reset_synq(struct listen_ctx *ctx); void t3_defer_reply(struct mbuf *m, struct toedev *dev, defer_handler_t handler); struct toepcb *toepcb_alloc(void); ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_listen.c#7 (text+ko) ==== @@ -70,7 +70,10 @@ #include #include #include +#include +#include + static struct listen_info *listen_hash_add(struct tom_data *d, struct socket *so, unsigned int stid); static int listen_hash_del(struct tom_data *d, struct socket *so); @@ -91,10 +94,7 @@ struct listen_ctx *listen_ctx = (struct listen_ctx *)ctx; cxgb_free_stid(cdev, stid); -#if 0 - sock_put(listen_ctx->lsk); -#endif - free(listen_ctx, M_DEVBUF); + free(listen_ctx, M_CXGB); } return (CPL_RET_BUF_DONE); @@ -139,7 +139,7 @@ */ sock_put(lso); #endif - free(listen_ctx, M_DEVBUF); + free(listen_ctx, M_CXGB); } return CPL_RET_BUF_DONE; } @@ -166,7 +166,7 @@ { struct listen_info *p; - p = malloc(sizeof(*p), M_DEVBUF, M_NOWAIT|M_ZERO); + p = malloc(sizeof(*p), M_CXGB, M_NOWAIT|M_ZERO); if (p) { int bucket = listen_hashfn(so); @@ -220,7 +220,7 @@ if (p->so == so) { stid = p->stid; *prev = p->next; - free(p, M_DEVBUF); + free(p, M_CXGB); break; } mtx_unlock(&d->listen_lock); @@ -246,14 +246,15 @@ printf("start listen\n"); - ctx = malloc(sizeof(*ctx), M_DEVBUF, M_NOWAIT); - + ctx = malloc(sizeof(*ctx), M_CXGB, M_NOWAIT); + if (!ctx) return; ctx->tom_data = d; ctx->lso = so; ctx->ulp_mode = 0; /* DDP if the default */ + LIST_INIT(&ctx->synq_head); stid = cxgb_alloc_stid(d->cdev, d->client, ctx); if (stid < 0) @@ -297,7 +298,7 @@ sock_put(sk); #endif free_ctx: - free(ctx, M_DEVBUF); + free(ctx, M_CXGB); } /* @@ -309,18 +310,20 @@ { struct mbuf *m; struct cpl_close_listserv_req *req; + struct listen_ctx *lctx; int stid = listen_hash_del(TOM_DATA(dev), so); if (stid < 0) return; + lctx = cxgb_get_lctx(cdev, stid); /* * Do this early so embryonic connections are marked as being aborted * while the stid is still open. This ensures pass_establish messages * that arrive while we are closing the server will be able to locate * the listening socket. */ - t3_reset_synq(so); + t3_reset_synq(lctx); /* Send the close ASAP to stop further passive opens */ m = m_gethdr(M_NOWAIT, MT_DATA); ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h#4 (text+ko) ==== @@ -35,18 +35,22 @@ struct mbuf *tp_m_last; bus_dma_tag_t tp_tx_dmat; bus_dmamap_t tp_dmamap; - + + LIST_ENTRY(toepcb) synq_entry; struct mbuf_head wr_list; struct mbuf_head out_of_order_queue; struct ddp_state tp_ddp_state; }; -static inline void reset_wr_list(struct toepcb *toep) +static inline void +reset_wr_list(struct toepcb *toep) { + mbufq_init(&toep->wr_list); } -static inline void purge_wr_queue(struct toepcb *toep) +static inline void +purge_wr_queue(struct toepcb *toep) { struct mbuf *m; @@ -54,20 +58,25 @@ m_freem(m); } -static inline void enqueue_wr(struct toepcb *toep, struct mbuf *m) +static inline void +enqueue_wr(struct toepcb *toep, struct mbuf *m) { + mbufq_tail(&toep->wr_list, m); } +static inline struct mbuf * +peek_wr(struct toepcb *toep) +{ -static inline struct mbuf *peek_wr(struct toepcb *toep) -{ - return mbufq_peek(&toep->wr_list); + return (mbufq_peek(&toep->wr_list)); } -static inline struct mbuf *dequeue_wr(struct toepcb *toep) +static inline struct mbuf * +dequeue_wr(struct toepcb *toep) { - return mbufq_dequeue(&toep->wr_list); + + return (mbufq_dequeue(&toep->wr_list)); } #endif ==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_tom.h#16 (text+ko) ==== @@ -108,8 +108,6 @@ struct mtx ppod_map_lock; struct adap_ports *ports; - - struct taskqueue *tq; }; @@ -118,6 +116,8 @@ struct socket *lso; struct tom_data *tom_data; int ulp_mode; + LIST_HEAD(, toepcb) synq_head; + }; #define TOM_DATA(dev) (*(struct tom_data **)&(dev)->tod_l4opt)