[dpdk-stable] patch 'test: optimise fd closing in forks' has been queued to LTS release 18.11.6

Kevin Traynor ktraynor at redhat.com
Wed Dec 11 22:26:17 CET 2019


Hi,

FYI, your patch has been queued to LTS release 18.11.6

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/17/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.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/c8d8fad706afba896dd43f38f41caa1923e7d977

Thanks.

Kevin.

---
>From c8d8fad706afba896dd43f38f41caa1923e7d977 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, 44 insertions(+), 7 deletions(-)

diff --git a/test/test/process.h b/test/test/process.h
index ba3a18502..f87ff6e72 100644
--- a/test/test/process.h
+++ b/test/test/process.h
@@ -10,4 +10,5 @@
 #include <stdlib.h> /* NULL */
 #include <unistd.h> /* readlink */
+#include <dirent.h>
 
 #ifdef RTE_EXEC_ENV_BSDAPP
@@ -30,6 +31,5 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
 	int num;
 	char *argv_cpy[numargs + 1];
-	int i, fd, status;
-	char path[32];
+	int i, status;
 
 	pid_t pid = fork();
@@ -43,11 +43,48 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
 		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++)
-- 
2.21.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-12-11 21:24:14.704348768 +0000
+++ 0025-test-optimise-fd-closing-in-forks.patch	2019-12-11 21:24:12.627652044 +0000
@@ -1 +1 @@
-From 18562261abadfbdf7e19006c381bcb1d6fd6c2fe Mon Sep 17 00:00:00 2001
+From c8d8fad706afba896dd43f38f41caa1923e7d977 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 18562261abadfbdf7e19006c381bcb1d6fd6c2fe ]
+
@@ -18 +19,0 @@
-Cc: stable at dpdk.org
@@ -25,2 +26,2 @@
- app/test/process.h | 50 ++++++++++++++++++++++++++++++++++++++++------
- 1 file changed, 44 insertions(+), 6 deletions(-)
+ test/test/process.h | 51 ++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 44 insertions(+), 7 deletions(-)
@@ -28,6 +29,6 @@
-diff --git a/app/test/process.h b/app/test/process.h
-index 128ce4121..191d2796a 100644
---- a/app/test/process.h
-+++ b/app/test/process.h
-@@ -12,4 +12,5 @@
- #include <string.h> /* strerror */
+diff --git a/test/test/process.h b/test/test/process.h
+index ba3a18502..f87ff6e72 100644
+--- a/test/test/process.h
++++ b/test/test/process.h
+@@ -10,4 +10,5 @@
+ #include <stdlib.h> /* NULL */
@@ -36 +36,0 @@
- #include <sys/wait.h>
@@ -38 +38,2 @@
-@@ -41,5 +42,5 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
+ #ifdef RTE_EXEC_ENV_BSDAPP
+@@ -30,6 +31,5 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
@@ -41,0 +43 @@
+-	char path[32];
@@ -43,3 +45,3 @@
- 	char path[32];
- #ifdef RTE_LIBRTE_PDUMP
-@@ -57,11 +58,48 @@ process_dup(const char *const argv[], int numargs, const char *env_value)
+ 
+ 	pid_t pid = fork();
+@@ -43,11 +43,48 @@ process_dup(const char *const argv[], int numargs, const char *env_value)



More information about the stable mailing list