58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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;
 | |
| }
 |