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 <[email protected]> --- 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

