diff options
Diffstat (limited to 'meta/recipes-devtools/rpm/files/0002-Optimize-rpmSetCloseOnExec.patch')
-rw-r--r-- | meta/recipes-devtools/rpm/files/0002-Optimize-rpmSetCloseOnExec.patch | 100 |
1 files changed, 0 insertions, 100 deletions
diff --git a/meta/recipes-devtools/rpm/files/0002-Optimize-rpmSetCloseOnExec.patch b/meta/recipes-devtools/rpm/files/0002-Optimize-rpmSetCloseOnExec.patch deleted file mode 100644 index a27f8e6237..0000000000 --- a/meta/recipes-devtools/rpm/files/0002-Optimize-rpmSetCloseOnExec.patch +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | From 5e6f05cd8dad6c1ee6bd1e6e43f176976c9c3416 Mon Sep 17 00:00:00 2001 | ||
2 | From: Kir Kolyshkin <kolyshkin@gmail.com> | ||
3 | Date: Tue, 29 May 2018 17:52:56 -0700 | ||
4 | Subject: [PATCH 2/3] Optimize rpmSetCloseOnExec | ||
5 | |||
6 | In case maximum number of open files limit is set too high, both | ||
7 | luaext/Pexec() and lib/doScriptExec() spend way too much time | ||
8 | trying to set FD_CLOEXEC flag for all those file descriptors, | ||
9 | resulting in severe increase of time it takes to execute say | ||
10 | rpm or dnf. | ||
11 | |||
12 | This becomes increasingly noticeable when running with e.g. under | ||
13 | Docker, the reason being: | ||
14 | |||
15 | > $ docker run fedora ulimit -n | ||
16 | > 1048576 | ||
17 | |||
18 | One obvious fix is to use procfs to get the actual list of opened fds | ||
19 | and iterate over it. My quick-n-dirty benchmark shows the /proc approach | ||
20 | is about 10x faster than iterating through a list of just 1024 fds, | ||
21 | so it's an improvement even for default ulimit values. | ||
22 | |||
23 | Note that the old method is still used in case /proc is not available. | ||
24 | |||
25 | While at it, | ||
26 | |||
27 | 1. fix the function by making sure we modify (rather than set) | ||
28 | the existing flags. As the only known flag is FD_CLOEXEC, | ||
29 | this change is currently purely aesthetical, but in case | ||
30 | other flags will appear it will become a real bug fix. | ||
31 | |||
32 | 2. get rid of magic number 3; use STDERR_FILENO | ||
33 | |||
34 | Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com> | ||
35 | |||
36 | Fixes #444 | ||
37 | |||
38 | Upstream-Status: Accepted [https://github.com/rpm-software-management/rpm/pull/444] | ||
39 | Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> | ||
40 | --- | ||
41 | rpmio/rpmio.c | 43 ++++++++++++++++++++++++++++++++++--------- | ||
42 | 1 file changed, 34 insertions(+), 9 deletions(-) | ||
43 | |||
44 | diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c | ||
45 | index ea111d2ec..55351c221 100644 | ||
46 | --- a/rpmio/rpmio.c | ||
47 | +++ b/rpmio/rpmio.c | ||
48 | @@ -1760,18 +1760,43 @@ DIGEST_CTX fdDupDigest(FD_t fd, int id) | ||
49 | return ctx; | ||
50 | } | ||
51 | |||
52 | +static void set_cloexec(int fd) | ||
53 | +{ | ||
54 | + int flags = fcntl(fd, F_GETFD); | ||
55 | + | ||
56 | + if (flags == -1 || (flags & FD_CLOEXEC)) | ||
57 | + return; | ||
58 | + | ||
59 | + fcntl(fd, F_SETFD, flags | FD_CLOEXEC); | ||
60 | +} | ||
61 | + | ||
62 | void rpmSetCloseOnExec(void) | ||
63 | { | ||
64 | - int flag, fdno, open_max; | ||
65 | + const int min_fd = STDERR_FILENO; /* don't touch stdin/out/err */ | ||
66 | + int fd; | ||
67 | + | ||
68 | + DIR *dir = opendir("/proc/self/fd"); | ||
69 | + if (dir == NULL) { /* /proc not available */ | ||
70 | + /* iterate over all possible fds, might be slow */ | ||
71 | + int open_max = sysconf(_SC_OPEN_MAX); | ||
72 | + if (open_max == -1) | ||
73 | + open_max = 1024; | ||
74 | |||
75 | - open_max = sysconf(_SC_OPEN_MAX); | ||
76 | - if (open_max == -1) { | ||
77 | - open_max = 1024; | ||
78 | + for (fd = min_fd + 1; fd < open_max; fd++) | ||
79 | + set_cloexec(fd); | ||
80 | + | ||
81 | + return; | ||
82 | } | ||
83 | - for (fdno = 3; fdno < open_max; fdno++) { | ||
84 | - flag = fcntl(fdno, F_GETFD); | ||
85 | - if (flag == -1 || (flag & FD_CLOEXEC)) | ||
86 | - continue; | ||
87 | - fcntl(fdno, F_SETFD, FD_CLOEXEC); | ||
88 | + | ||
89 | + /* iterate over fds obtained from /proc */ | ||
90 | + struct dirent *entry; | ||
91 | + while ((entry = readdir(dir)) != NULL) { | ||
92 | + fd = atoi(entry->d_name); | ||
93 | + if (fd > min_fd) | ||
94 | + set_cloexec(fd); | ||
95 | } | ||
96 | + | ||
97 | + closedir(dir); | ||
98 | + | ||
99 | + return; | ||
100 | } | ||