lkml.org 
[lkml]   [2023]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RESEND PATCH bpf-next v6 4/8] bpf: Introduce css open-coded iterator kfuncs
    Date
    This Patch adds kfuncs bpf_iter_css_{new,next,destroy} which allow
    creation and manipulation of struct bpf_iter_css in open-coded iterator
    style. These kfuncs actually wrapps css_next_descendant_{pre, post}.
    css_iter can be used to:

    1) iterating a sepcific cgroup tree with pre/post/up order

    2) iterating cgroup_subsystem in BPF Prog, like
    for_each_mem_cgroup_tree/cpuset_for_each_descendant_pre in kernel.

    The API design is consistent with cgroup_iter. bpf_iter_css_new accepts
    parameters defining iteration order and starting css. Here we also reuse
    BPF_CGROUP_ITER_DESCENDANTS_PRE, BPF_CGROUP_ITER_DESCENDANTS_POST,
    BPF_CGROUP_ITER_ANCESTORS_UP enums.

    Signed-off-by: Chuyi Zhou <zhouchuyi@bytedance.com>
    Acked-by: Tejun Heo <tj@kernel.org>
    ---
    kernel/bpf/cgroup_iter.c | 65 +++++++++++++++++++
    kernel/bpf/helpers.c | 3 +
    .../testing/selftests/bpf/bpf_experimental.h | 6 ++
    3 files changed, 74 insertions(+)

    diff --git a/kernel/bpf/cgroup_iter.c b/kernel/bpf/cgroup_iter.c
    index 810378f04fbc..209e5135f9fb 100644
    --- a/kernel/bpf/cgroup_iter.c
    +++ b/kernel/bpf/cgroup_iter.c
    @@ -294,3 +294,68 @@ static int __init bpf_cgroup_iter_init(void)
    }

    late_initcall(bpf_cgroup_iter_init);
    +
    +struct bpf_iter_css {
    + __u64 __opaque[3];
    +} __attribute__((aligned(8)));
    +
    +struct bpf_iter_css_kern {
    + struct cgroup_subsys_state *start;
    + struct cgroup_subsys_state *pos;
    + unsigned int flags;
    +} __attribute__((aligned(8)));
    +
    +__diag_push();
    +__diag_ignore_all("-Wmissing-prototypes",
    + "Global functions as their definitions will be in vmlinux BTF");
    +
    +__bpf_kfunc int bpf_iter_css_new(struct bpf_iter_css *it,
    + struct cgroup_subsys_state *start, unsigned int flags)
    +{
    + struct bpf_iter_css_kern *kit = (void *)it;
    +
    + BUILD_BUG_ON(sizeof(struct bpf_iter_css_kern) > sizeof(struct bpf_iter_css));
    + BUILD_BUG_ON(__alignof__(struct bpf_iter_css_kern) != __alignof__(struct bpf_iter_css));
    +
    + kit->start = NULL;
    + switch (flags) {
    + case BPF_CGROUP_ITER_DESCENDANTS_PRE:
    + case BPF_CGROUP_ITER_DESCENDANTS_POST:
    + case BPF_CGROUP_ITER_ANCESTORS_UP:
    + break;
    + default:
    + return -EINVAL;
    + }
    +
    + kit->start = start;
    + kit->pos = NULL;
    + kit->flags = flags;
    + return 0;
    +}
    +
    +__bpf_kfunc struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it)
    +{
    + struct bpf_iter_css_kern *kit = (void *)it;
    +
    + if (!kit->start)
    + return NULL;
    +
    + switch (kit->flags) {
    + case BPF_CGROUP_ITER_DESCENDANTS_PRE:
    + kit->pos = css_next_descendant_pre(kit->pos, kit->start);
    + break;
    + case BPF_CGROUP_ITER_DESCENDANTS_POST:
    + kit->pos = css_next_descendant_post(kit->pos, kit->start);
    + break;
    + case BPF_CGROUP_ITER_ANCESTORS_UP:
    + kit->pos = kit->pos ? kit->pos->parent : kit->start;
    + }
    +
    + return kit->pos;
    +}
    +
    +__bpf_kfunc void bpf_iter_css_destroy(struct bpf_iter_css *it)
    +{
    +}
    +
    +__diag_pop();
    \ No newline at end of file
    diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
    index c25941531265..b1d285ed4796 100644
    --- a/kernel/bpf/helpers.c
    +++ b/kernel/bpf/helpers.c
    @@ -2566,6 +2566,9 @@ BTF_ID_FLAGS(func, bpf_iter_css_task_destroy, KF_ITER_DESTROY)
    BTF_ID_FLAGS(func, bpf_iter_task_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
    BTF_ID_FLAGS(func, bpf_iter_task_next, KF_ITER_NEXT | KF_RET_NULL)
    BTF_ID_FLAGS(func, bpf_iter_task_destroy, KF_ITER_DESTROY)
    +BTF_ID_FLAGS(func, bpf_iter_css_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
    +BTF_ID_FLAGS(func, bpf_iter_css_next, KF_ITER_NEXT | KF_RET_NULL)
    +BTF_ID_FLAGS(func, bpf_iter_css_destroy, KF_ITER_DESTROY)
    BTF_ID_FLAGS(func, bpf_dynptr_adjust)
    BTF_ID_FLAGS(func, bpf_dynptr_is_null)
    BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly)
    diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
    index 2f6c747aa874..1386baf9ae4a 100644
    --- a/tools/testing/selftests/bpf/bpf_experimental.h
    +++ b/tools/testing/selftests/bpf/bpf_experimental.h
    @@ -471,4 +471,10 @@ extern int bpf_iter_task_new(struct bpf_iter_task *it,
    extern struct task_struct *bpf_iter_task_next(struct bpf_iter_task *it) __weak __ksym;
    extern void bpf_iter_task_destroy(struct bpf_iter_task *it) __weak __ksym;

    +struct bpf_iter_css;
    +extern int bpf_iter_css_new(struct bpf_iter_css *it,
    + struct cgroup_subsys_state *start, unsigned int flags) __weak __ksym;
    +extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym;
    +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym;
    +
    #endif
    --
    2.20.1
    \
     
     \ /
      Last update: 2023-10-18 08:21    [W:6.369 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site