]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: Allow bpf_current_task_under_cgroup() with BPF_CGROUP_*
authorMatteo Croce <teknoraver@meta.com>
Mon, 19 Aug 2024 16:28:05 +0000 (18:28 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 19 Aug 2024 22:25:30 +0000 (15:25 -0700)
The helper bpf_current_task_under_cgroup() currently is only allowed for
tracing programs, allow its usage also in the BPF_CGROUP_* program types.

Move the code from kernel/trace/bpf_trace.c to kernel/bpf/helpers.c,
so it compiles also without CONFIG_BPF_EVENTS.

This will be used in systemd-networkd to monitor the sysctl writes,
and filter it's own writes from others:
https://github.com/systemd/systemd/pull/32212

Signed-off-by: Matteo Croce <teknoraver@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240819162805.78235-3-technoboy85@gmail.com
include/linux/bpf.h
kernel/bpf/cgroup.c
kernel/bpf/helpers.c
kernel/trace/bpf_trace.c

index b9425e410bcbb736f6c4499e32370b2b4d7ca4a2..f0192c173ed8ebc0f247d2793d7e08b8386f68ac 100644 (file)
@@ -3206,6 +3206,7 @@ extern const struct bpf_func_proto bpf_sock_hash_update_proto;
 extern const struct bpf_func_proto bpf_get_current_cgroup_id_proto;
 extern const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto;
 extern const struct bpf_func_proto bpf_get_cgroup_classid_curr_proto;
+extern const struct bpf_func_proto bpf_current_task_under_cgroup_proto;
 extern const struct bpf_func_proto bpf_msg_redirect_hash_proto;
 extern const struct bpf_func_proto bpf_msg_redirect_map_proto;
 extern const struct bpf_func_proto bpf_sk_redirect_hash_proto;
index 8ba73042a23952354311ffd82fd57f9488b72c91..e7113d700b87848b4446e8ee38764c1ff904307d 100644 (file)
@@ -2581,6 +2581,8 @@ cgroup_current_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
        case BPF_FUNC_get_cgroup_classid:
                return &bpf_get_cgroup_classid_curr_proto;
 #endif
+       case BPF_FUNC_current_task_under_cgroup:
+               return &bpf_current_task_under_cgroup_proto;
        default:
                return NULL;
        }
index 26b9649ab4cedf618a7c257cce95889d247e4572..12e3aa40b18084f62632274328cc83a334d90abd 100644 (file)
@@ -2458,6 +2458,29 @@ __bpf_kfunc long bpf_task_under_cgroup(struct task_struct *task,
        return ret;
 }
 
+BPF_CALL_2(bpf_current_task_under_cgroup, struct bpf_map *, map, u32, idx)
+{
+       struct bpf_array *array = container_of(map, struct bpf_array, map);
+       struct cgroup *cgrp;
+
+       if (unlikely(idx >= array->map.max_entries))
+               return -E2BIG;
+
+       cgrp = READ_ONCE(array->ptrs[idx]);
+       if (unlikely(!cgrp))
+               return -EAGAIN;
+
+       return task_under_cgroup_hierarchy(current, cgrp);
+}
+
+const struct bpf_func_proto bpf_current_task_under_cgroup_proto = {
+       .func           = bpf_current_task_under_cgroup,
+       .gpl_only       = false,
+       .ret_type       = RET_INTEGER,
+       .arg1_type      = ARG_CONST_MAP_PTR,
+       .arg2_type      = ARG_ANYTHING,
+};
+
 /**
  * bpf_task_get_cgroup1 - Acquires the associated cgroup of a task within a
  * specific cgroup1 hierarchy. The cgroup1 hierarchy is identified by its
index d557bb11e0ff6202ccf27841d509c0002c57469e..b69a39316c0cecb39181692f99fb84c10879a76c 100644 (file)
@@ -797,29 +797,6 @@ const struct bpf_func_proto bpf_task_pt_regs_proto = {
        .ret_btf_id     = &bpf_task_pt_regs_ids[0],
 };
 
-BPF_CALL_2(bpf_current_task_under_cgroup, struct bpf_map *, map, u32, idx)
-{
-       struct bpf_array *array = container_of(map, struct bpf_array, map);
-       struct cgroup *cgrp;
-
-       if (unlikely(idx >= array->map.max_entries))
-               return -E2BIG;
-
-       cgrp = READ_ONCE(array->ptrs[idx]);
-       if (unlikely(!cgrp))
-               return -EAGAIN;
-
-       return task_under_cgroup_hierarchy(current, cgrp);
-}
-
-static const struct bpf_func_proto bpf_current_task_under_cgroup_proto = {
-       .func           = bpf_current_task_under_cgroup,
-       .gpl_only       = false,
-       .ret_type       = RET_INTEGER,
-       .arg1_type      = ARG_CONST_MAP_PTR,
-       .arg2_type      = ARG_ANYTHING,
-};
-
 struct send_signal_irq_work {
        struct irq_work irq_work;
        struct task_struct *task;
@@ -1480,8 +1457,6 @@ bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
                return &bpf_get_numa_node_id_proto;
        case BPF_FUNC_perf_event_read:
                return &bpf_perf_event_read_proto;
-       case BPF_FUNC_current_task_under_cgroup:
-               return &bpf_current_task_under_cgroup_proto;
        case BPF_FUNC_get_prandom_u32:
                return &bpf_get_prandom_u32_proto;
        case BPF_FUNC_probe_write_user:
@@ -1510,6 +1485,8 @@ bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
                return &bpf_cgrp_storage_get_proto;
        case BPF_FUNC_cgrp_storage_delete:
                return &bpf_cgrp_storage_delete_proto;
+       case BPF_FUNC_current_task_under_cgroup:
+               return &bpf_current_task_under_cgroup_proto;
 #endif
        case BPF_FUNC_send_signal:
                return &bpf_send_signal_proto;