From owner-p4-projects@FreeBSD.ORG Wed Jan 9 15:24:59 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 05B3A16A418; Wed, 9 Jan 2008 15:24:59 +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 BEAF716A473 for ; Wed, 9 Jan 2008 15:24:58 +0000 (UTC) (envelope-from swise@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id AC49E13C44B for ; Wed, 9 Jan 2008 15:24:58 +0000 (UTC) (envelope-from swise@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 m09FOwxe048731 for ; Wed, 9 Jan 2008 15:24:58 GMT (envelope-from swise@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m09FOwKG048728 for perforce@freebsd.org; Wed, 9 Jan 2008 15:24:58 GMT (envelope-from swise@FreeBSD.org) Date: Wed, 9 Jan 2008 15:24:58 GMT Message-Id: <200801091524.m09FOwKG048728@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to swise@FreeBSD.org using -f From: Steve Wise To: Perforce Change Reviews Cc: Subject: PERFORCE change 132891 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: Wed, 09 Jan 2008 15:24:59 -0000 http://perforce.freebsd.org/chv.cgi?CH=132891 Change 132891 by swise@swise:vic10:iwarp on 2008/01/09 15:24:37 krping works from client side - address resolution rtalloc issues - address resolution tailq bug - cxgb_offload.c arp event fixes - send_mpa_req() fixes Affected files ... .. //depot/projects/iwarp/sys/contrib/rdma/rdma_addr.c#6 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#5 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#10 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#7 edit Differences ... ==== //depot/projects/iwarp/sys/contrib/rdma/rdma_addr.c#6 (text+ko) ==== @@ -148,27 +148,31 @@ return (EADDRNOTAVAIL); ret = rdma_copy_addr(dev_addr, iproute.ro_rt->rt_ifp, NULL); - rtfree(iproute.ro_rt); + RTFREE(iproute.ro_rt); return ret; } EXPORT_SYMBOL(rdma_translate_ip); static void queue_req(struct addr_req *req) { - struct addr_req *tmp_req; + struct addr_req *tmp_req = NULL; mtx_lock(&lock); TAILQ_FOREACH_REVERSE(tmp_req, &req_list, addr_req_list, entry) if (time_after_eq(req->timeout, tmp_req->timeout)) break; - TAILQ_INSERT_AFTER(&req_list, tmp_req, req, entry); + if (tmp_req) + TAILQ_INSERT_AFTER(&req_list, tmp_req, req, entry); + else + TAILQ_INSERT_TAIL(&req_list, req, entry); if (TAILQ_FIRST(&req_list) == req) callout_reset(&addr_ch, req->timeout - ticks, addr_timeout, NULL); mtx_unlock(&lock); } +#ifdef needed static void addr_send_arp(struct sockaddr_in *dst_in) { struct route iproute; @@ -185,8 +189,9 @@ arpresolve(iproute.ro_rt->rt_ifp, iproute.ro_rt, NULL, rt_key(iproute.ro_rt), dmac); - rtfree(iproute.ro_rt); + RTFREE(iproute.ro_rt); } +#endif static int addr_resolve_remote(struct sockaddr_in *src_in, struct sockaddr_in *dst_in, @@ -201,8 +206,10 @@ *dst = *dst_in; rtalloc(&iproute); - if (iproute.ro_rt == NULL); + if (iproute.ro_rt == NULL) { + ret = EHOSTUNREACH; goto out; + } /* If the device does ARP internally, return 'done' */ if (iproute.ro_rt->rt_ifp->if_flags & IFF_NOARP) { @@ -223,7 +230,7 @@ ret = rdma_copy_addr(addr, iproute.ro_rt->rt_ifp, dmac); put: - rtfree(iproute.ro_rt); + RTFREE(iproute.ro_rt); out: return ret; } @@ -308,7 +315,9 @@ case EWOULDBLOCK: req->timeout = msecs_to_ticks(timeout_ms) + ticks; queue_req(req); +#ifdef needed addr_send_arp(dst_in); +#endif break; default: ret = req->status; ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#5 (text+ko) ==== @@ -170,6 +170,7 @@ { struct rtentry *rt = e->neigh; struct sockaddr_in sin; + int err; bzero(&sin, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; @@ -209,7 +210,8 @@ * entries when there's no memory. */ printf("doing arpresolve2 on 0x%x \n", e->addr); - if (arpresolve2(rt->rt_ifp, rt, (struct sockaddr *)&sin, e->dmac) == 0) { + err = arpresolve2(rt->rt_ifp, rt, (struct sockaddr *)&sin, e->dmac); + if (!err) { printf("mac=%x:%x:%x:%x:%x:%x\n", e->dmac[0], e->dmac[1], e->dmac[2], e->dmac[3], e->dmac[4], e->dmac[5]); @@ -223,7 +225,7 @@ m_freem(m); mtx_unlock(&e->lock); } else - printf("arpresolve2 returned non-zero\n"); + printf("arpresolve2 returned %d\n", err); } return 0; } ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#10 (text+ko) ==== @@ -911,7 +911,7 @@ uint8_t *enaddr, struct sockaddr *sa) { - if (TOEDEV(rt0->rt_ifp) == NULL) + if (!is_offloading(rt0->rt_ifp)) return; RT_ADDREF(rt0); @@ -926,15 +926,22 @@ cxgb_redirect_event(void *unused, int event, struct rtentry *rt0, struct rtentry *rt1, struct sockaddr *sa) { - struct toedev *tdev0, *tdev1; /* * ignore events on non-offloaded interfaces */ - tdev0 = TOEDEV(rt0->rt_ifp); - tdev1 = TOEDEV(rt1->rt_ifp); - if (tdev0 == NULL && tdev1 == NULL) + if (!is_offloading(rt0->rt_ifp)) + return; + + /* + * Cannot redirect to non-offload device. + */ + if (!is_offloading(rt1->rt_ifp)) { + log(LOG_WARNING, "%s: Redirect to non-offload" + "device ignored.\n", __FUNCTION__); return; + } + /* * avoid LORs by dropping the route lock but keeping a reference * @@ -1059,13 +1066,9 @@ void cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa) { - - if (is_offloading(rt->rt_ifp)) { - struct t3cdev *tdev = T3CDEV(rt->rt_ifp); - - PANIC_IF(!tdev); - t3_l2t_update(tdev, rt, enaddr, sa); - } + struct t3cdev *tdev = T3CDEV(rt->rt_ifp); + PANIC_IF(!tdev); + t3_l2t_update(tdev, rt, enaddr, sa); } static void @@ -1107,13 +1110,6 @@ olddev = old->rt_ifp; newdev = new->rt_ifp; - if (!is_offloading(olddev)) - return; - if (!is_offloading(newdev)) { - log(LOG_WARNING, "%s: Redirect to non-offload" - "device ignored.\n", __FUNCTION__); - return; - } tdev = T3CDEV(olddev); PANIC_IF(!tdev); if (tdev != T3CDEV(newdev)) { ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#7 (text+ko) ==== @@ -356,22 +356,28 @@ } } +static void +reset_mbuf(struct mbuf *m) +{ + m_set_sgl(m, NULL); + m_set_sgllen(m, 0); + m->m_len = 0; + m->m_pkthdr.len = 0; +} + /* * Try and reuse mbufs already allocated... */ static struct mbuf * get_mbuf(struct mbuf *m, int len, int flags) { - if (m && ((m->m_flags & M_EXT) == 0)) { - m->m_len = 0; - } else { + if (!m || (m->m_flags & M_EXT)) { /* * Assume len is less than MINCLBYTES :-/ */ m = m_gethdr(MT_DATA, M_DONTWAIT); } - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); + reset_mbuf(m); return (m); } @@ -530,7 +536,6 @@ int mpalen; struct tx_data_wr *req; struct mpa_message *mpa; - int len; PDBG("%s ep %p pd_len %d\n", __FUNCTION__, ep, ep->plen); @@ -547,10 +552,10 @@ return; } } + reset_mbuf(m); m_set_priority(m, CPL_PRIORITY_DATA); req = (struct tx_data_wr *)mbuf_put(m, sizeof(*req)); - len = m->m_len; - mpa = (struct mpa_message *) mbuf_put(m, mpalen); + mpa = (struct mpa_message *)mbuf_put(m, mpalen); memset(mpa, 0, sizeof(*mpa)); memcpy(mpa->key, MPA_KEY_REQ, sizeof(mpa->key)); mpa->flags = (crc_enabled ? MPA_CRC : 0) | @@ -569,7 +574,7 @@ set_arp_failure_handler(m, arp_failure_discard); req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA)); req->wr_lo = htonl(V_WR_TID(ep->hwtid)); - req->len = htonl(len); + req->len = htonl(mpalen); req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | V_TX_SNDBUF(snd_win>>15)); req->flags = htonl(F_TX_INIT);