PERFORCE change 132891 for review

Steve Wise swise at FreeBSD.org
Wed Jan 9 07:24:59 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=132891

Change 132891 by swise at 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);


More information about the p4-projects mailing list