git: c804f6ecdf1e - stable/15 - netgraph/ng_ksocket: Enter epoch on NG_SEND_DATA_ONLY

From: Kevin Bowling <kbowling_at_FreeBSD.org>
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;
 	}
 }