summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-04-24 10:06:58 (GMT)
committerGitHub <noreply@github.com>2020-04-24 10:06:58 (GMT)
commite6f8abd500751a834b6fff4f107ecbd29f2184fe (patch)
treeb6c864b0239aba840849bb4dba8a94d7b57b5b68
parent162c567d164b5742c0d1f3f8bd8c8bab9c117cd0 (diff)
downloadcpython-e6f8abd500751a834b6fff4f107ecbd29f2184fe.zip
cpython-e6f8abd500751a834b6fff4f107ecbd29f2184fe.tar.gz
cpython-e6f8abd500751a834b6fff4f107ecbd29f2184fe.tar.bz2
bpo-38061: subprocess uses closefrom() on FreeBSD (GH-19697)
Optimize the subprocess module on FreeBSD using closefrom(). A single close(fd) syscall is cheap, but when sysconf(_SC_OPEN_MAX) is high, the loop calling close(fd) on each file descriptor can take several milliseconds. The workaround on FreeBSD to improve performance was to load and mount the fdescfs kernel module, but this is not enabled by default. Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans (kevans) and Kubilay Kocak (koobs): https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274
-rw-r--r--Doc/whatsnew/3.9.rst4
-rw-r--r--Misc/NEWS.d/next/Library/2020-04-24-01-55-00.bpo-38061.XmULB3.rst11
-rw-r--r--Modules/_posixsubprocess.c8
3 files changed, 22 insertions, 1 deletions
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index ee85170..325121d 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -471,6 +471,10 @@ Optimizations
until the main thread handles signals.
(Contributed by Victor Stinner in :issue:`40010`.)
+* Optimize the :mod:`subprocess` module on FreeBSD using ``closefrom()``.
+ (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor
+ Stinner in :issue:`38061`.)
+
Build and C API Changes
=======================
diff --git a/Misc/NEWS.d/next/Library/2020-04-24-01-55-00.bpo-38061.XmULB3.rst b/Misc/NEWS.d/next/Library/2020-04-24-01-55-00.bpo-38061.XmULB3.rst
new file mode 100644
index 0000000..603d80b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-04-24-01-55-00.bpo-38061.XmULB3.rst
@@ -0,0 +1,11 @@
+Optimize the :mod:`subprocess` module on FreeBSD using ``closefrom()``.
+A single ``close(fd)`` syscall is cheap, but when ``sysconf(_SC_OPEN_MAX)`` is
+high, the loop calling ``close(fd)`` on each file descriptor can take several
+milliseconds.
+
+The workaround on FreeBSD to improve performance was to load and mount the
+fdescfs kernel module, but this is not enabled by default.
+
+Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans (kevans) and
+Kubilay Kocak (koobs):
+https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index 7d5a7fe..60dd78d 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -264,9 +264,15 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
start_fd = keep_fd + 1;
}
if (start_fd <= end_fd) {
+#if defined(__FreeBSD__)
+ /* Any errors encountered while closing file descriptors are ignored */
+ closefrom(start_fd);
+#else
for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
- close(fd_num);
+ /* Ignore errors */
+ (void)close(fd_num);
}
+#endif
}
}