]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
cgroups: use bpf log when logging at trace level
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 30 Jan 2021 11:15:31 +0000 (12:15 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sat, 30 Jan 2021 15:55:52 +0000 (16:55 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgroup2_devices.c

index 657640b8ba82cfc8fa68786a56300781c3b037e5..21d5609049f01d91fc2f14e857b338649a55260c 100644 (file)
@@ -27,6 +27,7 @@
 
 lxc_log_define(cgroup2_devices, cgroup);
 
+#define BPF_LOG_BUF_SIZE (1 << 23) /* 8MB */
 #ifndef BPF_LOG_LEVEL1
 #define BPF_LOG_LEVEL1 1
 #endif
@@ -321,17 +322,25 @@ int bpf_program_finalize(struct bpf_program *prog)
        return bpf_program_add_instructions(prog, ins, ARRAY_SIZE(ins));
 }
 
-static int bpf_program_load_kernel(struct bpf_program *prog, char *log_buf,
-                                  __u32 log_size, __u32 log_level)
+static int bpf_program_load_kernel(struct bpf_program *prog)
 {
+       __do_free char *log_buf = NULL;
+       __u32 log_level = 0, log_size = 0;
        union bpf_attr *attr;
 
-       if ((log_size != 0 && !log_buf) || (log_size == 0 && log_buf))
-               return ret_errno(EINVAL);
-
        if (prog->kernel_fd >= 0)
                return 0;
 
+       if (lxc_log_get_level() <= LXC_LOG_LEVEL_TRACE) {
+               log_buf = zalloc(BPF_LOG_BUF_SIZE);
+               if (!log_buf) {
+                       WARN("Failed to allocate bpf log buffer");
+               } else {
+                       log_level = BPF_LOG_LEVEL;
+                       log_size = BPF_LOG_BUF_SIZE;
+               }
+       }
+
        attr = &(union bpf_attr){
                .prog_type      = prog->prog_type,
                .insns          = PTR_TO_UINT64(prog->instructions),
@@ -376,7 +385,7 @@ int bpf_program_cgroup_attach(struct bpf_program *prog, int type,
                        return true;
        }
 
-       ret = bpf_program_load_kernel(prog, NULL, 0, 0);
+       ret = bpf_program_load_kernel(prog);
        if (ret < 0)
                return log_error_errno(-1, ret, "Failed to load bpf program");
 
@@ -543,7 +552,7 @@ bool bpf_devices_cgroup_supported(void)
        if (ret < 0)
                return log_trace(false, "Failed to add new instructions to bpf device cgroup program");
 
-       ret = bpf_program_load_kernel(prog, NULL, 0, 0);
+       ret = bpf_program_load_kernel(prog);
        if (ret < 0)
                return log_trace(false, "Failed to load new bpf device cgroup program");