main: split out reading of /proc/sys/fs/nr_open into its own function

This doesn't really reduce the code size over all, but it does make main.c
shorter and more readable, and that's always a good thing.
This commit is contained in:
Lennart Poettering 2018-06-05 15:21:47 +02:00
parent 0e37c169fb
commit 9264cc39ce
4 changed files with 38 additions and 15 deletions

View file

@ -930,3 +930,27 @@ int fd_reopen(int fd, int flags) {
return new_fd;
}
int read_nr_open(void) {
_cleanup_free_ char *nr_open = NULL;
int r;
/* Returns the kernel's current fd limit, either by reading it of /proc/sys if that works, or using the
* hard-coded default compiled-in value of current kernels (1M) if not. This call will never fail. */
r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open);
if (r < 0)
log_debug_errno(r, "Failed to read /proc/sys/fs/nr_open, ignoring: %m");
else {
int v;
r = safe_atoi(nr_open, &v);
if (r < 0)
log_debug_errno(r, "Failed to parse /proc/sys/fs/nr_open value '%s', ignoring: %m", nr_open);
else
return v;
}
/* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */
return 1024 * 1024;
}

View file

@ -108,3 +108,5 @@ static inline int make_null_stdio(void) {
})
int fd_reopen(int fd, int flags);
int read_nr_open(void);

View file

@ -1136,10 +1136,7 @@ static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching
}
static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
struct rlimit nl;
int r;
int min_max;
_cleanup_free_ char *nr_open = NULL;
int r, nr;
assert(saved_rlimit);
@ -1160,17 +1157,9 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
arg_default_rlimit[RLIMIT_NOFILE] = rl;
}
/* Get current RLIMIT_NOFILE maximum compiled into the kernel. */
r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open);
if (r >= 0)
r = safe_atoi(nr_open, &min_max);
/* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */
if (r < 0)
min_max = 1024 * 1024;
/* Bump up the resource limit for ourselves substantially */
nl.rlim_cur = nl.rlim_max = min_max;
r = setrlimit_closest(RLIMIT_NOFILE, &nl);
/* Bump up the resource limit for ourselves substantially, all the way to the maximum the kernel allows */
nr = read_nr_open();
r = setrlimit_closest(RLIMIT_NOFILE, &RLIMIT_MAKE_CONST(nr));
if (r < 0)
return log_warning_errno(r, "Setting RLIMIT_NOFILE failed, ignoring: %m");

View file

@ -315,7 +315,14 @@ static void test_fd_duplicate_data_fd(void) {
assert_se(read(fd2, &j, sizeof(j)) == 0);
}
static void test_read_nr_open(void) {
log_info("nr-open: %i", read_nr_open());
}
int main(int argc, char *argv[]) {
log_set_max_level(LOG_DEBUG);
test_close_many();
test_close_nointr();
test_same_fd();
@ -324,6 +331,7 @@ int main(int argc, char *argv[]) {
test_fd_move_above_stdio();
test_rearrange_stdio();
test_fd_duplicate_data_fd();
test_read_nr_open();
return 0;
}