1 /* SPDX-License-Identifier: LGPL-2.1 */ 2 3 #include <errno.h> 4 #include "util/debug.h" 5 #include "util/rlimit.h" 6 #include <sys/time.h> 7 #include <sys/resource.h> 8 9 /* 10 * Bump the memlock so that we can get bpf maps of a reasonable size, 11 * like the ones used with 'perf trace' and with 'perf test bpf', 12 * improve this to some specific request if needed. 13 */ 14 void rlimit__bump_memlock(void) 15 { 16 struct rlimit rlim; 17 18 if (getrlimit(RLIMIT_MEMLOCK, &rlim) == 0) { 19 rlim.rlim_cur *= 4; 20 rlim.rlim_max *= 4; 21 22 if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) { 23 rlim.rlim_cur /= 2; 24 rlim.rlim_max /= 2; 25 26 if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) 27 pr_debug("Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc\n"); 28 } 29 } 30 } 31 32 bool rlimit__increase_nofile(enum rlimit_action *set_rlimit) 33 { 34 int old_errno; 35 struct rlimit l; 36 37 if (*set_rlimit < INCREASED_MAX) { 38 old_errno = errno; 39 40 if (getrlimit(RLIMIT_NOFILE, &l) == 0) { 41 if (*set_rlimit == NO_CHANGE) { 42 l.rlim_cur = l.rlim_max; 43 } else { 44 l.rlim_cur = l.rlim_max + 1000; 45 l.rlim_max = l.rlim_cur; 46 } 47 if (setrlimit(RLIMIT_NOFILE, &l) == 0) { 48 (*set_rlimit) += 1; 49 errno = old_errno; 50 return true; 51 } 52 } 53 errno = old_errno; 54 } 55 56 return false; 57 } 58