Date: Mon, 10 Mar 2008 20:25:02 GMT From: Steve Wise <swise@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 137346 for review Message-ID: <200803102025.m2AKP282039206@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=137346 Change 137346 by swise@swise:vic10:iwarp on 2008/03/10 20:24:16 Process all socket upcalls on a thread. Affected files ... .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c#8 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h#3 edit Differences ... ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c#8 (text+ko) ==== @@ -158,6 +158,15 @@ static void connect_reply_upcall(struct iwch_ep *ep, int status); static void iwch_so_upcall(struct socket *so, void *arg, int waitflag); +/* + * Cruft to offload socket upcalls onto thread. + */ +static struct mtx req_lock; +static TAILQ_HEAD(iwch_ep_list, iwch_ep_common) req_list; +static struct task iw_cxgb_task; +static struct taskqueue *iw_cxgb_taskq; +static void process_req(void *ctx, int pending); + static void start_ep_timer(struct iwch_ep *ep) { @@ -265,8 +274,8 @@ void __free_ep(struct iwch_ep_common *epc) { PDBG("%s ep %p state %s\n", __FUNCTION__, epc, states[state_read(epc)]); - if (epc->so) - printf("%s warning ep->so %p \n", __FUNCTION__, epc->so); + KASSERT(!epc->so, ("%s warning ep->so %p \n", __FUNCTION__, epc->so)); + KASSERT(!epc->entry.tqe_prev, ("%s epc %p still on req list!\n", __FUNCTION__, epc)); free(epc, M_DEVBUF); } @@ -1621,7 +1630,21 @@ iwch_so_upcall(struct socket *so, void *arg, int waitflag) { struct iwch_ep *ep = arg; + + PDBG("%s so %p so state %x ep %p ep state(%d)=%s\n", __FUNCTION__, so, so->so_state, ep, ep->com.state, states[ep->com.state]); + mtx_lock(&req_lock); + if (ep && !ep->com.entry.tqe_prev) { + get_ep(&ep->com); + TAILQ_INSERT_TAIL(&req_list, &ep->com, entry); + taskqueue_enqueue(iw_cxgb_taskq, &iw_cxgb_task); + } + mtx_unlock(&req_lock); +} + +static void process_socket_event(struct iwch_ep *ep) +{ int state = state_read(&ep->com); + struct socket *so = ep->com.so; PDBG("%s so %p so state %x ep %p ep state(%d)=%s\n", __FUNCTION__, so, so->so_state, ep, ep->com.state, states[ep->com.state]); if (state == CONNECTING) { @@ -1641,7 +1664,7 @@ } /* peer close */ - if (so->so_state & SS_ISDISCONNECTING && state < CLOSING) { + if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && state < CLOSING) { process_peer_close(ep); return; } @@ -1657,9 +1680,37 @@ return; } +static void process_req(void *ctx, int pending) +{ + struct iwch_ep_common *epc; + + PDBG("%s enter\n", __FUNCTION__); + mtx_lock(&req_lock); + while (!TAILQ_EMPTY(&req_list)) { + epc = TAILQ_FIRST(&req_list); + TAILQ_REMOVE(&req_list, epc, entry); + epc->entry.tqe_prev = NULL; + mtx_unlock(&req_lock); + process_socket_event((struct iwch_ep *)epc); + put_ep(epc); + mtx_lock(&req_lock); + } + mtx_unlock(&req_lock); +} + int __init iwch_cm_init(void) { + TAILQ_INIT(&req_list); + mtx_init(&req_lock, "iw_cxgb req_list lock", NULL, MTX_DEF); + iw_cxgb_taskq = taskqueue_create("iw_cxgb_taskq", M_NOWAIT, + taskqueue_thread_enqueue, &iw_cxgb_taskq); + if (iw_cxgb_taskq == NULL) { + printf("failed to allocate iw_cxgb taskqueue\n"); + return (ENOMEM); + } + taskqueue_start_threads(&iw_cxgb_taskq, 1, PI_NET, "iw_cxgb taskq"); + TASK_INIT(&iw_cxgb_task, 0, process_req, NULL); t3tom_register_cpl_handler(CPL_RDMA_TERMINATE, terminate); t3tom_register_cpl_handler(CPL_RDMA_EC_STATUS, ec_status); return 0; @@ -1670,4 +1721,6 @@ { t3tom_register_cpl_handler(CPL_RDMA_TERMINATE, NULL); t3tom_register_cpl_handler(CPL_RDMA_EC_STATUS, NULL); + taskqueue_drain(iw_cxgb_taskq, &iw_cxgb_task); + taskqueue_free(iw_cxgb_taskq); } ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h#3 (text+ko) ==== @@ -115,6 +115,7 @@ }; struct iwch_ep_common { + TAILQ_ENTRY(iwch_ep_common) entry; struct iw_cm_id *cm_id; struct iwch_qp *qp; struct t3cdev *tdev;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803102025.m2AKP282039206>