[dpdk-stable] patch 'test: optimise fd closing in forks' has been queued to LTS release 17.11.10
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Thu Dec 19 15:34:26 CET 2019
Hi,
FYI, your patch has been queued to LTS release 17.11.10
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 12/21/19. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Thanks.
Luca Boccassi
---
>From b4b273762aacf76a06374c3672a5065a0e693c5b Mon Sep 17 00:00:00 2001
From: Krzysztof Kanas <kkanas at marvell.com>
Date: Tue, 12 Nov 2019 21:31:02 +0100
Subject: [PATCH] test: optimise fd closing in forks
[ upstream commit 18562261abadfbdf7e19006c381bcb1d6fd6c2fe ]
Caught while investigating timeouts on a ARM64 server.
Stracing a test process running the eal_flags_autotest, we can see that
the fork helper is checking all possible file descriptors from
getdtablesize() to 2, and close the existing ones.
We can do better by inspecting this forked process /proc/self/fd
directory.
Besides, checking file descriptors via /proc/self/fd only makes sense for
Linux. This code was a noop on FreeBSD.
Fixes: af75078fece3 ("first public release")
Signed-off-by: Krzysztof Kanas <kkanas at marvell.com>
Signed-off-by: David Marchand <david.marchand at redhat.com>
Tested-by: Krzysztof Kanas <kkanas at marvell.com>
Acked-by: Kevin Traynor <ktraynor at redhat.com>
---
test/test/process.h | 51 +++++++++++++++++++++++++++++++++++++++------
1 file changed, 45 insertions(+), 6 deletions(-)
diff --git a/test/test/process.h b/test/test/process.h
index 51ced12237..505d2f9e7a 100644
--- a/test/test/process.h
+++ b/test/test/process.h
@@ -34,6 +34,8 @@
#ifndef _PROCESS_H_
#define _PROCESS_H_
+#include <dirent.h>
+
#ifdef RTE_EXEC_ENV_BSDAPP
#define self "curproc"
#define exe "file"
@@ -53,7 +55,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
{
int num;
char *argv_cpy[numargs + 1];
- int i, fd, status;
+ int i, status;
char path[32];
pid_t pid = fork();
@@ -66,13 +68,50 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
argv_cpy[i] = NULL;
num = numargs;
- /* close all open file descriptors, check /proc/self/fd to only
- * call close on open fds. Exclude fds 0, 1 and 2*/
- for (fd = getdtablesize(); fd > 2; fd-- ) {
- snprintf(path, sizeof(path), "/proc/" exe "/fd/%d", fd);
- if (access(path, F_OK) == 0)
+#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) {
+ 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]);
--
2.20.1
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2019-12-19 14:32:31.059399500 +0000
+++ 0119-test-optimise-fd-closing-in-forks.patch 2019-12-19 14:32:26.297301633 +0000
@@ -1,8 +1,10 @@
-From 18562261abadfbdf7e19006c381bcb1d6fd6c2fe Mon Sep 17 00:00:00 2001
+From b4b273762aacf76a06374c3672a5065a0e693c5b Mon Sep 17 00:00:00 2001
From: Krzysztof Kanas <kkanas at marvell.com>
Date: Tue, 12 Nov 2019 21:31:02 +0100
Subject: [PATCH] test: optimise fd closing in forks
+[ upstream commit 18562261abadfbdf7e19006c381bcb1d6fd6c2fe ]
+
Caught while investigating timeouts on a ARM64 server.
Stracing a test process running the eal_flags_autotest, we can see that
@@ -15,38 +17,38 @@
Linux. This code was a noop on FreeBSD.
Fixes: af75078fece3 ("first public release")
-Cc: stable at dpdk.org
Signed-off-by: Krzysztof Kanas <kkanas at marvell.com>
Signed-off-by: David Marchand <david.marchand at redhat.com>
Tested-by: Krzysztof Kanas <kkanas at marvell.com>
Acked-by: Kevin Traynor <ktraynor at redhat.com>
---
- app/test/process.h | 50 ++++++++++++++++++++++++++++++++++++++++------
- 1 file changed, 44 insertions(+), 6 deletions(-)
+ test/test/process.h | 51 +++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 45 insertions(+), 6 deletions(-)
-diff --git a/app/test/process.h b/app/test/process.h
-index 128ce41219..191d2796a9 100644
---- a/app/test/process.h
-+++ b/app/test/process.h
-@@ -11,6 +11,7 @@
- #include <stdlib.h> /* NULL */
- #include <string.h> /* strerror */
- #include <unistd.h> /* readlink */
-+#include <dirent.h>
- #include <sys/wait.h>
+diff --git a/test/test/process.h b/test/test/process.h
+index 51ced12237..505d2f9e7a 100644
+--- a/test/test/process.h
++++ b/test/test/process.h
+@@ -34,6 +34,8 @@
+ #ifndef _PROCESS_H_
+ #define _PROCESS_H_
- #include <rte_string_fns.h> /* strlcpy */
-@@ -40,7 +41,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
++#include <dirent.h>
++
+ #ifdef RTE_EXEC_ENV_BSDAPP
+ #define self "curproc"
+ #define exe "file"
+@@ -53,7 +55,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
{
int num;
char *argv_cpy[numargs + 1];
- int i, fd, status;
+ int i, status;
char path[32];
- #ifdef RTE_LIBRTE_PDUMP
- pthread_t thread;
-@@ -56,13 +57,50 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
+
+ pid_t pid = fork();
+@@ -66,13 +68,50 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
argv_cpy[i] = NULL;
num = numargs;
More information about the stable
mailing list