Page MenuHomeFreeBSD

D45991.diff
No OneTemporary

D45991.diff

diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c
--- a/sys/dev/cxgbe/tom/t4_tom.c
+++ b/sys/dev/cxgbe/tom/t4_tom.c
@@ -97,6 +97,7 @@
};
static void release_offload_resources(struct toepcb *);
+static void done_with_toepcb(struct toepcb *);
static int alloc_tid_tabs(struct tid_info *);
static void free_tid_tabs(struct tid_info *);
static void free_tom_data(struct adapter *, struct tom_data *);
@@ -311,12 +312,42 @@
KASSERT(!(toep->flags & TPF_CPL_PENDING),
("%s: %p has CPL pending.", __func__, toep));
- KASSERT(!(toep->flags & TPF_ATTACHED),
- ("%s: %p is still attached.", __func__, toep));
CTR5(KTR_CXGBE, "%s: toep %p (tid %d, l2te %p, ce %p)",
__func__, toep, tid, toep->l2te, toep->ce);
+ if (toep->l2te) {
+ t4_l2t_release(toep->l2te);
+ toep->l2te = NULL;
+ }
+ if (tid >= 0) {
+ remove_tid(sc, tid, toep->ce ? 2 : 1);
+ release_tid(sc, tid, toep->ctrlq);
+ toep->tid = -1;
+ }
+ if (toep->ce) {
+ t4_release_clip_entry(sc, toep->ce);
+ toep->ce = NULL;
+ }
+ if (toep->params.tc_idx != -1)
+ t4_release_cl_rl(sc, toep->vi->pi->port_id, toep->params.tc_idx);
+}
+
+/*
+ * Both the driver and kernel are done with the toepcb.
+ */
+static void
+done_with_toepcb(struct toepcb *toep)
+{
+ struct tom_data *td = toep->td;
+
+ KASSERT(!(toep->flags & TPF_CPL_PENDING),
+ ("%s: %p has CPL pending.", __func__, toep));
+ KASSERT(!(toep->flags & TPF_ATTACHED),
+ ("%s: %p is still attached.", __func__, toep));
+
+ CTR(KTR_CXGBE, "%s: toep %p (0x%x)", __func__, toep, toep->flags);
+
/*
* These queues should have been emptied at approximately the same time
* that a normal connection's socket's so_snd would have been purged or
@@ -329,20 +360,9 @@
ddp_assert_empty(toep);
#endif
MPASS(TAILQ_EMPTY(&toep->aiotx_jobq));
-
- if (toep->l2te)
- t4_l2t_release(toep->l2te);
-
- if (tid >= 0) {
- remove_tid(sc, tid, toep->ce ? 2 : 1);
- release_tid(sc, tid, toep->ctrlq);
- }
-
- if (toep->ce)
- t4_release_clip_entry(sc, toep->ce);
-
- if (toep->params.tc_idx != -1)
- t4_release_cl_rl(sc, toep->vi->pi->port_id, toep->params.tc_idx);
+ MPASS(toep->tid == -1);
+ MPASS(toep->l2te == NULL);
+ MPASS(toep->ce == NULL);
mtx_lock(&td->toep_list_lock);
TAILQ_REMOVE(&td->toep_list, toep, link);
@@ -392,7 +412,7 @@
toep->flags &= ~TPF_ATTACHED;
if (!(toep->flags & TPF_CPL_PENDING))
- release_offload_resources(toep);
+ done_with_toepcb(toep);
}
/*
@@ -988,9 +1008,9 @@
toep->flags &= ~(TPF_CPL_PENDING | TPF_WAITING_FOR_FINAL);
mbufq_drain(&toep->ulp_pduq);
mbufq_drain(&toep->ulp_pdu_reclaimq);
-
+ release_offload_resources(toep);
if (!(toep->flags & TPF_ATTACHED))
- release_offload_resources(toep);
+ done_with_toepcb(toep);
if (!in_pcbrele_wlocked(inp))
INP_WUNLOCK(inp);

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 1, 4:24 AM (17 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28273201
Default Alt Text
D45991.diff (2 KB)

Event Timeline