From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: Thomas Monjalon <thomas@monjalon.net>,
Reshma Pattan <reshma.pattan@intel.com>,
Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH 04/10] test: uninline helper for forking
Date: Fri, 17 Jul 2026 11:29:59 +0200 [thread overview]
Message-ID: <20260717093006.229370-5-david.marchand@redhat.com> (raw)
In-Reply-To: <20260717093006.229370-1-david.marchand@redhat.com>
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@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
next prev parent reply other threads:[~2026-07-17 9:30 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-17 9:29 [PATCH 00/10] Limit usage of internal API in tests David Marchand
2026-07-17 9:29 ` [PATCH 01/10] bbdev: fix stats aggregation from queues David Marchand
2026-07-17 17:22 ` Chautru, Nicolas
2026-07-17 9:29 ` [PATCH 02/10] bbdev: add per-queue statistics API David Marchand
2026-07-17 9:29 ` [PATCH 03/10] hash: fix GFNI stubs export David Marchand
2026-07-17 9:38 ` Bruce Richardson
2026-07-17 9:55 ` Konstantin Ananyev
2026-07-17 9:29 ` David Marchand [this message]
2026-07-17 9:39 ` [PATCH 04/10] test: uninline helper for forking Bruce Richardson
2026-07-17 9:30 ` [PATCH 05/10] test/bonding: get MAC address with public API David Marchand
2026-07-17 9:30 ` [PATCH 06/10] test/devargs: check driver presence " David Marchand
2026-07-17 9:55 ` Bruce Richardson
2026-07-17 10:08 ` David Marchand
2026-07-17 10:14 ` Bruce Richardson
2026-07-17 12:34 ` David Marchand
2026-07-17 12:56 ` Thomas Monjalon
2026-07-17 9:30 ` [PATCH 07/10] test/vdev: find device " David Marchand
2026-07-17 9:30 ` [PATCH 08/10] test: limit internal API usage David Marchand
2026-07-17 9:30 ` [PATCH 09/10] ci: make ABI reference generation faster David Marchand
2026-07-17 9:30 ` [PATCH 10/10] ci: run reference unit tests against ABI David Marchand
2026-07-17 9:35 ` [PATCH 00/10] Limit usage of internal API in tests David Marchand
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=20260717093006.229370-5-david.marchand@redhat.com \
--to=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=reshma.pattan@intel.com \
--cc=stephen@networkplumber.org \
--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