All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4l-utils] keytable: ensure we have enough memlock pages
@ 2019-09-04 10:08 Sean Young
  0 siblings, 0 replies; only message in thread
From: Sean Young @ 2019-09-04 10:08 UTC (permalink / raw)
  To: linux-media

Since kernel v5.2, BPF maps and programs are charged against
RLIMT_MEMLOCK. By default this limit is 64KB however all of these are
already taken (16 patges) by the time we've booted on Fedora. This
results in a permission denied.

The error message is confusing since error happens when running as root.
systemd works around this problem by setting setrlimit(RLIMIT_MEMLOCK)
to 64MB. Do the the same.

Signed-off-by: Sean Young <sean@mess.org>
---
 utils/keytable/keytable.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
index 70fbb822..986503a0 100644
--- a/utils/keytable/keytable.c
+++ b/utils/keytable/keytable.c
@@ -25,6 +25,7 @@
 #include <linux/lirc.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
+#include <sys/resource.h>
 #include <sys/stat.h>
 #include <dirent.h>
 #include <argp.h>
@@ -1698,9 +1699,14 @@ static void device_info(int fd, char *prepend)
 
 #ifdef HAVE_BPF
 #define MAX_PROGS 64
+// This value is what systemd sets PID 1 to, see:
+// https://github.com/systemd/systemd/blob/master/src/basic/def.h#L60
+#define HIGH_RLIMIT_MEMLOCK (1024ULL*1024ULL*64ULL)
+
 static void attach_bpf(const char *lirc_name, const char *bpf_prog, struct protocol_param *param)
 {
 	unsigned int features;
+	struct rlimit rl;
 	int fd;
 
 	fd = open(lirc_name, O_RDONLY);
@@ -1721,6 +1727,14 @@ static void attach_bpf(const char *lirc_name, const char *bpf_prog, struct proto
 		return;
 	}
 
+	// BPF programs are charged against RLIMIT_MEMLOCK. We'll need pages
+	// for the state, program text, and any raw IR. None of these are
+	// particularly large. However, the kernel defaults to 64KB
+	// memlock, which is only 16 pages which are mostly used by the
+	// time we are trying to load our BPF program.
+	rl.rlim_cur = rl.rlim_max = HIGH_RLIMIT_MEMLOCK;
+	(void) setrlimit(RLIMIT_MEMLOCK, &rl);
+
 	load_bpf_file(bpf_prog, fd, param, rawtable);
 	close(fd);
 }
-- 
2.21.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-09-04 10:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-04 10:08 [PATCH v4l-utils] keytable: ensure we have enough memlock pages Sean Young

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.