summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornp <np@FreeBSD.org>2017-05-24 20:01:12 +0000
committernp <np@FreeBSD.org>2017-05-24 20:01:12 +0000
commit57e53a32646e904907565fea13cac665f4065393 (patch)
tree422db354f5c2dec046376b49bc25d72b2da97869
parent86b56495c042a50c8d5e7d6fbfbc565f0e09617e (diff)
downloadFreeBSD-src-57e53a32646e904907565fea13cac665f4065393.zip
FreeBSD-src-57e53a32646e904907565fea13cac665f4065393.tar.gz
MFC r313346:
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
-rw-r--r--sys/dev/cxgbe/tom/t4_connect.c2
-rw-r--r--sys/dev/cxgbe/tom/t4_listen.c4
-rw-r--r--sys/dev/cxgbe/tom/t4_tom.c6
-rw-r--r--sys/dev/cxgbe/tom/t4_tom.h3
4 files changed, 9 insertions, 6 deletions
diff --git a/sys/dev/cxgbe/tom/t4_connect.c b/sys/dev/cxgbe/tom/t4_connect.c
index 02f01ef..d716df7 100644
--- a/sys/dev/cxgbe/tom/t4_connect.c
+++ b/sys/dev/cxgbe/tom/t4_connect.c
@@ -402,7 +402,7 @@ t4_connect(struct toedev *tod, struct socket *so, struct rtentry *rt,
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);
diff --git a/sys/dev/cxgbe/tom/t4_listen.c b/sys/dev/cxgbe/tom/t4_listen.c
index 844168d..707d405 100644
--- a/sys/dev/cxgbe/tom/t4_listen.c
+++ b/sys/dev/cxgbe/tom/t4_listen.c
@@ -207,7 +207,7 @@ alloc_lctx(struct adapter *sc, struct inpcb *inp, struct vi_info *vi)
!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);
@@ -1639,6 +1639,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
diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c
index 4c58cf9..a52dabc 100644
--- a/sys/dev/cxgbe/tom/t4_tom.c
+++ b/sys/dev/cxgbe/tom/t4_tom.c
@@ -745,12 +745,12 @@ search_lip(struct tom_data *td, struct in6_addr *lip)
}
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);
diff --git a/sys/dev/cxgbe/tom/t4_tom.h b/sys/dev/cxgbe/tom/t4_tom.h
index f5ca0cf..401ea0d 100644
--- a/sys/dev/cxgbe/tom/t4_tom.h
+++ b/sys/dev/cxgbe/tom/t4_tom.h
@@ -293,7 +293,8 @@ uint64_t calc_opt0(struct socket *, struct vi_info *, struct l2t_entry *,
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 */
OpenPOWER on IntegriCloud