aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlib
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2017-10-18 18:48:11 -0400
committerFlorin Coras <florin.coras@gmail.com>2017-10-19 04:35:54 +0000
commit7bee773e71b81a1e13a656030b0f7edae99c5e92 (patch)
tree86f615367c1b3bf29ecd2957c7dbea2d9e6ed0a6 /src/vlib
parent9c4b5b28b1c1df0c100b377a2f5bfc07bd9a0b2e (diff)
VPP-1024: rewrite buffer trajectory tracer
Use a proper u16 * vector to capture node indices, since vpp w/ plugins now exceeds 255 graph nodes Change-Id: Ic48cad676fa3a6116413ddf08c083dd9660783f1 Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vlib')
-rw-r--r--src/vlib/buffer.h9
-rw-r--r--src/vlib/main.c59
2 files changed, 25 insertions, 43 deletions
diff --git a/src/vlib/buffer.h b/src/vlib/buffer.h
index e47dbc6d4fd..e5c1d21397b 100644
--- a/src/vlib/buffer.h
+++ b/src/vlib/buffer.h
@@ -142,7 +142,8 @@ typedef struct
/**< Only valid for first buffer in chain. Current length plus
total length given here give total number of bytes in buffer chain.
*/
- u32 opaque2[13]; /**< More opaque data, currently unused */
+ u32 align_pad; /**< available */
+ u32 opaque2[12]; /**< More opaque data, see ../vnet/vnet/buffer.h */
/***** end of second cache line */
CLIB_CACHE_LINE_ALIGN_MARK (cacheline2);
@@ -512,7 +513,11 @@ serialize_vlib_buffer_n_bytes (serialize_main_t * m)
#define VLIB_BUFFER_TRACE_TRAJECTORY 0
#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
-#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) (b)->pre_data[0]=0
+extern void (*vlib_buffer_trace_trajectory_cb) (vlib_buffer_t * b, u32 index);
+extern void (*vlib_buffer_trace_trajectory_init_cb) (vlib_buffer_t * b);
+extern void vlib_buffer_trace_trajectory_init (vlib_buffer_t * b);
+#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) \
+ vlib_buffer_trace_trajectory_init (b);
#else
#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b)
#endif /* VLIB_BUFFER_TRACE_TRAJECTORY */
diff --git a/src/vlib/main.c b/src/vlib/main.c
index 7875f62ad37..fd9937fe3e6 100644
--- a/src/vlib/main.c
+++ b/src/vlib/main.c
@@ -884,52 +884,32 @@ vlib_elog_main_loop_event (vlib_main_t * vm,
/* data to log */ n_vectors);
}
+#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
+void (*vlib_buffer_trace_trajectory_cb) (vlib_buffer_t * b, u32 node_index);
+void (*vlib_buffer_trace_trajectory_init_cb) (vlib_buffer_t * b);
+
void
-vlib_dump_context_trace (vlib_main_t * vm, u32 bi)
+vlib_buffer_trace_trajectory_init (vlib_buffer_t * b)
{
- vlib_node_main_t *vnm = &vm->node_main;
- vlib_buffer_t *b;
- u8 i, n;
-
- if (VLIB_BUFFER_TRACE_TRAJECTORY)
+ if (PREDICT_TRUE (vlib_buffer_trace_trajectory_init_cb != 0))
{
- b = vlib_get_buffer (vm, bi);
- n = b->pre_data[0];
-
- fformat (stderr, "Context trace for bi %d b 0x%llx, visited %d\n",
- bi, b, n);
-
- if (n == 0 || n > 20)
- {
- fformat (stderr, "n is unreasonable\n");
- return;
- }
-
-
- for (i = 0; i < n; i++)
- {
- u32 node_index;
-
- node_index = b->pre_data[i + 1];
+ (*vlib_buffer_trace_trajectory_init_cb) (b);
+ }
+}
- if (node_index > vec_len (vnm->nodes))
- {
- fformat (stderr, "Skip bogus node index %d\n", node_index);
- continue;
- }
+#endif
- fformat (stderr, "%v (%d)\n", vnm->nodes[node_index]->name,
- node_index);
- }
- }
- else
+static inline void
+add_trajectory_trace (vlib_buffer_t * b, u32 node_index)
+{
+#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
+ if (PREDICT_TRUE (vlib_buffer_trace_trajectory_cb != 0))
{
- fformat (stderr,
- "in vlib/buffers.h, #define VLIB_BUFFER_TRACE_TRAJECTORY 1\n");
+ (*vlib_buffer_trace_trajectory_cb) (b, node_index);
}
+#endif
}
-
static_always_inline u64
dispatch_node (vlib_main_t * vm,
vlib_node_runtime_t * node,
@@ -995,15 +975,12 @@ dispatch_node (vlib_main_t * vm,
if (VLIB_BUFFER_TRACE_TRAJECTORY && frame)
{
int i;
- int log_index;
u32 *from;
from = vlib_frame_vector_args (frame);
for (i = 0; i < frame->n_vectors; i++)
{
vlib_buffer_t *b = vlib_get_buffer (vm, from[i]);
- ASSERT (b->pre_data[0] < 32);
- log_index = b->pre_data[0]++ + 1;
- b->pre_data[log_index] = node->node_index;
+ add_trajectory_trace (b, node->node_index);
}
n = node->function (vm, node, frame);
}