aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2024-10-01 15:32:18 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2024-10-01 15:34:35 +0000
commit2eacb0841c7dfc92030abc433e53cd31383a0648 (patch)
treef6f480fd071ede50f2fa75f209cbf08ee5b5fb0d
parent7643141e9314f1eac0d9ac08457410509e6829ad (diff)
-rw-r--r--sys/netinet/tcp_syncache.c59
1 files changed, 28 insertions, 31 deletions
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index cb175d07c4d2..d0068a9d313b 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -1567,49 +1567,46 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
goto donenoprobe;
}
- if (tfo_cookie_valid) {
- bzero(&scs, sizeof(scs));
- sc = &scs;
- goto skip_alloc;
- }
-
+ KASSERT(sc == NULL, ("sc(%p) != NULL", sc));
/*
* Skip allocating a syncache entry if we are just going to discard
* it later.
*/
- if (!locked) {
+ if (!locked || tfo_cookie_valid) {
bzero(&scs, sizeof(scs));
sc = &scs;
- } else
- sc = uma_zalloc(V_tcp_syncache.zone, M_NOWAIT | M_ZERO);
- if (sc == NULL) {
- /*
- * The zone allocator couldn't provide more entries.
- * Treat this as if the cache was full; drop the oldest
- * entry and insert the new one.
- */
- TCPSTAT_INC(tcps_sc_zonefail);
- if ((sc = TAILQ_LAST(&sch->sch_bucket, sch_head)) != NULL) {
- sch->sch_last_overflow = time_uptime;
- syncache_drop(sc, sch);
- syncache_pause(inc);
- }
+ } else {
sc = uma_zalloc(V_tcp_syncache.zone, M_NOWAIT | M_ZERO);
if (sc == NULL) {
- if (V_tcp_syncookies) {
- bzero(&scs, sizeof(scs));
- sc = &scs;
- } else {
- KASSERT(locked,
- ("%s: bucket unexpectedly unlocked",
- __func__));
- SCH_UNLOCK(sch);
- goto done;
+ /*
+ * The zone allocator couldn't provide more entries.
+ * Treat this as if the cache was full; drop the oldest
+ * entry and insert the new one.
+ */
+ TCPSTAT_INC(tcps_sc_zonefail);
+ sc = TAILQ_LAST(&sch->sch_bucket, sch_head);
+ if (sc != NULL) {
+ sch->sch_last_overflow = time_uptime;
+ syncache_drop(sc, sch);
+ syncache_pause(inc);
+ }
+ sc = uma_zalloc(V_tcp_syncache.zone, M_NOWAIT | M_ZERO);
+ if (sc == NULL) {
+ if (V_tcp_syncookies) {
+ bzero(&scs, sizeof(scs));
+ sc = &scs;
+ } else {
+ KASSERT(locked,
+ ("%s: bucket unexpectedly unlocked",
+ __func__));
+ SCH_UNLOCK(sch);
+ goto done;
+ }
}
}
}
-skip_alloc:
+ KASSERT(sc != NULL, ("sc == NULL"));
if (!tfo_cookie_valid && tfo_response_cookie_valid)
sc->sc_tfo_cookie = &tfo_response_cookie;