]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38061: subprocess uses closefrom() on FreeBSD (GH-19697)
authorVictor Stinner <vstinner@python.org>
Fri, 24 Apr 2020 10:06:58 +0000 (12:06 +0200)
committerGitHub <noreply@github.com>
Fri, 24 Apr 2020 10:06:58 +0000 (12:06 +0200)
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

Doc/whatsnew/3.9.rst
Misc/NEWS.d/next/Library/2020-04-24-01-55-00.bpo-38061.XmULB3.rst [new file with mode: 0644]
Modules/_posixsubprocess.c

index ee851706055a30ceb6e69f8c023876736b824eab..325121df139816abe3ac5d68d58ba5cecce170c6 100644 (file)
@@ -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 (file)
index 0000000..603d80b
--- /dev/null
@@ -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
index 7d5a7fe17c075e72fee3eb601b431d457c4baddf..60dd78d92a4f524c79390faf5048ae2d93c9ade3 100644 (file)
@@ -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
     }
 }