vlib: refactor trajectory trace debug feature
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 <bganne@cisco.com>
This commit is contained in:
committed by
Damjan Marion
parent
c8983241b9
commit
f89bbbe300
@@ -162,9 +162,6 @@ blindly cut-'n-pasted.
|
||||
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
|
||||
/* Initialize the buffer */
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
/* At this point b0->current_data = 0, b0->current_length = 0 */
|
||||
|
||||
/*
|
||||
@@ -206,7 +203,7 @@ blindly cut-'n-pasted.
|
||||
vec_len (udp_data));
|
||||
|
||||
}
|
||||
b0->flags |= (VLIB_BUFFER_TOTAL_LENGTH_VALID;
|
||||
b0->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID;
|
||||
|
||||
/* sw_if_index 0 is the "local" interface, which always exists */
|
||||
vnet_buffer (b0)->sw_if_index[VLIB_RX] = 0;
|
||||
|
||||
@@ -1468,14 +1468,6 @@ ixge_rx_queue_no_wrap (ixge_main_t * xm,
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
b1 = vlib_get_buffer (vm, bi1);
|
||||
|
||||
/*
|
||||
* Turn this on if you run into
|
||||
* "bad monkey" contexts, and you want to know exactly
|
||||
* which nodes they've visited... See main.c...
|
||||
*/
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b1);
|
||||
|
||||
CLIB_PREFETCH (b0->data, CLIB_CACHE_LINE_BYTES, LOAD);
|
||||
CLIB_PREFETCH (b1->data, CLIB_CACHE_LINE_BYTES, LOAD);
|
||||
|
||||
@@ -1680,13 +1672,6 @@ ixge_rx_queue_no_wrap (ixge_main_t * xm,
|
||||
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
|
||||
/*
|
||||
* Turn this on if you run into
|
||||
* "bad monkey" contexts, and you want to know exactly
|
||||
* which nodes they've visited...
|
||||
*/
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
is_eop0 = (s20 & IXGE_RX_DESCRIPTOR_STATUS2_IS_END_OF_PACKET) != 0;
|
||||
ixge_rx_next_and_error_from_status_x1
|
||||
(xd, s00, s20, &next0, &error0, &flags0);
|
||||
|
||||
@@ -198,7 +198,6 @@ netmap_device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
}
|
||||
|
||||
/* trace */
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (first_b0);
|
||||
if (PREDICT_FALSE (n_trace > 0))
|
||||
{
|
||||
if (PREDICT_TRUE (first_b0 != 0))
|
||||
|
||||
@@ -141,6 +141,15 @@ if (VPP_ENABLE_SANITIZE_ADDR)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "-fsanitize=address ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
endif (VPP_ENABLE_SANITIZE_ADDR)
|
||||
|
||||
##############################################################################
|
||||
# trajectory trace
|
||||
##############################################################################
|
||||
|
||||
option(VPP_ENABLE_TRAJECTORY_TRACE "Build vpp with trajectory tracing enabled" OFF)
|
||||
if(VPP_ENABLE_TRAJECTORY_TRACE)
|
||||
set(CMAKE_C_FLAGS "-DVLIB_BUFFER_TRACE_TRAJECTORY=1 ${CMAKE_C_FLAGS}")
|
||||
endif()
|
||||
|
||||
##############################################################################
|
||||
# install config
|
||||
##############################################################################
|
||||
|
||||
@@ -208,6 +208,18 @@ af_xdp_create_queue (vlib_main_t * vm, af_xdp_create_if_args_t * args,
|
||||
umem_config.comp_size = args->txq_size;
|
||||
umem_config.frame_size =
|
||||
sizeof (vlib_buffer_t) + vlib_buffer_get_default_data_size (vm);
|
||||
/*
|
||||
* Note about headroom: for some reasons, there seem to be a discrepency
|
||||
* between 0-copy and copy mode:
|
||||
* - 0-copy: XDP_PACKET_HEADROOM will be added to the user headroom
|
||||
* - copy: nothing is added to the user headroom
|
||||
* We privileged 0-copy and set headroom so that frame_headroom +
|
||||
* XDP_PACKET_HEADROOM == sizeof(vlib_buffer_t), ie data will correctly
|
||||
* point to vlib_buffer_t->data for 0-copy. In copy mode, we have to add
|
||||
* XDP_PACKET_HEADROOM to desc offset during refill.
|
||||
*/
|
||||
STATIC_ASSERT (sizeof (vlib_buffer_t) >= XDP_PACKET_HEADROOM, "wrong size");
|
||||
umem_config.frame_headroom = sizeof (vlib_buffer_t) - XDP_PACKET_HEADROOM;
|
||||
umem_config.flags = XDP_UMEM_UNALIGNED_CHUNK_FLAG;
|
||||
if (xsk_umem__create
|
||||
(umem, uword_to_pointer (vm->buffer_main->buffer_mem_start, void *),
|
||||
|
||||
@@ -130,17 +130,11 @@ af_xdp_device_input_refill (vlib_main_t * vm,
|
||||
|
||||
/*
|
||||
* Note about headroom: for some reasons, there seem to be a discrepency
|
||||
* between 0-copy and copy mode:
|
||||
* - 0-copy: XDP_PACKET_HEADROOM will be added to the user headroom
|
||||
* - copy: nothing is added to the user headroom
|
||||
* We privileged 0-copy and set headroom to 0. As XDP_PACKET_HEADROOM ==
|
||||
* sizeof(vlib_buffer_t), data will correctly point to vlib_buffer_t->data.
|
||||
* In copy mode, we have to add sizeof(vlib_buffer_t) to desc offset during
|
||||
* refill.
|
||||
* between 0-copy and copy mode. See
|
||||
* src/plugins/af_xdp/device.c:af_xdp_create_queue()
|
||||
*/
|
||||
STATIC_ASSERT (sizeof (vlib_buffer_t) == XDP_PACKET_HEADROOM, "wrong size");
|
||||
#define bi2addr(bi) \
|
||||
(((bi) << CLIB_LOG2_CACHE_LINE_BYTES) + (copy ? sizeof(vlib_buffer_t) : 0))
|
||||
#define bi2addr(bi) \
|
||||
(((bi) << CLIB_LOG2_CACHE_LINE_BYTES) + (copy ? XDP_PACKET_HEADROOM : 0))
|
||||
|
||||
wrap_around:
|
||||
|
||||
@@ -218,8 +212,8 @@ af_xdp_device_input_bufs (vlib_main_t * vm, const af_xdp_device_t * ad,
|
||||
const u32 mask = rxq->rx.mask;
|
||||
u32 n = n_rx, *bi = bis, bytes = 0;
|
||||
|
||||
#define addr2bi(addr) \
|
||||
(((addr) - (copy ? sizeof(vlib_buffer_t) : 0)) >> CLIB_LOG2_CACHE_LINE_BYTES)
|
||||
#define addr2bi(addr) \
|
||||
(((addr) - (copy ? XDP_PACKET_HEADROOM : 0)) >> CLIB_LOG2_CACHE_LINE_BYTES)
|
||||
|
||||
while (n >= 1)
|
||||
{
|
||||
|
||||
@@ -230,11 +230,6 @@ avf_process_rx_burst (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
n_rx_bytes += avf_rx_attach_tail (vm, &bt, b[3], qw1[3], tail + 3);
|
||||
}
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
|
||||
|
||||
/* next */
|
||||
qw1 += 4;
|
||||
tail += 4;
|
||||
@@ -251,8 +246,6 @@ avf_process_rx_burst (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
if (maybe_multiseg)
|
||||
n_rx_bytes += avf_rx_attach_tail (vm, &bt, b[0], qw1[0], tail + 0);
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
|
||||
/* next */
|
||||
qw1 += 1;
|
||||
tail += 1;
|
||||
|
||||
@@ -500,7 +500,6 @@ send_dhcp_pkt (dhcp_client_main_t * dcm, dhcp_client_t * c,
|
||||
|
||||
/* Build a dhcpv4 pkt from whole cloth */
|
||||
b = vlib_get_buffer (vm, bi);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
|
||||
ASSERT (b->current_data == 0);
|
||||
|
||||
|
||||
@@ -370,7 +370,6 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
|
||||
DHCP_PROXY_ERROR_ALLOC_FAIL, 1);
|
||||
continue;
|
||||
}
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
|
||||
ci0 = vlib_get_buffer_index (vm, c0);
|
||||
server = &proxy->dhcp_servers[ii];
|
||||
|
||||
|
||||
@@ -443,7 +443,6 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm,
|
||||
DHCPV6_PROXY_ERROR_ALLOC_FAIL, 1);
|
||||
continue;
|
||||
}
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
|
||||
ci0 = vlib_get_buffer_index (vm, c0);
|
||||
server = &proxy->dhcp_servers[ii];
|
||||
|
||||
|
||||
@@ -311,11 +311,6 @@ VNET_DEVICE_CLASS_TX_FN (dpdk_device_class) (vlib_main_t * vm,
|
||||
or_flags = b[0]->flags | b[1]->flags | b[2]->flags | b[3]->flags;
|
||||
all_or_flags |= or_flags;
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
|
||||
|
||||
if (or_flags & VLIB_BUFFER_NEXT_PRESENT)
|
||||
{
|
||||
dpdk_validate_rte_mbuf (vm, b[0], 1);
|
||||
@@ -374,9 +369,6 @@ VNET_DEVICE_CLASS_TX_FN (dpdk_device_class) (vlib_main_t * vm,
|
||||
or_flags = b[0]->flags | b[1]->flags;
|
||||
all_or_flags |= or_flags;
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
|
||||
if (or_flags & VLIB_BUFFER_NEXT_PRESENT)
|
||||
{
|
||||
dpdk_validate_rte_mbuf (vm, b[0], 1);
|
||||
@@ -412,7 +404,6 @@ VNET_DEVICE_CLASS_TX_FN (dpdk_device_class) (vlib_main_t * vm,
|
||||
{
|
||||
b[0] = vlib_buffer_from_rte_mbuf (mb[0]);
|
||||
all_or_flags |= b[0]->flags;
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
|
||||
dpdk_validate_rte_mbuf (vm, b[0], 1);
|
||||
dpdk_buffer_tx_offload (xd, b[0], mb[0]);
|
||||
|
||||
@@ -216,11 +216,6 @@ dpdk_process_rx_burst (vlib_main_t * vm, dpdk_per_thread_data_t * ptd,
|
||||
n_bytes += dpdk_process_subseq_segs (vm, b[3], mb[3], &bt);
|
||||
}
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
|
||||
|
||||
/* next */
|
||||
mb += 4;
|
||||
n_left -= 4;
|
||||
@@ -238,7 +233,6 @@ dpdk_process_rx_burst (vlib_main_t * vm, dpdk_per_thread_data_t * ptd,
|
||||
|
||||
if (maybe_multiseg)
|
||||
n_bytes += dpdk_process_subseq_segs (vm, b[0], mb[0], &bt);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
|
||||
/* next */
|
||||
mb += 1;
|
||||
|
||||
@@ -650,7 +650,6 @@ flowprobe_get_buffer (vlib_main_t * vm, flowprobe_variant_t which)
|
||||
/* Initialize the buffer */
|
||||
b0 = fm->context[which].buffers_per_worker[my_cpu_number] =
|
||||
vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
b0->current_data = 0;
|
||||
b0->current_length = flowprobe_get_headersize ();
|
||||
|
||||
@@ -38,7 +38,6 @@ igmp_pkt_get_buffer (igmp_pkt_build_t * bk)
|
||||
return (NULL);
|
||||
|
||||
b = vlib_get_buffer (vm, bi);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
|
||||
b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
|
||||
b->flags |= VLIB_BUFFER_IS_TRACED;
|
||||
|
||||
@@ -233,9 +233,6 @@ mrvl_pp2_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
clib_memcpy_fast (vnet_buffer (b1)->sw_if_index, sw_if_index,
|
||||
sizeof (sw_if_index));
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b1);
|
||||
|
||||
if (PREDICT_FALSE (n_trace > 0))
|
||||
{
|
||||
mrvl_pp2_input_trace (vm, node, next0, b0, &n_trace, ppif, d);
|
||||
@@ -277,8 +274,6 @@ mrvl_pp2_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
clib_memcpy_fast (vnet_buffer (b0)->sw_if_index, sw_if_index,
|
||||
sizeof (sw_if_index));
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
if (PREDICT_FALSE (n_trace > 0))
|
||||
mrvl_pp2_input_trace (vm, node, next0, b0, &n_trace, ppif, d);
|
||||
|
||||
|
||||
@@ -91,8 +91,6 @@ memif_trace_buffer (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
memif_if_t * mif, vlib_buffer_t * b, u32 next, u16 qid,
|
||||
uword * n_tracep)
|
||||
{
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
|
||||
if (PREDICT_TRUE
|
||||
(b != 0 && vlib_trace_buffer (vm, node, next, b, /* follow_chain */ 0)))
|
||||
{
|
||||
|
||||
@@ -613,7 +613,6 @@ nat_ipfix_logging_nat44_ses (u32 thread_index, u8 nat_event, u32 src_ip,
|
||||
}
|
||||
|
||||
b0 = sitd->nat44_session_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -714,7 +713,6 @@ nat_ipfix_logging_addr_exhausted (u32 thread_index, u32 pool_id, int do_flush)
|
||||
}
|
||||
|
||||
b0 = sitd->addr_exhausted_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -800,7 +798,6 @@ nat_ipfix_logging_max_entries_per_usr (u32 thread_index,
|
||||
}
|
||||
|
||||
b0 = sitd->max_entries_per_user_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -892,7 +889,6 @@ nat_ipfix_logging_max_ses (u32 thread_index, u32 limit, int do_flush)
|
||||
}
|
||||
|
||||
b0 = sitd->max_sessions_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -981,7 +977,6 @@ nat_ipfix_logging_max_bib (u32 thread_index, u32 limit, int do_flush)
|
||||
}
|
||||
|
||||
b0 = sitd->max_bibs_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -1071,7 +1066,6 @@ nat_ipfix_logging_nat64_bibe (u32 thread_index, u8 nat_event,
|
||||
}
|
||||
|
||||
b0 = sitd->nat64_bib_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
@@ -1175,7 +1169,6 @@ nat_ipfix_logging_nat64_ses (u32 thread_index, u8 nat_event,
|
||||
}
|
||||
|
||||
b0 = sitd->nat64_ses_buffer = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -749,7 +749,6 @@ nat_ha_event_add (nat_ha_event_t *event, u8 do_flush, u32 session_thread_index,
|
||||
|
||||
b = td->state_sync_buffer = vlib_get_buffer (vm, bi);
|
||||
clib_memset (vnet_buffer (b), 0, sizeof (*vnet_buffer (b)));
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
offset = 0;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -964,7 +964,6 @@ send_ip46_ping (vlib_main_t * vm,
|
||||
ERROR_OUT (SEND_PING_ALLOC_FAIL);
|
||||
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
/*
|
||||
* if the user did not provide a source interface,
|
||||
|
||||
@@ -175,7 +175,6 @@ VNET_DEVICE_CLASS_TX_FN (vmxnet3_device_class) (vlib_main_t * vm,
|
||||
for (i = 0; i < space_needed; i++)
|
||||
{
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
desc_idx = txq->tx_ring.produce;
|
||||
|
||||
|
||||
@@ -313,7 +313,6 @@ vrrp_adv_send (vrrp_vr_t * vr, int shutdown)
|
||||
bi0 = vec_elt (bi, i);
|
||||
b = vlib_get_buffer (vm, bi0);
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
|
||||
vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
|
||||
vnet_buffer (b)->sw_if_index[VLIB_TX] = vr->config.sw_if_index;
|
||||
@@ -500,7 +499,6 @@ vrrp_garp_or_na_send (vrrp_vr_t * vr)
|
||||
addr = vec_elt_at_index (vr->config.vr_addrs, i);
|
||||
b = vlib_get_buffer (vm, bi[i]);
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
|
||||
vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
|
||||
vnet_buffer (b)->sw_if_index[VLIB_TX] = vr->config.sw_if_index;
|
||||
@@ -704,7 +702,6 @@ vrrp_vr_multicast_group_join (vrrp_vr_t * vr)
|
||||
|
||||
b = vlib_get_buffer (vm, bi);
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
|
||||
|
||||
vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
|
||||
|
||||
+25
-21
@@ -98,6 +98,15 @@ enum
|
||||
#define VLIB_BUFFER_FLAG_USER(n) (1 << LOG2_VLIB_BUFFER_FLAG_USER(n))
|
||||
#define VLIB_BUFFER_FLAGS_ALL (0x0f)
|
||||
|
||||
/** \brief Compile time buffer trajectory tracing option
|
||||
Turn this on if you run into "bad monkey" contexts,
|
||||
and you want to know exactly which nodes they've visited...
|
||||
See vlib/main.c...
|
||||
*/
|
||||
#ifndef VLIB_BUFFER_TRACE_TRAJECTORY
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY 0
|
||||
#endif /* VLIB_BUFFER_TRACE_TRAJECTORY */
|
||||
|
||||
/** VLIB buffer representation. */
|
||||
typedef union
|
||||
{
|
||||
@@ -169,6 +178,20 @@ typedef union
|
||||
/**< More opaque data, see ../vnet/vnet/buffer.h */
|
||||
u32 opaque2[14];
|
||||
|
||||
#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
|
||||
/** trace trajectory data - we use a specific cacheline for that in the
|
||||
* buffer when it is compiled-in */
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY_MAX 31
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY_SZ 64
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) (b)->trajectory_nb = 0
|
||||
CLIB_ALIGN_MARK (trajectory, 64);
|
||||
u16 trajectory_nb;
|
||||
u16 trajectory_trace[VLIB_BUFFER_TRACE_TRAJECTORY_MAX];
|
||||
#else /* VLIB_BUFFER_TRACE_TRAJECTORY */
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY_SZ 0
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b)
|
||||
#endif /* VLIB_BUFFER_TRACE_TRAJECTORY */
|
||||
|
||||
/** start of buffer headroom */
|
||||
CLIB_ALIGN_MARK (headroom, 64);
|
||||
|
||||
@@ -191,7 +214,8 @@ typedef union
|
||||
#endif
|
||||
} vlib_buffer_t;
|
||||
|
||||
STATIC_ASSERT_SIZEOF (vlib_buffer_t, 128 + VLIB_BUFFER_PRE_DATA_SIZE);
|
||||
STATIC_ASSERT_SIZEOF (vlib_buffer_t, 128 + VLIB_BUFFER_TRACE_TRAJECTORY_SZ +
|
||||
VLIB_BUFFER_PRE_DATA_SIZE);
|
||||
STATIC_ASSERT (VLIB_BUFFER_PRE_DATA_SIZE % CLIB_CACHE_LINE_BYTES == 0,
|
||||
"VLIB_BUFFER_PRE_DATA_SIZE must be divisible by cache line size");
|
||||
|
||||
@@ -477,26 +501,6 @@ typedef struct
|
||||
|
||||
clib_error_t *vlib_buffer_main_init (struct vlib_main_t *vm);
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
/** \brief Compile time buffer trajectory tracing option
|
||||
Turn this on if you run into "bad monkey" contexts,
|
||||
and you want to know exactly which nodes they've visited...
|
||||
See vlib/main.c...
|
||||
*/
|
||||
#define VLIB_BUFFER_TRACE_TRAJECTORY 0
|
||||
|
||||
#if VLIB_BUFFER_TRACE_TRAJECTORY > 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 */
|
||||
|
||||
extern u16 __vlib_buffer_external_hdr_size;
|
||||
#define VLIB_BUFFER_SET_EXT_HDR_SIZE(x) \
|
||||
static void __clib_constructor \
|
||||
|
||||
+4
-19
@@ -934,29 +934,14 @@ vlib_elog_main_loop_event (vlib_main_t * vm,
|
||||
}
|
||||
}
|
||||
|
||||
#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_buffer_trace_trajectory_init (vlib_buffer_t * b)
|
||||
{
|
||||
if (PREDICT_TRUE (vlib_buffer_trace_trajectory_init_cb != 0))
|
||||
{
|
||||
(*vlib_buffer_trace_trajectory_init_cb) (b);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
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))
|
||||
{
|
||||
(*vlib_buffer_trace_trajectory_cb) (b, node_index);
|
||||
}
|
||||
if (PREDICT_FALSE (b->trajectory_nb >= VLIB_BUFFER_TRACE_TRAJECTORY_MAX))
|
||||
return;
|
||||
b->trajectory_trace[b->trajectory_nb] = node_index;
|
||||
b->trajectory_nb++;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1340,7 +1340,6 @@ list(APPEND VNET_SOURCES
|
||||
util/radix.c
|
||||
util/refcount.c
|
||||
util/throttle.c
|
||||
util/trajectory.c
|
||||
)
|
||||
|
||||
list(APPEND VNET_HEADERS
|
||||
|
||||
@@ -924,7 +924,6 @@ bfd_send_echo (vlib_main_t * vm, vlib_node_runtime_t * rt,
|
||||
}
|
||||
vlib_buffer_t *b = vlib_get_buffer (vm, bi);
|
||||
ASSERT (b->current_data == 0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
bfd_echo_pkt_t *pkt = vlib_buffer_get_current (b);
|
||||
clib_memset (pkt, 0, sizeof (*pkt));
|
||||
pkt->discriminator = bs->local_discr;
|
||||
@@ -993,7 +992,6 @@ bfd_send_periodic (vlib_main_t * vm, vlib_node_runtime_t * rt,
|
||||
}
|
||||
vlib_buffer_t *b = vlib_get_buffer (vm, bi);
|
||||
ASSERT (b->current_data == 0);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
|
||||
bfd_init_control_frame (bm, bs, b);
|
||||
switch (bs->poll_state)
|
||||
{
|
||||
|
||||
@@ -422,11 +422,6 @@ bond_tx_inline (vlib_main_t * vm, bond_if_t * bif, vlib_buffer_t ** b,
|
||||
CLIB_PREFETCH (pb[3]->data, CLIB_CACHE_LINE_BYTES, LOAD);
|
||||
}
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
|
||||
|
||||
if (lb_alg == BOND_LB_L2)
|
||||
{
|
||||
h[0] = bond_lb_l2 (b[0]);
|
||||
@@ -474,8 +469,6 @@ bond_tx_inline (vlib_main_t * vm, bond_if_t * bif, vlib_buffer_t ** b,
|
||||
|
||||
while (n_left > 0)
|
||||
{
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
|
||||
if (bif->lb == BOND_LB_L2)
|
||||
h[0] = bond_lb_l2 (b[0]);
|
||||
else if (bif->lb == BOND_LB_L34)
|
||||
|
||||
@@ -328,11 +328,6 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
&n_rx_packets, &n_rx_bytes);
|
||||
}
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
|
||||
|
||||
/* next */
|
||||
n_left -= 4;
|
||||
b += 4;
|
||||
@@ -352,8 +347,6 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
bond_sw_if_idx_rewrite (vm, node, b[0], bond_sw_if_index,
|
||||
&n_rx_packets, &n_rx_bytes);
|
||||
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
|
||||
|
||||
/* next */
|
||||
n_left -= 1;
|
||||
b += 1;
|
||||
|
||||
@@ -491,13 +491,6 @@ typedef struct
|
||||
{
|
||||
struct
|
||||
{
|
||||
#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
|
||||
/* buffer trajectory tracing */
|
||||
u16 *trajectory_trace;
|
||||
#endif
|
||||
};
|
||||
struct
|
||||
{
|
||||
u64 pad[1];
|
||||
u64 pg_replay_timestamp;
|
||||
};
|
||||
|
||||
@@ -332,7 +332,6 @@ af_packet_device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
}
|
||||
|
||||
/* trace */
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (first_b0);
|
||||
if (PREDICT_FALSE
|
||||
(n_trace > 0 && vlib_trace_buffer (vm, node, next0, first_b0,
|
||||
/* follow_chain */ 0)))
|
||||
|
||||
@@ -522,8 +522,6 @@ virtio_device_input_gso_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
}
|
||||
|
||||
/* trace */
|
||||
VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
|
||||
|
||||
if (PREDICT_FALSE (n_trace > 0 && vlib_trace_buffer (vm, node, next0, b0, /* follow_chain */
|
||||
1)))
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user