Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Feb 2017 17:48:25 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r313346 - head/sys/dev/cxgbe/tom
Message-ID:  <201702061748.v16HmPIF084479@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Mon Feb  6 17:48:25 2017
New Revision: 313346
URL: https://svnweb.freebsd.org/changeset/base/313346

Log:
  cxgbe/t4_tom: Fix CLIP entry refcounting on the passive side.  Every
  IPv6 connection being handled by the TOE should have a reference on its
  CLIP entry.
  
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/tom/t4_connect.c
  head/sys/dev/cxgbe/tom/t4_listen.c
  head/sys/dev/cxgbe/tom/t4_tom.c
  head/sys/dev/cxgbe/tom/t4_tom.h

Modified: head/sys/dev/cxgbe/tom/t4_connect.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_connect.c	Mon Feb  6 17:20:37 2017	(r313345)
+++ head/sys/dev/cxgbe/tom/t4_connect.c	Mon Feb  6 17:48:25 2017	(r313346)
@@ -402,7 +402,7 @@ t4_connect(struct toedev *tod, struct so
 		if ((inp->inp_vflag & INP_IPV6) == 0)
 			DONT_OFFLOAD_ACTIVE_OPEN(ENOTSUP);
 
-		toep->ce = hold_lip(td, &inp->in6p_laddr);
+		toep->ce = hold_lip(td, &inp->in6p_laddr, NULL);
 		if (toep->ce == NULL)
 			DONT_OFFLOAD_ACTIVE_OPEN(ENOENT);
 

Modified: head/sys/dev/cxgbe/tom/t4_listen.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_listen.c	Mon Feb  6 17:20:37 2017	(r313345)
+++ head/sys/dev/cxgbe/tom/t4_listen.c	Mon Feb  6 17:48:25 2017	(r313346)
@@ -209,7 +209,7 @@ alloc_lctx(struct adapter *sc, struct in
 	    !IN6_ARE_ADDR_EQUAL(&in6addr_any, &inp->in6p_laddr)) {
 		struct tom_data *td = sc->tom_softc;
 
-		lctx->ce = hold_lip(td, &inp->in6p_laddr);
+		lctx->ce = hold_lip(td, &inp->in6p_laddr, NULL);
 		if (lctx->ce == NULL) {
 			free(lctx, M_CXGBE);
 			return (NULL);
@@ -1584,6 +1584,8 @@ reset:
 	INP_WLOCK_ASSERT(new_inp);
 	MPASS(so->so_vnet == lctx->vnet);
 	toep->vnet = lctx->vnet;
+	if (inc.inc_flags & INC_ISIPV6)
+		toep->ce = hold_lip(sc->tom_softc, &inc.inc6_laddr, lctx->ce);
 
 	/*
 	 * This is for the unlikely case where the syncache entry that we added

Modified: head/sys/dev/cxgbe/tom/t4_tom.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_tom.c	Mon Feb  6 17:20:37 2017	(r313345)
+++ head/sys/dev/cxgbe/tom/t4_tom.c	Mon Feb  6 17:48:25 2017	(r313346)
@@ -730,12 +730,12 @@ search_lip(struct tom_data *td, struct i
 }
 
 struct clip_entry *
-hold_lip(struct tom_data *td, struct in6_addr *lip)
+hold_lip(struct tom_data *td, struct in6_addr *lip, struct clip_entry *ce)
 {
-	struct clip_entry *ce;
 
 	mtx_lock(&td->clip_table_lock);
-	ce = search_lip(td, lip);
+	if (ce == NULL)
+		ce = search_lip(td, lip);
 	if (ce != NULL)
 		ce->refcount++;
 	mtx_unlock(&td->clip_table_lock);

Modified: head/sys/dev/cxgbe/tom/t4_tom.h
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_tom.h	Mon Feb  6 17:20:37 2017	(r313345)
+++ head/sys/dev/cxgbe/tom/t4_tom.h	Mon Feb  6 17:48:25 2017	(r313346)
@@ -321,7 +321,8 @@ uint64_t calc_opt0(struct socket *, stru
 uint64_t select_ntuple(struct vi_info *, struct l2t_entry *);
 void set_tcpddp_ulp_mode(struct toepcb *);
 int negative_advice(int);
-struct clip_entry *hold_lip(struct tom_data *, struct in6_addr *);
+struct clip_entry *hold_lip(struct tom_data *, struct in6_addr *,
+    struct clip_entry *);
 void release_lip(struct tom_data *, struct clip_entry *);
 
 /* t4_connect.c */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702061748.v16HmPIF084479>