[PATCH v9 12/18] eal: automatically init arg list options
Bruce Richardson
bruce.richardson at intel.com
Fri Oct 3 10:15:04 CEST 2025
The tailq list options from commandline require initialization before
being used. This was being done by explicitly initing those values in
the collate function. A better option is to do so using macros at time
of structure definition, that way, adding a new list option does not
require any other code changes to initialize it.
Since we are now including the same header 3 times, and need to undefine
the macros between inclusions, we simplify things by just doing the
undef calls at the end of the included header.
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
lib/eal/common/eal_common_options.c | 30 ++++++++++++-----------------
lib/eal/common/eal_option_list.h | 7 +++++++
2 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index db74bf2c61..d7a8263f08 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -74,9 +74,19 @@ struct eal_init_args {
#define INCLUDE_ALL_ARG 1 /* for struct definition, include even unsupported values */
#include "eal_option_list.h"
-#undef INCLUDE_ALL_ARG
};
-struct eal_init_args args;
+
+/* define the structure itself, with initializers. Only the LIST_ARGS need init */
+#define LIST_ARG(long, short, help_str, fieldname) .fieldname = TAILQ_HEAD_INITIALIZER(args.fieldname),
+#define STR_ARG(long, short, help_str, fieldname)
+#define OPT_STR_ARG(long, short, help_str, fieldname)
+#define BOOL_ARG(long, short, help_str, fieldname)
+#define STR_ALIAS(long, short, help_str, fieldname)
+
+struct eal_init_args args = {
+ #include "eal_option_list.h"
+};
+#undef INCLUDE_ALL_ARG
/* an rte_argparse callback to append the argument to an arg_list
* in args. The index is the offset into the struct of the list.
@@ -109,13 +119,6 @@ eal_usage(const struct rte_argparse *obj)
rte_application_usage_hook(obj->prog_name);
}
-/* undef the *_ARG macros before redefining to generate the argparse arg list */
-#undef LIST_ARG
-#undef STR_ARG
-#undef OPT_STR_ARG
-#undef BOOL_ARG
-#undef STR_ALIAS
-
/* For arguments which have an arg_list type, they use callback (no val_saver),
* require a value, and have the SUPPORT_MULTI flag.
*/
@@ -216,15 +219,6 @@ eal_collate_args(int argc, char **argv)
if (argc < 1 || argv == NULL)
return -EINVAL;
- /* initialize the list of arguments */
- memset(&args, 0, sizeof(args));
- TAILQ_INIT(&args.allow);
- TAILQ_INIT(&args.block);
- TAILQ_INIT(&args.driver_path);
- TAILQ_INIT(&args.log_level);
- TAILQ_INIT(&args.trace);
- TAILQ_INIT(&args.vdev);
-
/* parse the arguments */
eal_argparse.prog_name = argv[0];
int retval = rte_argparse_parse(&eal_argparse, argc, argv);
diff --git a/lib/eal/common/eal_option_list.h b/lib/eal/common/eal_option_list.h
index 6a0c501680..f5c21c8376 100644
--- a/lib/eal/common/eal_option_list.h
+++ b/lib/eal/common/eal_option_list.h
@@ -88,3 +88,10 @@ STR_ALIAS("--socket-limit", NULL, "Alias for --numa-limit", numa_limit)
STR_ARG("--vfio-intr", NULL, "VFIO interrupt mode (legacy|msi|msix)", vfio_intr)
STR_ARG("--vfio-vf-token", NULL, "VF token (UUID) shared between SR-IOV PF and VFs", vfio_vf_token)
#endif
+
+/* undefine all used defines */
+#undef LIST_ARG
+#undef STR_ARG
+#undef OPT_STR_ARG
+#undef BOOL_ARG
+#undef STR_ALIAS
--
2.48.1
More information about the dev
mailing list