git: 67be955f6bd5 - main - netgraph/ng_ksocket: Enter epoch on NG_SEND_DATA_ONLY

From: Pouria Mousavizadeh Tehrani <pouria_at_FreeBSD.org>
Date: Sat, 10 Oct 2026 19:14:05 UTC
The branch main has been updated by pouria:

URL: https://cgit.FreeBSD.org/src/commit/?id=67be955f6bd5d5b51fdee407969d1a7cde156f65

commit 67be955f6bd5d5b51fdee407969d1a7cde156f65
Author:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
AuthorDate: 2026-10-10 15:51:58 +0000
Commit:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
CommitDate: 2026-10-10 19:12:35 +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
---
 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 bb5d56eabb86..0ed9da97adcd 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>
@@ -1119,6 +1120,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;
@@ -1231,7 +1233,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);
 	}
 
 	/*
@@ -1243,8 +1247,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;
 	}
 }