| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /* SPDX-License-Identifier: LGPL-2.1 */
- #include <errno.h>
- #include "util/debug.h"
- #include "util/rlimit.h"
- #include <sys/time.h>
- #include <sys/resource.h>
- /*
- * Bump the memlock so that we can get bpf maps of a reasonable size,
- * like the ones used with 'perf trace' and with 'perf test bpf',
- * improve this to some specific request if needed.
- */
- void rlimit__bump_memlock(void)
- {
- struct rlimit rlim;
- if (getrlimit(RLIMIT_MEMLOCK, &rlim) == 0) {
- rlim.rlim_cur *= 4;
- rlim.rlim_max *= 4;
- if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) {
- rlim.rlim_cur /= 2;
- rlim.rlim_max /= 2;
- if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0)
- pr_debug("Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc\n");
- }
- }
- }
- bool rlimit__increase_nofile(enum rlimit_action *set_rlimit)
- {
- int old_errno;
- struct rlimit l;
- if (*set_rlimit < INCREASED_MAX) {
- old_errno = errno;
- if (getrlimit(RLIMIT_NOFILE, &l) == 0) {
- if (*set_rlimit == NO_CHANGE) {
- l.rlim_cur = l.rlim_max;
- } else {
- l.rlim_cur = l.rlim_max + 1000;
- l.rlim_max = l.rlim_cur;
- }
- if (setrlimit(RLIMIT_NOFILE, &l) == 0) {
- (*set_rlimit) += 1;
- errno = old_errno;
- return true;
- }
- }
- errno = old_errno;
- }
- return false;
- }
|