Most testpmd commands use spaces not underline as word separator. On Wed, Oct 1, 2025, 01:39 Thomas Monjalon wrote: > From: Shani Peretz > > Dump the mbuf history to the console or to a file. > > The dump will contain: > - Operation history for each mbuf > - Summary and statistics about all mbufs > > Dump the history of all mbuf pools: > testpmd> dump_mbuf_history_all > > Dump the history of one mbuf pool: > testpmd> dump_mbuf_history_single_mempool [file_name] > > Dump the history of one mbuf: > testpmd> dump_mbuf_history_single > > Signed-off-by: Shani Peretz > --- > app/test-pmd/cmdline.c | 246 ++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 245 insertions(+), 1 deletion(-) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index 3731fba370..113db68f8c 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -40,6 +40,7 @@ > #include > #endif > #include > +#include > #include > > #include > @@ -296,6 +297,15 @@ static void cmd_help_long_parsed(void *parsed_result, > "dump_log_types\n" > " Dumps the log level for all the dpdk > modules\n\n" > > + "dump_mbuf_history_all\n" > + " Dumps the mbuf history for all mempools\n\n" > + > + "dump_mbuf_history_single \n" > + " Dumps the history for a specific mbuf (use > 0x
format)\n\n" > + > + "dump_mbuf_history_single_mempool > [file_name]\n" > + " Dumps the history for a specific mempool\n\n" > + > "show port (port_id) speed_lanes capabilities" > " Show speed lanes capabilities of a > port.\n\n" > ); > @@ -9177,6 +9187,8 @@ static void cmd_dump_parsed(void *parsed_result, > #endif > else if (!strcmp(res->dump, "dump_log_types")) > rte_log_dump(stdout); > + else if (!strcmp(res->dump, "dump_mbuf_history_all")) > + rte_mbuf_history_dump_all(stdout); > } > > static cmdline_parse_token_string_t cmd_dump_dump = > @@ -9198,7 +9210,8 @@ cmd_dump_init(void) > #ifndef RTE_EXEC_ENV_WINDOWS > "dump_trace#" > #endif > - "dump_log_types"; > + "dump_log_types#" > + "dump_mbuf_history"; > } > > static cmdline_parse_inst_t cmd_dump = { > @@ -9260,6 +9273,232 @@ static cmdline_parse_inst_t cmd_dump_one = { > }, > }; > > +/* Dump mbuf history to file */ > +struct cmd_dump_mbuf_to_file_result { > + cmdline_fixed_string_t dump; > + cmdline_fixed_string_t file; > +}; > + > +static void cmd_dump_mbuf_to_file_parsed(void *parsed_result, > + struct cmdline *cl, __rte_unused void *data) > +{ > + struct cmd_dump_mbuf_to_file_result *res = parsed_result; > + FILE *file = stdout; > + char *file_name = res->file; > + > + if (strcmp(res->dump, "dump_mbuf_history_all")) { > + cmdline_printf(cl, "Invalid dump type\n"); > + return; > + } > + > + if (file_name && strlen(file_name)) { > + file = fopen(file_name, "w"); > + if (!file) { > + rte_mbuf_history_dump_all(stdout); > + return; > + } > + } > + rte_mbuf_history_dump_all(file); > + printf("Flow dump finished\n"); > + if (file_name && strlen(file_name)) > + fclose(file); > +} > + > +static cmdline_parse_token_string_t cmd_dump_mbuf_to_file_dump = > + TOKEN_STRING_INITIALIZER(struct cmd_dump_mbuf_to_file_result, dump, > + "dump_mbuf_history_all"); > + > +static cmdline_parse_token_string_t cmd_dump_mbuf_to_file_file = > + TOKEN_STRING_INITIALIZER(struct cmd_dump_mbuf_to_file_result, > file, NULL); > + > +static cmdline_parse_inst_t cmd_dump_mbuf_to_file = { > + .f = cmd_dump_mbuf_to_file_parsed, /* function to call */ > + .data = NULL, /* 2nd arg of func */ > + .help_str = "dump_mbuf_history_all : Dump mbuf history > to file", > + .tokens = { /* token list, NULL terminated */ > + (void *)&cmd_dump_mbuf_to_file_dump, > + (void *)&cmd_dump_mbuf_to_file_file, > + NULL, > + }, > +}; > + > +/* Dump single mbuf history */ > +struct cmd_dump_mbuf_history_single_result { > + cmdline_fixed_string_t dump; > + cmdline_fixed_string_t mbuf_ptr; > +}; > + > +static void cmd_dump_mbuf_history_single_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, __rte_unused void *data) > +{ > + struct cmd_dump_mbuf_history_single_result *res = parsed_result; > + struct rte_mbuf *mbuf; > + uintptr_t mbuf_addr; > + > + /* Parse the mbuf pointer from hex string */ > + if (sscanf(res->mbuf_ptr, "0x%" SCNxPTR, &mbuf_addr) != 1) { > + printf("Invalid mbuf pointer format. Use 0x
\n"); > + return; > + } > + > + mbuf = (struct rte_mbuf *)mbuf_addr; > + > + printf("Dumping history for mbuf at %p:\n", mbuf); > + rte_mbuf_history_dump(stdout, mbuf); > +} > + > +static cmdline_parse_token_string_t cmd_dump_mbuf_history_single_dump = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_result, dump, > + "dump_mbuf_history_single"); > + > +static cmdline_parse_token_string_t cmd_dump_mbuf_history_single_ptr = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_result, mbuf_ptr, > + NULL); > + > +static cmdline_parse_inst_t cmd_dump_mbuf_history_single = { > + .f = cmd_dump_mbuf_history_single_parsed, > + .data = NULL, > + .help_str = "dump_mbuf_history_single : Dump history for > specific mbuf", > + .tokens = { > + (void *)&cmd_dump_mbuf_history_single_dump, > + (void *)&cmd_dump_mbuf_history_single_ptr, > + NULL, > + }, > +}; > + > +/* Dump single mempool history */ > +struct cmd_dump_mbuf_history_single_mempool_result { > + cmdline_fixed_string_t dump; > + cmdline_fixed_string_t mempool_name; > +}; > + > +static void cmd_dump_mbuf_history_single_mempool_parsed(void > *parsed_result, > + __rte_unused struct cmdline *cl, __rte_unused void *data) > +{ > + struct cmd_dump_mbuf_history_single_mempool_result *res = > parsed_result; > + struct rte_mempool *mp; > + > + mp = rte_mempool_lookup(res->mempool_name); > + if (mp == NULL) { > + printf("Mempool '%s' not found\n", res->mempool_name); > + return; > + } > + > + printf("Dumping history for mempool '%s':\n", res->mempool_name); > + > + rte_mbuf_history_dump_mempool(stdout, mp); > +} > + > +static cmdline_parse_token_string_t > cmd_dump_mbuf_history_single_mempool_dump = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_mempool_result, > + dump, "dump_mbuf_history_single_mempool"); > + > +static cmdline_parse_token_string_t > cmd_dump_mbuf_history_single_mempool_name = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_mempool_result, > + mempool_name, NULL); > + > +static cmdline_parse_inst_t cmd_dump_mbuf_history_single_mempool = { > + .f = cmd_dump_mbuf_history_single_mempool_parsed, > + .data = NULL, > + .help_str = "dump_mbuf_history_single_mempool : Dump > history for specific mempool", > + .tokens = { > + (void *)&cmd_dump_mbuf_history_single_mempool_dump, > + (void *)&cmd_dump_mbuf_history_single_mempool_name, > + NULL, > + }, > +}; > + > +/* Dump single mempool history to file only */ > +struct cmd_dump_mbuf_history_single_mempool_to_file_result { > + cmdline_fixed_string_t dump; > + cmdline_fixed_string_t mempool_name; > + cmdline_fixed_string_t file; > +}; > + > +static void cmd_dump_mbuf_history_single_mempool_to_file_parsed(void > *parsed_result, > + __rte_unused struct cmdline *cl, __rte_unused void *data) > +{ > + struct cmd_dump_mbuf_history_single_mempool_to_file_result *res = > parsed_result; > + struct rte_mempool *mp; > + FILE *file = NULL; > + char *file_name = res->file; > + > + mp = rte_mempool_lookup(res->mempool_name); > + if (mp == NULL) { > + printf("Mempool '%s' not found\n", res->mempool_name); > + return; > + } > + > + if (file_name && strlen(file_name)) { > + file = fopen(file_name, "w"); > + if (!file) { > + printf("Failed to open file '%s'\n", file_name); > + return; > + } > + } else { > + printf("File name required for this command\n"); > + return; > + } > + > + printf("Dumping history for mempool '%s' to file '%s'...\n", > res->mempool_name, file_name); > + rte_mbuf_history_dump_mempool(file, mp); > + printf("Mempool history dump finished\n"); > + fclose(file); > +} > + > +static cmdline_parse_token_string_t > cmd_dump_mbuf_history_single_mempool_to_file_dump = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_mempool_to_file_result, > + dump, "dump_mbuf_history_single_mempool"); > + > +static cmdline_parse_token_string_t > cmd_dump_mbuf_history_single_mempool_to_file_name = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_mempool_to_file_result, > + mempool_name, NULL); > + > +static cmdline_parse_token_string_t > cmd_dump_mbuf_history_single_mempool_to_file_file = > + TOKEN_STRING_INITIALIZER(struct > cmd_dump_mbuf_history_single_mempool_to_file_result, > + file, NULL); > + > +static cmdline_parse_inst_t cmd_dump_mbuf_history_single_mempool_to_file > = { > + .f = cmd_dump_mbuf_history_single_mempool_to_file_parsed, > + .data = NULL, > + .help_str = "dump_mbuf_history_single_mempool > : Dump history for specific mempool to file", > + .tokens = { > + (void *)&cmd_dump_mbuf_history_single_mempool_to_file_dump, > + (void *)&cmd_dump_mbuf_history_single_mempool_to_file_name, > + (void *)&cmd_dump_mbuf_history_single_mempool_to_file_file, > + NULL, > + }, > +}; > + > +/* Dump all mempools history */ > +struct cmd_dump_mbuf_history_all_result { > + cmdline_fixed_string_t dump; > +}; > + > +static void cmd_dump_mbuf_history_all_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, __rte_unused void *data) > +{ > + __rte_unused struct cmd_dump_mempool_history_all_result *res = > parsed_result; > + > + printf("Dumping history for all mempools:\n"); > + rte_mbuf_history_dump_all(stdout); > +} > + > +static cmdline_parse_token_string_t cmd_dump_mbuf_history_all_dump = > + TOKEN_STRING_INITIALIZER(struct cmd_dump_mbuf_history_all_result, > dump, > + "dump_mbuf_history_all"); > + > +static cmdline_parse_inst_t cmd_dump_mbuf_history_all = { > + .f = cmd_dump_mbuf_history_all_parsed, > + .data = NULL, > + .help_str = "dump_mbuf_history_all: Dump history for all mempools", > + .tokens = { > + (void *)&cmd_dump_mbuf_history_all_dump, > + NULL, > + }, > +}; > + > + > /* *** Filters Control *** */ > > #define IPV4_ADDR_TO_UINT(ip_addr, ip) \ > @@ -13999,6 +14238,11 @@ static cmdline_parse_ctx_t builtin_ctx[] = { > &cmd_cleanup_txq_mbufs, > &cmd_dump, > &cmd_dump_one, > + &cmd_dump_mbuf_to_file, > + &cmd_dump_mbuf_history_single, > + &cmd_dump_mbuf_history_single_mempool, > + &cmd_dump_mbuf_history_single_mempool_to_file, > + &cmd_dump_mbuf_history_all, > &cmd_flow, > &cmd_show_port_meter_cap, > &cmd_add_port_meter_profile_srtcm, > -- > 2.51.0 > >