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 */
14void 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
32bool 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