git: c804f6ecdf1e - stable/15 - netgraph/ng_ksocket: Enter epoch on NG_SEND_DATA_ONLY
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 30 Oct 2026 17:53:21 UTC
The branch stable/15 has been updated by kbowling:
URL: https://cgit.FreeBSD.org/src/commit/?id=c804f6ecdf1e9a79e6b6b0ad805adf1a0239dba4
commit c804f6ecdf1e9a79e6b6b0ad805adf1a0239dba4
Author: Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
AuthorDate: 2026-10-10 15:51:58 +0000
Commit: Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2026-10-30 17:53:10 +0000
netgraph/ng_ksocket: Enter epoch on NG_SEND_DATA_ONLY
The work queued by ng_send_fn() is intentionally processed
outside of the epoch in ngthread().
It is ng_ksocket's responsibility to enter epoch if it decides
to send data from such work.
Reviewed by: glebius
Fixes: 104827151e2a ("ng_iface: don't recursively enter epoch ...")
Differential Revision: https://reviews.freebsd.org/D60589
(cherry picked from commit 67be955f6bd5d5b51fdee407969d1a7cde156f65)
---
sys/netgraph/ng_ksocket.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c
index 74b2e211c0ed..aa4d4d12ed7a 100644
--- a/sys/netgraph/ng_ksocket.c
+++ b/sys/netgraph/ng_ksocket.c
@@ -51,6 +51,7 @@
#include <sys/kernel.h>
#include <sys/mbuf.h>
#include <sys/proc.h>
+#include <sys/epoch.h>
#include <sys/malloc.h>
#include <sys/ctype.h>
#include <sys/protosw.h>
@@ -1120,6 +1121,7 @@ ng_ksocket_incoming(struct socket *so, void *arg, int waitflag)
static void
ng_ksocket_incoming2(node_p node, hook_p hook, void *arg1, int arg2)
{
+ struct epoch_tracker et;
struct socket *so = arg1;
const priv_p priv = NG_NODE_PRIVATE(node);
struct ng_mesg *response;
@@ -1232,7 +1234,9 @@ ng_ksocket_incoming2(node_p node, hook_p hook, void *arg1, int arg2)
}
sendit: /* Forward data with optional peer sockaddr as packet tag */
+ NET_EPOCH_ENTER(et);
NG_SEND_DATA_ONLY(error, priv->hook, m);
+ NET_EPOCH_EXIT(et);
}
/*
@@ -1244,8 +1248,11 @@ sendit: /* Forward data with optional peer sockaddr as packet tag */
struct mbuf *m;
m = m_gethdr(M_NOWAIT, MT_DATA);
- if (m != NULL)
+ if (m != NULL) {
+ NET_EPOCH_ENTER(et);
NG_SEND_DATA_ONLY(error, priv->hook, m);
+ NET_EPOCH_EXIT(et);
+ }
priv->flags |= KSF_EOFSEEN;
}
}