[PATCH 04/10] test: uninline helper for forking
David Marchand
david.marchand at redhat.com
Fri Jul 17 11:29:59 CEST 2026
There is no reason to keep those helpers inlined.
Besides, this code relies on internal API.
So any consumer of process.h requires internal API.
Move this code in process.c.
Signed-off-by: David Marchand <david.marchand at redhat.com>
---
MAINTAINERS | 1 +
app/test/meson.build | 4 +
app/test/process.c | 229 ++++++++++++++++++++++++++++++++++++++++++
app/test/process.h | 228 ++---------------------------------------
app/test/test_pdump.h | 3 +
5 files changed, 246 insertions(+), 219 deletions(-)
create mode 100644 app/test/process.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 84c528437f..176f58f64c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1950,6 +1950,7 @@ F: app/test/commands.c
F: app/test/packet_burst_generator.c
F: app/test/packet_burst_generator.h
F: app/test/process.h
+F: app/test/process.c
F: app/test/test.c
F: app/test/test.h
F: app/test/test_pmd_perf.c
diff --git a/app/test/meson.build b/app/test/meson.build
index 51abeeb732..d8efa93050 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -5,6 +5,10 @@
deps += ['cmdline', 'ring', 'mempool', 'mbuf']
sources += files('commands.c', 'test.c')
+if not is_windows
+ sources += files('process.c')
+endif
+
# optional dependencies: some files may use these - and so we should link them in -
# but do not explicitly require them so they are not listed in the per-file lists below
optional_deps = ['crypto_scheduler', 'lpm']
diff --git a/app/test/process.c b/app/test/process.c
new file mode 100644
index 0000000000..2b6d7ae84b
--- /dev/null
+++ b/app/test/process.c
@@ -0,0 +1,229 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2014 Intel Corporation
+ */
+
+#include <errno.h> /* errno */
+#include <limits.h> /* PATH_MAX */
+#ifndef RTE_EXEC_ENV_WINDOWS
+#include <sys/wait.h>
+#endif
+#include <stdlib.h> /* NULL */
+#include <string.h> /* strerror */
+#include <unistd.h>
+#include <dirent.h>
+
+#include <rte_string_fns.h> /* strlcpy */
+#include <rte_devargs.h>
+#include <rte_eal.h>
+
+#ifdef RTE_LIB_PDUMP
+#ifdef RTE_NET_RING
+#include <rte_thread.h>
+#include "test_pdump.h"
+#endif
+#endif
+
+#include "test.h"
+#include "process.h"
+
+#define PREFIX_ALLOW "--allow="
+#define PREFIX_DRIVER_PATH "--driver-path="
+
+static int
+add_parameter_allow(char **argv, int max_capacity)
+{
+ struct rte_devargs *devargs;
+ int count = 0;
+
+ RTE_EAL_DEVARGS_FOREACH(NULL, devargs) {
+ if (strlen(devargs->name) == 0)
+ continue;
+
+ if (devargs->data == NULL || strlen(devargs->data) == 0) {
+ if (asprintf(&argv[count], PREFIX_ALLOW"%s", devargs->name) < 0)
+ break;
+ } else {
+ if (asprintf(&argv[count], PREFIX_ALLOW"%s,%s",
+ devargs->name, devargs->data) < 0)
+ break;
+ }
+
+ if (++count == max_capacity)
+ break;
+ }
+
+ return count;
+}
+
+static int
+add_parameter_driver_path(char **argv, int max_capacity)
+{
+ const char *driver_path;
+ int count = 0;
+
+ RTE_EAL_DRIVER_PATH_FOREACH(driver_path, true) {
+ if (asprintf(&argv[count], PREFIX_DRIVER_PATH"%s", driver_path) < 0)
+ break;
+
+ if (++count == max_capacity)
+ break;
+ }
+
+ return count;
+}
+
+int
+process_dup(const char *const argv[], int numargs, const char *env_value)
+{
+ int num = 0;
+ char **argv_cpy;
+ int allow_num;
+ int driver_path_num;
+ int argv_num;
+ int i, status;
+#ifdef RTE_LIB_PDUMP
+#ifdef RTE_NET_RING
+ rte_thread_t thread;
+ int rc;
+#endif
+#endif
+
+ pid_t pid = fork();
+ if (pid < 0)
+ return -1;
+ else if (pid == 0) {
+ allow_num = rte_devargs_type_count(RTE_DEVTYPE_ALLOWED);
+ driver_path_num = rte_eal_driver_path_count(true);
+ argv_num = numargs + allow_num + driver_path_num + 1;
+ argv_cpy = calloc(argv_num, sizeof(char *));
+ if (!argv_cpy)
+ rte_panic("Memory allocation failed\n");
+
+ /* make a copy of the arguments to be passed to exec */
+ for (i = 0; i < numargs; i++) {
+ argv_cpy[i] = strdup(argv[i]);
+ if (argv_cpy[i] == NULL)
+ rte_panic("Error dup args\n");
+ }
+ if (allow_num > 0)
+ num = add_parameter_allow(&argv_cpy[i], allow_num);
+ num += numargs;
+
+ if (driver_path_num > 0) {
+ int added = add_parameter_driver_path(&argv_cpy[num], driver_path_num);
+ num += added;
+ }
+
+#ifdef RTE_EXEC_ENV_LINUX
+ {
+ const char *procdir = "/proc/self/fd/";
+ struct dirent *dirent;
+ char *endptr;
+ int fd, fdir;
+ DIR *dir;
+
+ /* close all open file descriptors, check /proc/self/fd
+ * to only call close on open fds. Exclude fds 0, 1 and
+ * 2
+ */
+ dir = opendir(procdir);
+ if (dir == NULL) {
+ rte_panic("Error opening %s: %s\n", procdir,
+ strerror(errno));
+ }
+
+ fdir = dirfd(dir);
+ if (fdir < 0) {
+ status = errno;
+ closedir(dir);
+ rte_panic("Error %d obtaining fd for dir %s: %s\n",
+ fdir, procdir,
+ strerror(status));
+ }
+
+ while ((dirent = readdir(dir)) != NULL) {
+
+ if (strcmp(dirent->d_name, ".") == 0 ||
+ strcmp(dirent->d_name, "..") == 0)
+ continue;
+
+ errno = 0;
+ fd = strtol(dirent->d_name, &endptr, 10);
+ if (errno != 0 || endptr[0] != '\0') {
+ printf("Error converting name fd %d %s:\n",
+ fd, dirent->d_name);
+ continue;
+ }
+
+ if (fd == fdir || fd <= 2)
+ continue;
+
+ close(fd);
+ }
+ closedir(dir);
+ }
+#endif
+ printf("Running binary with argv[]:");
+ for (i = 0; i < num; i++)
+ printf("'%s' ", argv_cpy[i]);
+ printf("\n");
+ fflush(stdout);
+
+ /* set the environment variable */
+ if (setenv(RECURSIVE_ENV_VAR, env_value, 1) != 0)
+ rte_panic("Cannot export environment variable\n");
+ if (execv(argv_cpy[0], argv_cpy) < 0)
+ rte_panic("Cannot exec: %s\n", strerror(errno));
+ }
+ /* parent process does a wait */
+#ifdef RTE_LIB_PDUMP
+#ifdef RTE_NET_RING
+ if ((strcmp(env_value, "run_pdump_server_tests") == 0)) {
+ rc = rte_thread_create(&thread, NULL, send_pkts, NULL);
+ if (rc != 0) {
+ rte_panic("Cannot start send pkts thread: %s\n",
+ strerror(rc));
+ }
+ }
+#endif
+#endif
+
+ while (wait(&status) != pid)
+ ;
+#ifdef RTE_LIB_PDUMP
+#ifdef RTE_NET_RING
+ if ((strcmp(env_value, "run_pdump_server_tests") == 0)) {
+ flag_for_send_pkts = 0;
+ rte_thread_join(thread, NULL);
+ }
+#endif
+#endif
+ return status;
+}
+
+#ifndef RTE_EXEC_ENV_LINUX
+const char *
+file_prefix_arg(void)
+{
+ return "";
+}
+#else /* RTE_EXEC_ENV_LINUX */
+char *
+get_current_prefix(char *prefix, int size)
+{
+ rte_basename(rte_eal_get_runtime_dir(), prefix, size);
+ return prefix;
+}
+
+/* Return a --file-prefix=XXXX argument */
+const char *
+file_prefix_arg(void)
+{
+ static char prefix[NAME_MAX + sizeof("--file-prefix=")];
+ char tmp[NAME_MAX];
+
+ snprintf(prefix, sizeof(prefix), "--file-prefix=%s",
+ get_current_prefix(tmp, sizeof(tmp)));
+ return prefix;
+}
+#endif /* RTE_EXEC_ENV_LINUX */
diff --git a/app/test/process.h b/app/test/process.h
index 3ee899dbc8..cf2f95f035 100644
--- a/app/test/process.h
+++ b/app/test/process.h
@@ -5,73 +5,7 @@
#ifndef _PROCESS_H_
#define _PROCESS_H_
-#include <errno.h> /* errno */
-#include <limits.h> /* PATH_MAX */
-#ifndef RTE_EXEC_ENV_WINDOWS
-#include <sys/wait.h>
-#endif
-#include <stdlib.h> /* NULL */
-#include <string.h> /* strerror */
-#include <unistd.h>
-#include <dirent.h>
-
-#include <rte_string_fns.h> /* strlcpy */
-#include <rte_devargs.h>
-#include <rte_eal.h>
-
-#ifdef RTE_LIB_PDUMP
-#ifdef RTE_NET_RING
-#include <rte_thread.h>
-extern uint32_t send_pkts(void *empty);
-extern uint16_t flag_for_send_pkts;
-#endif
-#endif
-
-#define PREFIX_ALLOW "--allow="
-#define PREFIX_DRIVER_PATH "--driver-path="
-
-static int
-add_parameter_allow(char **argv, int max_capacity)
-{
- struct rte_devargs *devargs;
- int count = 0;
-
- RTE_EAL_DEVARGS_FOREACH(NULL, devargs) {
- if (strlen(devargs->name) == 0)
- continue;
-
- if (devargs->data == NULL || strlen(devargs->data) == 0) {
- if (asprintf(&argv[count], PREFIX_ALLOW"%s", devargs->name) < 0)
- break;
- } else {
- if (asprintf(&argv[count], PREFIX_ALLOW"%s,%s",
- devargs->name, devargs->data) < 0)
- break;
- }
-
- if (++count == max_capacity)
- break;
- }
-
- return count;
-}
-
-static int
-add_parameter_driver_path(char **argv, int max_capacity)
-{
- const char *driver_path;
- int count = 0;
-
- RTE_EAL_DRIVER_PATH_FOREACH(driver_path, true) {
- if (asprintf(&argv[count], PREFIX_DRIVER_PATH"%s", driver_path) < 0)
- break;
-
- if (++count == max_capacity)
- break;
- }
-
- return count;
-}
+#include <stdint.h>
/*
* launches a second copy of the test process using the given argv parameters,
@@ -79,161 +13,17 @@ add_parameter_driver_path(char **argv, int max_capacity)
* subprocess the source of the call, the env_value parameter is set in the
* environment as $RTE_TEST
*/
-static inline int
-process_dup(const char *const argv[], int numargs, const char *env_value)
-{
- int num = 0;
- char **argv_cpy;
- int allow_num;
- int driver_path_num;
- int argv_num;
- int i, status;
-#ifdef RTE_LIB_PDUMP
-#ifdef RTE_NET_RING
- rte_thread_t thread;
- int rc;
-#endif
-#endif
-
- pid_t pid = fork();
- if (pid < 0)
- return -1;
- else if (pid == 0) {
- allow_num = rte_devargs_type_count(RTE_DEVTYPE_ALLOWED);
- driver_path_num = rte_eal_driver_path_count(true);
- argv_num = numargs + allow_num + driver_path_num + 1;
- argv_cpy = calloc(argv_num, sizeof(char *));
- if (!argv_cpy)
- rte_panic("Memory allocation failed\n");
-
- /* make a copy of the arguments to be passed to exec */
- for (i = 0; i < numargs; i++) {
- argv_cpy[i] = strdup(argv[i]);
- if (argv_cpy[i] == NULL)
- rte_panic("Error dup args\n");
- }
- if (allow_num > 0)
- num = add_parameter_allow(&argv_cpy[i], allow_num);
- num += numargs;
+int process_dup(const char *const argv[], int numargs, const char *env_value);
- if (driver_path_num > 0) {
- int added = add_parameter_driver_path(&argv_cpy[num], driver_path_num);
- num += added;
- }
+/*
+ * Return a --file-prefix=XXXX argument
+ * Note: only Linux supports file prefixes.
+ */
+const char *file_prefix_arg(void);
#ifdef RTE_EXEC_ENV_LINUX
- {
- const char *procdir = "/proc/self/fd/";
- struct dirent *dirent;
- char *endptr;
- int fd, fdir;
- DIR *dir;
-
- /* close all open file descriptors, check /proc/self/fd
- * to only call close on open fds. Exclude fds 0, 1 and
- * 2
- */
- dir = opendir(procdir);
- if (dir == NULL) {
- rte_panic("Error opening %s: %s\n", procdir,
- strerror(errno));
- }
-
- fdir = dirfd(dir);
- if (fdir < 0) {
- status = errno;
- closedir(dir);
- rte_panic("Error %d obtaining fd for dir %s: %s\n",
- fdir, procdir,
- strerror(status));
- }
-
- while ((dirent = readdir(dir)) != NULL) {
-
- if (strcmp(dirent->d_name, ".") == 0 ||
- strcmp(dirent->d_name, "..") == 0)
- continue;
-
- errno = 0;
- fd = strtol(dirent->d_name, &endptr, 10);
- if (errno != 0 || endptr[0] != '\0') {
- printf("Error converting name fd %d %s:\n",
- fd, dirent->d_name);
- continue;
- }
-
- if (fd == fdir || fd <= 2)
- continue;
-
- close(fd);
- }
- closedir(dir);
- }
+/* Get current hugepage file prefix */
+char *get_current_prefix(char *prefix, int size);
#endif
- printf("Running binary with argv[]:");
- for (i = 0; i < num; i++)
- printf("'%s' ", argv_cpy[i]);
- printf("\n");
- fflush(stdout);
-
- /* set the environment variable */
- if (setenv(RECURSIVE_ENV_VAR, env_value, 1) != 0)
- rte_panic("Cannot export environment variable\n");
- if (execv(argv_cpy[0], argv_cpy) < 0)
- rte_panic("Cannot exec: %s\n", strerror(errno));
- }
- /* parent process does a wait */
-#ifdef RTE_LIB_PDUMP
-#ifdef RTE_NET_RING
- if ((strcmp(env_value, "run_pdump_server_tests") == 0)) {
- rc = rte_thread_create(&thread, NULL, send_pkts, NULL);
- if (rc != 0) {
- rte_panic("Cannot start send pkts thread: %s\n",
- strerror(rc));
- }
- }
-#endif
-#endif
-
- while (wait(&status) != pid)
- ;
-#ifdef RTE_LIB_PDUMP
-#ifdef RTE_NET_RING
- if ((strcmp(env_value, "run_pdump_server_tests") == 0)) {
- flag_for_send_pkts = 0;
- rte_thread_join(thread, NULL);
- }
-#endif
-#endif
- return status;
-}
-
-/* Only Linux supports file prefixes. */
-#ifndef RTE_EXEC_ENV_LINUX
-static inline const char *
-file_prefix_arg(void)
-{
- return "";
-}
-#else /* RTE_EXEC_ENV_LINUX */
-static inline char *
-get_current_prefix(char *prefix, int size)
-{
- rte_basename(rte_eal_get_runtime_dir(), prefix, size);
- return prefix;
-}
-
-/* Return a --file-prefix=XXXX argument */
-static inline const char *
-file_prefix_arg(void)
-{
- static char prefix[NAME_MAX + sizeof("--file-prefix=")];
- char tmp[NAME_MAX];
-
- snprintf(prefix, sizeof(prefix), "--file-prefix=%s",
- get_current_prefix(tmp, sizeof(tmp)));
- return prefix;
-}
-#endif /* RTE_EXEC_ENV_LINUX */
#endif /* _PROCESS_H_ */
diff --git a/app/test/test_pdump.h b/app/test/test_pdump.h
index 8746d61269..b026dcc6fb 100644
--- a/app/test/test_pdump.h
+++ b/app/test/test_pdump.h
@@ -11,6 +11,9 @@
/* sample test to send packets to the pdump client recursively */
uint32_t send_pkts(void *empty);
+/* flag to stop send_pkts thread */
+extern uint16_t flag_for_send_pkts;
+
/* Sample test to create setup for the pdump server tests */
int test_pdump_init(void);
--
2.54.0
More information about the dev
mailing list