git: b435452e6b23 - main - sysctl net.inet.tcp.ktlslist: allow snd_tag_status_str() to sleep
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 10 Jul 2025 14:42:47 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=b435452e6b2314e45131b6a3afaa1f4d674a7e17
commit b435452e6b2314e45131b6a3afaa1f4d674a7e17
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-07-03 10:37:35 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-07-10 14:42:27 +0000
sysctl net.inet.tcp.ktlslist: allow snd_tag_status_str() to sleep
For this, unlock inp around the calls, taking the reference on it. If
the inp appears to be freed or unlinked after the relock, return
EDEADLK.
Reviewed by: glebius, markj
Sponsored by: Nvidia networking
Differential revision: https://reviews.freebsd.org/D51143
---
sys/netinet/tcp_subr.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index cd42a67294a6..f8811649fe19 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -2720,8 +2720,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys)
ksr->snd_tag->sw->snd_tag_status_str !=
NULL) {
sz = SND_TAG_STATUS_MAXLEN;
+ in_pcbref(inp);
+ INP_RUNLOCK(inp);
ksr->snd_tag->sw->snd_tag_status_str(
ksr->snd_tag, NULL, &sz);
+ if (in_pcbrele_rlock(inp))
+ return (EDEADLK);
len += sz;
}
}
@@ -2739,8 +2743,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys)
kss->snd_tag->sw->snd_tag_status_str !=
NULL) {
sz = SND_TAG_STATUS_MAXLEN;
+ in_pcbref(inp);
+ INP_RUNLOCK(inp);
kss->snd_tag->sw->snd_tag_status_str(
kss->snd_tag, NULL, &sz);
+ if (in_pcbrele_rlock(inp))
+ return (EDEADLK);
len += sz;
}
}
@@ -2811,8 +2819,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys)
if (ksr->snd_tag != NULL &&
ksr->snd_tag->sw->snd_tag_status_str != NULL) {
sz = SND_TAG_STATUS_MAXLEN;
+ in_pcbref(inp);
+ INP_RUNLOCK(inp);
ksr->snd_tag->sw->snd_tag_status_str(
ksr->snd_tag, buf + len, &sz);
+ if (in_pcbrele_rlock(inp))
+ return (EDEADLK);
len += sz;
}
}
@@ -2828,8 +2840,12 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys)
if (kss->snd_tag != NULL &&
kss->snd_tag->sw->snd_tag_status_str != NULL) {
sz = SND_TAG_STATUS_MAXLEN;
+ in_pcbref(inp);
+ INP_RUNLOCK(inp);
kss->snd_tag->sw->snd_tag_status_str(
kss->snd_tag, buf + len, &sz);
+ if (in_pcbrele_rlock(inp))
+ return (EDEADLK);
len += sz;
}
}
@@ -2853,6 +2869,10 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool export_keys)
zfree(buf, M_TEMP);
return (error);
+
+again_reset:
+ req->oldidx = 0;
+ goto again;
}
static int