From 4354317bf3592d81fcafd94e33b320c3e49f45d3 Mon Sep 17 00:00:00 2001 From: Benoît Ganne Date: Mon, 21 Oct 2019 15:13:54 +0200 Subject: vlib: only dump 1st buffer in chain by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several nodes include buffers in their traces, but only the 1st. When formatting the trace we must not try to iterate through all chained buffers. Default to display only the 1st buffer. Type: fix Change-Id: Ib3c668bbf4ab70ae68eba2ac402c7b7329825b70 Signed-off-by: Benoît Ganne --- src/plugins/vmxnet3/format.c | 2 +- src/vlib/buffer.c | 15 +++++++++++++-- src/vlib/buffer.h | 2 +- src/vlib/buffer_funcs.h | 2 +- src/vnet/buffer.c | 2 +- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/plugins/vmxnet3/format.c b/src/plugins/vmxnet3/format.c index 8e39b5faf36..d463feb3bec 100644 --- a/src/plugins/vmxnet3/format.c +++ b/src/plugins/vmxnet3/format.c @@ -164,7 +164,7 @@ format_vmxnet3_input_trace (u8 * s, va_list * args) s = format (s, "vmxnet3: %v (%d) next-node %U", hi->name, t->hw_if_index, format_vlib_next_node_name, vm, node->index, t->next_index); - s = format (s, "\n buffer %U", format_vlib_buffer, &t->buffer); + s = format (s, "\n buffer %U", format_vnet_buffer, &t->buffer); return s; } diff --git a/src/vlib/buffer.c b/src/vlib/buffer.c index 9838e23e0d5..43b1dd63761 100644 --- a/src/vlib/buffer.c +++ b/src/vlib/buffer.c @@ -92,7 +92,7 @@ vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, } u8 * -format_vlib_buffer (u8 * s, va_list * args) +format_vlib_buffer_no_chain (u8 * s, va_list * args) { vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); u32 indent = format_get_indent (s); @@ -118,9 +118,20 @@ format_vlib_buffer (u8 * s, va_list * args) s = format (s, "\n%U%v", format_white_space, indent, a); vec_free (a); + return s; +} + +u8 * +format_vlib_buffer (u8 * s, va_list * args) +{ + vlib_main_t *vm = vlib_get_main (); + vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); + u32 indent = format_get_indent (s); + + s = format (s, "%U", format_vlib_buffer_no_chain, b); + while (b->flags & VLIB_BUFFER_NEXT_PRESENT) { - vlib_main_t *vm = vlib_get_main (); u32 next_buffer = b->next_buffer; b = vlib_get_buffer (vm, next_buffer); diff --git a/src/vlib/buffer.h b/src/vlib/buffer.h index c2ca8214162..8ca198de68e 100644 --- a/src/vlib/buffer.h +++ b/src/vlib/buffer.h @@ -72,7 +72,7 @@ */ #define foreach_vlib_buffer_flag \ _( 0, IS_TRACED, 0) \ - _( 1, NEXT_PRESENT, 0) \ + _( 1, NEXT_PRESENT, "next-present") \ _( 2, TOTAL_LENGTH_VALID, 0) \ _( 3, EXT_HDR_VALID, "ext-hdr-valid") diff --git a/src/vlib/buffer_funcs.h b/src/vlib/buffer_funcs.h index 2ba9f1cb894..cfb48344648 100644 --- a/src/vlib/buffer_funcs.h +++ b/src/vlib/buffer_funcs.h @@ -1332,7 +1332,7 @@ vlib_buffer_chain_append_data_with_alloc (vlib_main_t * vm, void vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * first); format_function_t format_vlib_buffer, format_vlib_buffer_and_data, - format_vlib_buffer_contents; + format_vlib_buffer_contents, format_vlib_buffer_no_chain; typedef struct { diff --git a/src/vnet/buffer.c b/src/vnet/buffer.c index cf61780cb74..3cb6b948d2b 100644 --- a/src/vnet/buffer.c +++ b/src/vnet/buffer.c @@ -45,7 +45,7 @@ format_vnet_buffer (u8 * s, va_list * args) if (b->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID) a = format (a, "loop-counter %d ", vnet_buffer2 (b)->loop_counter); - s = format (s, "%U", format_vlib_buffer, b); + s = format (s, "%U", format_vlib_buffer_no_chain, b); if (a) s = format (s, "\n%U%v", format_white_space, indent, a); vec_free (a); -- cgit 1.2.3-korg