vlib: mmap process stacks
[vpp.git] / src / vlib / node.h
index bec0ed2..1bdb3bb 100644 (file)
@@ -187,6 +187,7 @@ static void __vlib_rm_node_registration_##x (void)                      \
 __VA_ARGS__ vlib_node_registration_t x
 #else
 #define VLIB_REGISTER_NODE(x,...)                                       \
+STATIC_ASSERT (sizeof(# __VA_ARGS__) != 7,"node " #x " must not be declared as static"); \
 static __clib_unused vlib_node_registration_t __clib_unused_##x
 #endif
 
@@ -217,6 +218,8 @@ CLIB_MARCH_SFX (node##_multiarch_register) (void)                   \
 }                                                                      \
 uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (node##_fn)
 
+unformat_function_t unformat_vlib_node_variant;
+
 always_inline vlib_node_registration_t *
 vlib_node_next_registered (vlib_node_registration_t * c)
 {
@@ -302,6 +305,7 @@ typedef struct vlib_node_t
 
 #define VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE (1 << 6)
 #define VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE (1 << 7)
+#define VLIB_NODE_FLAG_TRACE_SUPPORTED (1 << 8)
 
   /* State for input nodes. */
   u8 state;
@@ -548,6 +552,7 @@ typedef struct
 
 typedef struct
 {
+  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
   /* Node runtime for this process. */
   vlib_node_runtime_t node_runtime;
 
@@ -609,32 +614,10 @@ typedef struct
   vlib_cli_output_function_t *output_function;
   uword output_function_arg;
 
-#ifdef CLIB_UNIX
-  /* Pad to a multiple of the page size so we can mprotect process stacks */
-#define PAGE_SIZE_MULTIPLE 0x1000
-#define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT  __attribute__ ((aligned (PAGE_SIZE_MULTIPLE)))
-#else
-#define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT
-#endif
-
-  /* Process stack.  Starts here and extends 2^log2_n_stack_bytes
-     bytes. */
-
+  /* Process stack */
 #define VLIB_PROCESS_STACK_MAGIC (0xdead7ead)
-  u32 stack[0] ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT;
-} vlib_process_t __attribute__ ((aligned (CLIB_CACHE_LINE_BYTES)));
-
-#ifdef CLIB_UNIX
-  /* Ensure that the stack is aligned on the multiple of the page size */
-typedef char
-  assert_process_stack_must_be_aligned_exactly_to_page_size_multiple[(sizeof
-                                                                     (vlib_process_t)
-                                                                     -
-                                                                     PAGE_SIZE_MULTIPLE)
-                                                                    ==
-                                                                    0 ? 0 :
-                                                                    -1];
-#endif
+  u32 *stack;
+} vlib_process_t;
 
 typedef struct
 {
@@ -760,8 +743,27 @@ typedef struct
 
   /* Node registrations added by constructors */
   vlib_node_registration_t *node_registrations;
+
+  /* Node index from error code */
+  u32 *node_by_error;
 } vlib_node_main_t;
 
+typedef u16 vlib_error_t;
+
+always_inline u32
+vlib_error_get_node (vlib_node_main_t * nm, vlib_error_t e)
+{
+  return nm->node_by_error[e];
+}
+
+always_inline u32
+vlib_error_get_code (vlib_node_main_t * nm, vlib_error_t e)
+{
+  u32 node_index = nm->node_by_error[e];
+  vlib_node_t *n = nm->nodes[node_index];
+  u32 error_code = e - n->error_heap_index;
+  return error_code;
+}
 
 #define FRAME_QUEUE_MAX_NELTS 64
 typedef struct