temporary fix to netgraph breakage

YONETANI Tomokazu qhwt+dragonfly-bugs at les.ath.cx
Mon Apr 19 10:34:05 PDT 2004


Hi.
Here's a temporary fix to the recent netgraph breakage, by
bringing netmsg_put_port() back from ip_demux.c. At least
it seems to work for me, but I'm not sure this is right.
(well, at least I could've made it global and share it with
ip_demux.c, but I'm sleepy now...)
My guess is that some parts of netgraph code dealing with protocols
other than tcp and udp still need this putport handler.

Index: net/netisr.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/net/netisr.c,v
retrieving revision 1.12
diff -u -r1.12 netisr.c
--- net/netisr.c	17 Apr 2004 00:46:28 -0000	1.12
+++ net/netisr.c	19 Apr 2004 17:03:27 -0000
@@ -56,12 +56,41 @@
 
 SYSINIT(netisr, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, netisr_init, NULL);
 
+/*
+ * We must construct a custom putport function (which runs in the context
+ * of the message originator)
+ * Our custom putport must check for self-referential messages, which can
+ * occur when the so_upcall routine is called (e.g. nfs).  Self referential
+ * messages are simply executed synchronously.
+ */
+static int
+netmsg_put_port(lwkt_port_t port, lwkt_msg_t lmsg)
+{
+    /*
+     * If it's a synchronous message for the same thread,
+     * execute it directly.
+     */
+    if (!(lmsg->ms_flags & MSGF_ASYNC) && port->mp_td == curthread) {
+	struct netmsg *msg = (struct netmsg *)lmsg;
+
+	msg->nm_handler(msg);
+    } else {
+        lwkt_default_putport(port, lmsg);
+    }
+
+    return (EASYNC);
+}
+
 void
 netmsg_service_loop(void *arg)
 {
+    thread_t td;
     struct netmsg *msg;
 
-    while ((msg = lwkt_waitport(&curthread->td_msgport, NULL)))
+    td = curthread;
+    td->td_msgport.mp_putport = netmsg_put_port;
+
+    while ((msg = lwkt_waitport(&td->td_msgport, NULL)))
 	msg->nm_handler(msg);
 }
 





More information about the Bugs mailing list