selftests/bpf: Add selftests for bpf_cgroup_ancestor() kfunc
authorDavid Vernet <void@manifault.com>
Tue, 22 Nov 2022 05:54:58 +0000 (23:54 -0600)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 22 Nov 2022 22:45:41 +0000 (14:45 -0800)
bpf_cgroup_ancestor() allows BPF programs to access the ancestor of a
struct cgroup *. This patch adds selftests that validate its expected
behavior.

Signed-off-by: David Vernet <void@manifault.com>
Link: https://lore.kernel.org/r/20221122055458.173143-5-void@manifault.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c
tools/testing/selftests/bpf/progs/cgrp_kfunc_common.h
tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c

index a59b166bbcc45037f238e6beb2ea6869ea0c7d2e..973f0c5af965de4f6cf5f4497365199ffaa8acbe 100644 (file)
@@ -86,6 +86,7 @@ static const char * const success_tests[] = {
        "test_cgrp_acquire_leave_in_map",
        "test_cgrp_xchg_release",
        "test_cgrp_get_release",
+       "test_cgrp_get_ancestors",
 };
 
 static struct {
index 3f18def0e45c0f6743d55bb353665edf8cd8625c..7d30855bfe7861f2706482f69193661dd08f7437 100644 (file)
@@ -23,6 +23,7 @@ struct hash_map {
 struct cgroup *bpf_cgroup_acquire(struct cgroup *p) __ksym;
 struct cgroup *bpf_cgroup_kptr_get(struct cgroup **pp) __ksym;
 void bpf_cgroup_release(struct cgroup *p) __ksym;
+struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __ksym;
 
 static inline struct __cgrps_kfunc_map_value *cgrps_kfunc_map_value_lookup(struct cgroup *cgrp)
 {
index 9f4569f7598bf0765a872a6ab4a4ee4596648e1c..0c23ea32df9f9f163cdaf53314d713fcd71dbe87 100644 (file)
@@ -123,3 +123,48 @@ int BPF_PROG(test_cgrp_get_release, struct cgroup *cgrp, const char *path)
 
        return 0;
 }
+
+SEC("tp_btf/cgroup_mkdir")
+int BPF_PROG(test_cgrp_get_ancestors, struct cgroup *cgrp, const char *path)
+{
+       struct cgroup *self, *ancestor1, *invalid;
+
+       if (!is_test_kfunc_task())
+               return 0;
+
+       self = bpf_cgroup_ancestor(cgrp, cgrp->level);
+       if (!self) {
+               err = 1;
+               return 0;
+       }
+
+       if (self->self.id != cgrp->self.id) {
+               bpf_cgroup_release(self);
+               err = 2;
+               return 0;
+       }
+       bpf_cgroup_release(self);
+
+       ancestor1 = bpf_cgroup_ancestor(cgrp, cgrp->level - 1);
+       if (!ancestor1) {
+               err = 3;
+               return 0;
+       }
+       bpf_cgroup_release(ancestor1);
+
+       invalid = bpf_cgroup_ancestor(cgrp, 10000);
+       if (invalid) {
+               bpf_cgroup_release(invalid);
+               err = 4;
+               return 0;
+       }
+
+       invalid = bpf_cgroup_ancestor(cgrp, -1);
+       if (invalid) {
+               bpf_cgroup_release(invalid);
+               err = 5;
+               return 0;
+       }
+
+       return 0;
+}