From f89bbbe300dad7bc479db535e7822199f98aca30 Mon Sep 17 00:00:00 2001 From: Benoît Ganne Date: Thu, 4 Mar 2021 14:31:03 +0100 Subject: vlib: refactor trajectory trace debug feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit trajectory trace has been broken for a while because we used to save the buffer trajectory in a vector pointed to in opaque2. This does not work well when opaque2 is copied (eg. because of a clone) as 2 buffers end up sharing the same vector. This dedicates a full cacheline in the buffer metadata instead when trajectory is compiled in. No dynamic allocation, no sharing, no tears. Type: refactor Change-Id: I6a028ca1b48d38f393a36979e5e452c2dd48ad3f Signed-off-by: Benoît Ganne --- src/vnet/unix/gdb_funcs.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/vnet/unix/tuntap.c | 8 -------- 2 files changed, 41 insertions(+), 8 deletions(-) (limited to 'src/vnet/unix') diff --git a/src/vnet/unix/gdb_funcs.c b/src/vnet/unix/gdb_funcs.c index 797cb0eb7d1..886d849c173 100644 --- a/src/vnet/unix/gdb_funcs.c +++ b/src/vnet/unix/gdb_funcs.c @@ -380,6 +380,47 @@ gdb_validate_buffer (vlib_buffer_t * b) return 0; } +/** + * Dump a trajectory trace, reasonably easy to call from gdb + */ +void +gdb_dump_trajectory_trace (u32 bi) +{ +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + vlib_main_t *vm = vlib_get_main (); + vlib_node_main_t *vnm = &vm->node_main; + vlib_buffer_t *b; + u16 *trace; + u8 i; + + b = vlib_get_buffer (vm, bi); + + trace = b->trajectory_trace; + + fformat (stderr, "Context trace for bi %d b 0x%llx, visited %d\n", bi, b, + b->trajectory_nb); + + for (i = 0; i < b->trajectory_nb; i++) + { + u32 node_index; + + node_index = trace[i]; + + if (node_index >= vec_len (vnm->nodes)) + { + fformat (stderr, "Skip bogus node index %d\n", node_index); + continue; + } + + fformat (stderr, "%v (%d)\n", vnm->nodes[node_index]->name, node_index); + } +#else + fformat (stderr, "in vlib/buffers.h, " + "#define VLIB_BUFFER_TRACE_TRAJECTORY 1\n"); + +#endif +} + /* Cafeteria plan, maybe you don't want these functions */ clib_error_t * gdb_func_init (vlib_main_t * vm) diff --git a/src/vnet/unix/tuntap.c b/src/vnet/unix/tuntap.c index 50f02df9e82..4a848349ae1 100644 --- a/src/vnet/unix/tuntap.c +++ b/src/vnet/unix/tuntap.c @@ -336,14 +336,6 @@ tuntap_rx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) vnet_buffer (b)->sw_if_index[VLIB_RX] = tm->sw_if_index; vnet_buffer (b)->sw_if_index[VLIB_TX] = (u32) ~ 0; - /* - * Turn this on if you run into - * "bad monkey" contexts, and you want to know exactly - * which nodes they've visited... - */ - if (VLIB_BUFFER_TRACE_TRAJECTORY) - b->pre_data[0] = 0; - b->error = node->errors[0]; if (tm->is_ether) -- cgit 1.2.3-korg