From: Chengwen Feng <fengchengwen@huawei.com>
To: <thomas@monjalon.net>, <honest.jiang@foxmail.com>
Cc: <dev@dpdk.org>, <liuyonglong@huawei.com>
Subject: [PATCH 03/10] app/dma-perf: use argparse lib to parse argument
Date: Tue, 12 Aug 2025 10:07:01 +0800 [thread overview]
Message-ID: <20250812020708.16186-4-fengchengwen@huawei.com> (raw)
In-Reply-To: <20250812020708.16186-1-fengchengwen@huawei.com>
This commit uses argparse API to parse arguments.
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
app/test-dma-perf/main.c | 96 ++++++++++++++++++++++-------------
app/test-dma-perf/meson.build | 2 +-
2 files changed, 63 insertions(+), 35 deletions(-)
diff --git a/app/test-dma-perf/main.c b/app/test-dma-perf/main.c
index 54a5e573fc..fd54f46da2 100644
--- a/app/test-dma-perf/main.c
+++ b/app/test-dma-perf/main.c
@@ -12,6 +12,7 @@
#include <inttypes.h>
#include <libgen.h>
+#include <rte_argparse.h>
#include <rte_eal.h>
#include <rte_cfgfile.h>
#include <rte_string_fns.h>
@@ -26,13 +27,8 @@
#define DMA_MEM_COPY "DMA_MEM_COPY"
#define CPU_MEM_COPY "CPU_MEM_COPY"
-#define CMDLINE_CONFIG_ARG "--config"
-#define CMDLINE_RESULT_ARG "--result"
-
#define MAX_PARAMS_PER_ENTRY 4
-#define MAX_LONG_OPT_SZ 64
-
enum {
TEST_TYPE_NONE = 0,
TEST_TYPE_DMA_MEM_COPY,
@@ -45,6 +41,9 @@ static struct test_configure test_cases[MAX_TEST_CASES];
#define GLOBAL_SECTION_NAME "GLOBAL"
static struct global_configure global_cfg;
+static char *config_path;
+static char *result_path;
+
char output_str[MAX_WORKER_NB + 1][MAX_OUTPUT_STR_LEN];
static FILE *fd;
@@ -524,54 +523,83 @@ load_configs(const char *path)
return i;
}
-int
-main(int argc, char *argv[])
+static int
+parse_args(int argc, char **argv)
{
+ static struct rte_argparse obj = {
+ .prog_name = "test-dma-perf",
+ .usage = "[optional parameters]",
+ .descriptor = NULL,
+ .epilog = NULL,
+ .exit_on_error = true,
+ .args = {
+ { "--config", NULL, "Specify a configuration file",
+ (void *)&config_path, NULL,
+ RTE_ARGPARSE_VALUE_REQUIRED, RTE_ARGPARSE_VALUE_TYPE_STR,
+ },
+ { "--result", NULL, "Optional, specify a result file name",
+ (void *)&result_path, NULL,
+ RTE_ARGPARSE_VALUE_REQUIRED, RTE_ARGPARSE_VALUE_TYPE_STR,
+ },
+ ARGPARSE_ARG_END(),
+ },
+ };
+ char rst_path[PATH_MAX + 16] = {0};
int ret;
- uint16_t case_nb;
- uint32_t i, nb_lcores;
- pid_t cpid, wpid;
- int wstatus;
- char *cfg_path_ptr = NULL;
- char *rst_path_ptr = NULL;
- char rst_path[PATH_MAX];
-
- for (i = 0; i < (uint32_t)argc; i++) {
- if (strncmp(argv[i], CMDLINE_CONFIG_ARG, MAX_LONG_OPT_SZ) == 0)
- cfg_path_ptr = argv[i + 1];
- if (strncmp(argv[i], CMDLINE_RESULT_ARG, MAX_LONG_OPT_SZ) == 0)
- rst_path_ptr = argv[i + 1];
- }
- if (cfg_path_ptr == NULL) {
+
+ ret = rte_argparse_parse(&obj, argc, argv);
+ if (ret < 0)
+ exit(1);
+
+ if (config_path == NULL) {
printf("Config file not assigned.\n");
- return -1;
+ exit(1);
}
- if (rst_path_ptr == NULL) {
- strlcpy(rst_path, cfg_path_ptr, PATH_MAX);
+
+ if (result_path == NULL) {
+ strlcpy(rst_path, config_path, PATH_MAX);
char *token = strtok(basename(rst_path), ".");
if (token == NULL) {
printf("Config file error.\n");
- return -1;
+ exit(1);
}
strcat(token, "_result.csv");
- rst_path_ptr = rst_path;
+ result_path = strdup(rst_path);
+ if (result_path == NULL) {
+ printf("Generate result file path error.\n");
+ exit(1);
+ }
}
-
- case_nb = load_configs(cfg_path_ptr);
- fd = fopen(rst_path_ptr, "w");
+ fd = fopen(result_path, "w");
if (fd == NULL) {
printf("Open output CSV file error.\n");
- return -1;
+ exit(1);
}
fclose(fd);
+ return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+ uint32_t i, nb_lcores;
+ pid_t cpid, wpid;
+ uint16_t case_nb;
+ int wstatus;
+ int ret;
+
+ parse_args(argc, argv);
+
+ case_nb = load_configs(config_path);
+
printf("Running cases...\n");
for (i = 0; i < case_nb; i++) {
if (test_cases[i].is_skip) {
printf("Test case %d configured to be skipped.\n\n", i + 1);
snprintf(output_str[0], MAX_OUTPUT_STR_LEN, "Skip the test-case %d\n",
i + 1);
- if (open_output_csv(rst_path_ptr))
+ if (open_output_csv(result_path))
return 0;
continue;
}
@@ -579,7 +607,7 @@ main(int argc, char *argv[])
if (!test_cases[i].is_valid) {
printf("Invalid test case %d.\n\n", i + 1);
snprintf(output_str[0], MAX_OUTPUT_STR_LEN, "Invalid case %d\n", i + 1);
- if (open_output_csv(rst_path_ptr))
+ if (open_output_csv(result_path))
return 0;
continue;
}
@@ -601,7 +629,7 @@ main(int argc, char *argv[])
rte_exit(EXIT_FAILURE,
"There should be at least 2 worker lcores.\n");
- fd = fopen(rst_path_ptr, "a");
+ fd = fopen(result_path, "a");
if (!fd) {
printf("Open output CSV file error.\n");
return 0;
diff --git a/app/test-dma-perf/meson.build b/app/test-dma-perf/meson.build
index 40d6b7f8e4..02af3128d8 100644
--- a/app/test-dma-perf/meson.build
+++ b/app/test-dma-perf/meson.build
@@ -7,7 +7,7 @@ if is_windows
subdir_done()
endif
-deps += ['dmadev', 'mbuf', 'cfgfile']
+deps += ['dmadev', 'mbuf', 'cfgfile', 'argparse']
sources = files(
'main.c',
--
2.17.1
next prev parent reply other threads:[~2025-08-12 2:07 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-11 10:54 [PATCH 0/9] bugfix and refactor of dma-perf Chengwen Feng
2025-08-11 10:54 ` [PATCH 1/9] app/dma-perf: fix use-after-free Chengwen Feng
2025-08-11 10:54 ` [PATCH 2/9] app/dma-perf: add global section for config file Chengwen Feng
2025-08-11 10:54 ` [PATCH 3/9] app/dma-perf: use argparse lib to parse argument Chengwen Feng
2025-08-11 10:54 ` [PATCH 4/9] app/dma-perf: refactor output csv Chengwen Feng
2025-08-11 10:54 ` [PATCH 5/9] app/dma-perf: support list DMA devices Chengwen Feng
2025-08-11 10:54 ` [PATCH 6/9] app/dma-perf: add more global config Chengwen Feng
2025-08-11 10:54 ` [PATCH 7/9] app/dma-perf: remove invalid or redundant field Chengwen Feng
2025-08-11 10:54 ` [PATCH 8/9] app/dma-perf: refactor load config function Chengwen Feng
2025-08-11 10:54 ` [PATCH 9/9] app/dma-perf: refactor benchmark function Chengwen Feng
2025-08-12 2:06 ` [PATCH 00/10] bugfix and refactor of dma-perf Chengwen Feng
2025-08-12 2:06 ` [PATCH 01/10] app/dma-perf: fix use-after-free Chengwen Feng
2025-08-12 2:07 ` [PATCH 02/10] app/dma-perf: add global section for config file Chengwen Feng
2025-08-12 2:07 ` Chengwen Feng [this message]
2025-08-12 2:07 ` [PATCH 04/10] app/dma-perf: refactor output csv Chengwen Feng
2025-08-12 2:07 ` [PATCH 05/10] app/dma-perf: support list DMA devices Chengwen Feng
2025-08-12 2:07 ` [PATCH 06/10] app/dma-perf: add more global config Chengwen Feng
2025-08-12 2:07 ` [PATCH 07/10] app/dma-perf: remove invalid or redundant field Chengwen Feng
2025-08-12 2:07 ` [PATCH 08/10] app/dma-perf: refactor load config function Chengwen Feng
2025-08-12 2:07 ` [PATCH 09/10] app/dma-perf: refactor benchmark function Chengwen Feng
2025-08-12 2:07 ` [PATCH 10/10] app/dma-perf: support specific error info Chengwen Feng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250812020708.16186-4-fengchengwen@huawei.com \
--to=fengchengwen@huawei.com \
--cc=dev@dpdk.org \
--cc=honest.jiang@foxmail.com \
--cc=liuyonglong@huawei.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).