PERFORCE change 163941 for review
Marko Zec
zec at FreeBSD.org
Tue Jun 9 23:05:34 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163941
Change 163941 by zec at zec_amdx4 on 2009/06/09 23:05:04
A still nonfunctional hack aiming at preventing inbound
path of the network stack being called directly from the
outbound path via netgraph.
Affected files ...
.. //depot/projects/vimage-commit2/src/sys/netgraph/netgraph.h#25 edit
.. //depot/projects/vimage-commit2/src/sys/netgraph/ng_base.c#33 edit
.. //depot/projects/vimage-commit2/src/sys/netgraph/ng_eiface.c#23 edit
.. //depot/projects/vimage-commit2/src/sys/sys/proc.h#18 edit
Differences ...
==== //depot/projects/vimage-commit2/src/sys/netgraph/netgraph.h#25 (text+ko) ====
@@ -130,6 +130,8 @@
#define HK_FORCE_WRITER 0x0004 /* Incoming data queued as a writer */
#define HK_DEAD 0x0008 /* This is the dead hook.. don't free */
#define HK_HI_STACK 0x0010 /* Hook has hi stack usage */
+#define HK_TO_INBOUND 0x0020 /* Hook calls into the inbound path
+ of the network stack. */
/*
* Public Methods for hook
@@ -150,6 +152,8 @@
#define _NG_HOOK_FORCE_WRITER(hook) \
do { hook->hk_flags |= HK_FORCE_WRITER; } while (0)
#define _NG_HOOK_FORCE_QUEUE(hook) do { hook->hk_flags |= HK_QUEUE; } while (0)
+#define _NG_HOOK_SET_TO_INBOUND(hook) \
+ do { hook->hk_flags |= HK_TO_INBOUND; } while (0)
#define _NG_HOOK_HI_STACK(hook) do { hook->hk_flags |= HK_HI_STACK; } while (0)
/* Some shortcuts */
@@ -176,8 +180,11 @@
static __inline node_p _ng_hook_node(hook_p hook, char * file, int line);
static __inline hook_p _ng_hook_peer(hook_p hook, char * file, int line);
static __inline void _ng_hook_force_writer(hook_p hook, char * file,
- int line);
-static __inline void _ng_hook_force_queue(hook_p hook, char * file, int line);
+ int line);
+static __inline void _ng_hook_force_queue(hook_p hook, char * file,
+ int line);
+static __inline void _ng_hook_set_to_inbound(hook_p hook, char * file,
+ int line);
static __inline void
_chkhook(hook_p hook, char *file, int line)
@@ -282,6 +289,13 @@
}
static __inline void
+_ng_hook_set_to_inbound(hook_p hook, char * file, int line)
+{
+ _chkhook(hook, file, line);
+ _NG_HOOK_SET_TO_INBOUND(hook);
+}
+
+static __inline void
_ng_hook_hi_stack(hook_p hook, char * file, int line)
{
_chkhook(hook, file, line);
@@ -302,6 +316,7 @@
#define NG_HOOK_PEER(hook) _ng_hook_peer(hook, _NN_)
#define NG_HOOK_FORCE_WRITER(hook) _ng_hook_force_writer(hook, _NN_)
#define NG_HOOK_FORCE_QUEUE(hook) _ng_hook_force_queue(hook, _NN_)
+#define NG_HOOK_SET_TO_INBOUND(hook) _ng_hook_set_to_inbound(hook, _NN_)
#define NG_HOOK_HI_STACK(hook) _ng_hook_hi_stack(hook, _NN_)
#else /* NETGRAPH_DEBUG */ /*----------------------------------------------*/
@@ -319,6 +334,7 @@
#define NG_HOOK_PEER(hook) _NG_HOOK_PEER(hook)
#define NG_HOOK_FORCE_WRITER(hook) _NG_HOOK_FORCE_WRITER(hook)
#define NG_HOOK_FORCE_QUEUE(hook) _NG_HOOK_FORCE_QUEUE(hook)
+#define NG_HOOK_SET_TO_INBOUND(hook) _NG_HOOK_SET_TO_INBOUND(hook)
#define NG_HOOK_HI_STACK(hook) _NG_HOOK_HI_STACK(hook)
#endif /* NETGRAPH_DEBUG */ /*----------------------------------------------*/
==== //depot/projects/vimage-commit2/src/sys/netgraph/ng_base.c#33 (text+ko) ====
@@ -2213,11 +2213,16 @@
}
/*
- * If sender or receiver requests queued delivery or stack usage
+ * If sender or receiver requests queued delivery, or call graph
+ * loops back from outbound to inbound path, or stack usage
* level is dangerous - enqueue message.
*/
if ((flags & NG_QUEUE) || (hook && (hook->hk_flags & HK_QUEUE))) {
queue = 1;
+ } else if (hook && (hook->hk_flags & HK_TO_INBOUND) /* &&
+ (curthread->td_flags & TDF_NG_OUTBOUND) */) {
+printf("ng queuing: td_flags = %X\n", curthread->td_flags);
+ queue = 1;
} else {
queue = 0;
#ifdef GET_STACK_USAGE
==== //depot/projects/vimage-commit2/src/sys/netgraph/ng_eiface.c#23 (text+ko) ====
@@ -95,6 +95,7 @@
static ng_rcvmsg_t ng_eiface_rcvmsg;
static ng_shutdown_t ng_eiface_rmnode;
static ng_newhook_t ng_eiface_newhook;
+static ng_connect_t ng_eiface_connect;
static ng_rcvdata_t ng_eiface_rcvdata;
static ng_disconnect_t ng_eiface_disconnect;
@@ -107,6 +108,7 @@
.rcvmsg = ng_eiface_rcvmsg,
.shutdown = ng_eiface_rmnode,
.newhook = ng_eiface_newhook,
+ .connect = ng_eiface_connect,
.rcvdata = ng_eiface_rcvdata,
.disconnect = ng_eiface_disconnect,
.cmdlist = ng_eiface_cmdlist
@@ -421,6 +423,19 @@
}
/*
+ * Mark a hook as leading to inbound path of the network stack, so
+ * that framework can queue calls to us that arrived from the outbound
+ * path.
+ */
+static int
+ng_eiface_connect(hook_p hook)
+{
+
+ NG_HOOK_SET_TO_INBOUND(hook);
+ return (0);
+}
+
+/*
* Receive a control message
*/
static int
==== //depot/projects/vimage-commit2/src/sys/sys/proc.h#18 (text+ko) ====
@@ -319,7 +319,7 @@
#define TDF_BOUNDARY 0x00000400 /* Thread suspended at user boundary */
#define TDF_ASTPENDING 0x00000800 /* Thread has some asynchronous events. */
#define TDF_TIMOFAIL 0x00001000 /* Timeout from sleep after we were awake. */
-#define TDF_UNUSED2000 0x00002000 /* --available-- */
+#define TDF_NG_OUTBOUND 0x00002000 /* Thread called into ng from ntw stack. */
#define TDF_UPIBLOCKED 0x00004000 /* Thread blocked on user PI mutex. */
#define TDF_NEEDSUSPCHK 0x00008000 /* Thread may need to suspend. */
#define TDF_NEEDRESCHED 0x00010000 /* Thread needs to yield. */
More information about the p4-projects
mailing list