From: Valentine Krasnobaeva Date: Wed, 10 Jul 2024 10:33:39 +0000 (+0200) Subject: REORG: fd: move raise_rlim_nofile to limits X-Git-Tag: v3.1-dev4~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3759674047ca5fd0e5cbcc021570e8b98538e623;p=thirdparty%2Fhaproxy.git REORG: fd: move raise_rlim_nofile to limits Let's move raise_rlim_nofile() from 'fd' compilation unit to 'limits', as it wraps setrlimit to change process RLIMIT_NOFILE. --- diff --git a/include/haproxy/fd.h b/include/haproxy/fd.h index 11212ffcdf..7b8e8997b2 100644 --- a/include/haproxy/fd.h +++ b/include/haproxy/fd.h @@ -82,7 +82,6 @@ ssize_t fd_write_frag_line(int fd, size_t maxlen, const struct ist pfx[], size_t void my_closefrom(int start); struct rlimit; -int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit); int compute_poll_timeout(int next); void fd_leaving_poll(int wait_time, int status); diff --git a/include/haproxy/limits.h b/include/haproxy/limits.h index 2a76e2c95d..4db6989b33 100644 --- a/include/haproxy/limits.h +++ b/include/haproxy/limits.h @@ -9,4 +9,9 @@ #define _HAPROXY_LIMITS_H #include +/* handlers to manipulate system resources limits granted by OS to process and + * to tie them up with the internal process limits + */ +int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit); + #endif /* _HAPROXY_LIMITS_H */ diff --git a/src/fd.c b/src/fd.c index 9b625157e5..2dd2655270 100644 --- a/src/fd.c +++ b/src/fd.c @@ -1019,32 +1019,6 @@ void my_closefrom(int start) } #endif // defined(USE_POLL) -/* Sets the RLIMIT_NOFILE setting to and returns the previous one - * in if the pointer is not NULL, even if set_rlimit() fails. The - * two pointers may point to the same variable as the copy happens after - * setting the new value. The value is only changed if at least one of the new - * limits is strictly higher than the current one, otherwise returns 0 without - * changing anything. The getrlimit() or setrlimit() syscall return value is - * returned and errno is preserved. - */ -int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit) -{ - struct rlimit limit = { }; - int ret = 0; - - ret = getrlimit(RLIMIT_NOFILE, &limit); - - if (ret == 0 && - (limit.rlim_max < new_limit->rlim_max || - limit.rlim_cur < new_limit->rlim_cur)) { - ret = setrlimit(RLIMIT_NOFILE, new_limit); - } - - if (old_limit) - *old_limit = limit; - - return ret; -} /* Computes the bounded poll() timeout based on the next expiration timer * by bounding it to MAX_DELAY_MS. may equal TICK_ETERNITY. The pollers diff --git a/src/limits.c b/src/limits.c index a80a2ac217..8d0bf7b463 100644 --- a/src/limits.c +++ b/src/limits.c @@ -11,3 +11,29 @@ #include +/* Sets the RLIMIT_NOFILE setting to and returns the previous one + * in if the pointer is not NULL, even if set_rlimit() fails. The + * two pointers may point to the same variable as the copy happens after + * setting the new value. The value is only changed if at least one of the new + * limits is strictly higher than the current one, otherwise returns 0 without + * changing anything. The getrlimit() or setrlimit() syscall return value is + * returned and errno is preserved. + */ +int raise_rlim_nofile(struct rlimit *old_limit, struct rlimit *new_limit) +{ + struct rlimit limit = { }; + int ret = 0; + + ret = getrlimit(RLIMIT_NOFILE, &limit); + + if (ret == 0 && + (limit.rlim_max < new_limit->rlim_max || + limit.rlim_cur < new_limit->rlim_cur)) { + ret = setrlimit(RLIMIT_NOFILE, new_limit); + } + + if (old_limit) + *old_limit = limit; + + return ret; +}