From: Shani Peretz <[email protected]> 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 <mempool_name> [file_name] Dump the history of one mbuf: testpmd> dump_mbuf_history_single Signed-off-by: Shani Peretz <[email protected]> --- 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 <rte_gro.h> #endif #include <rte_mbuf_dyn.h> +#include <rte_mbuf_history.h> #include <rte_trace.h> #include <cmdline_rdline.h> @@ -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 <mbuf_ptr>\n" + " Dumps the history for a specific mbuf (use 0x<address> format)\n\n" + + "dump_mbuf_history_single_mempool <mempool_name> [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 <file_name>: 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<address>\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 <mbuf_ptr>: 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 <mempool_name>: 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 <mempool_name> <file_name>: 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

