diff options
author | np <np@FreeBSD.org> | 2017-05-24 20:01:12 +0000 |
---|---|---|
committer | np <np@FreeBSD.org> | 2017-05-24 20:01:12 +0000 |
commit | 57e53a32646e904907565fea13cac665f4065393 (patch) | |
tree | 422db354f5c2dec046376b49bc25d72b2da97869 | |
parent | 86b56495c042a50c8d5e7d6fbfbc565f0e09617e (diff) | |
download | FreeBSD-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.c | 2 | ||||
-rw-r--r-- | sys/dev/cxgbe/tom/t4_listen.c | 4 | ||||
-rw-r--r-- | sys/dev/cxgbe/tom/t4_tom.c | 6 | ||||
-rw-r--r-- | sys/dev/cxgbe/tom/t4_tom.h | 3 |
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 */ |