
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ICA1GK -------------------------------- The 'generic_single' iter prog type will be used for implementing multiple interfaces that need just one iteration and hooking just seq_show() for their printing. Signed-off-by: GONG Ruiqi <gongruiqi1@huawei.com> --- kernel/Makefile | 2 + kernel/bpf-rvi/Kconfig | 1 - kernel/bpf-rvi/Makefile | 4 ++ kernel/bpf-rvi/generic_single_iter.c | 71 ++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 kernel/bpf-rvi/Makefile create mode 100644 kernel/bpf-rvi/generic_single_iter.c diff --git a/kernel/Makefile b/kernel/Makefile index 1fe46db40806..da4c2d1838dc 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -140,6 +140,8 @@ KCOV_INSTRUMENT_stackleak.o := n obj-$(CONFIG_SCF_TORTURE_TEST) += scftorture.o +obj-$(CONFIG_BPF_RVI) += bpf-rvi/ + $(obj)/configs.o: $(obj)/config_data.gz targets += config_data config_data.gz diff --git a/kernel/bpf-rvi/Kconfig b/kernel/bpf-rvi/Kconfig index b198b8442310..a23cf696f021 100644 --- a/kernel/bpf-rvi/Kconfig +++ b/kernel/bpf-rvi/Kconfig @@ -16,4 +16,3 @@ config BPF_RVI be a substitute for LXCFS with better performance and scalability. If you are unsure how to answer this question, answer N. - diff --git a/kernel/bpf-rvi/Makefile b/kernel/bpf-rvi/Makefile new file mode 100644 index 000000000000..8c226d5f1b3e --- /dev/null +++ b/kernel/bpf-rvi/Makefile @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2025 Huawei Technologies Co., Ltd + +obj-y := generic_single_iter.o diff --git a/kernel/bpf-rvi/generic_single_iter.c b/kernel/bpf-rvi/generic_single_iter.c new file mode 100644 index 000000000000..3c85304cf4e6 --- /dev/null +++ b/kernel/bpf-rvi/generic_single_iter.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2025 Huawei Technologies Co., Ltd */ + +#include <linux/init.h> +#include <linux/filter.h> +#include <linux/btf_ids.h> +#include <linux/bpf.h> + +static void *generic_single_seq_start(struct seq_file *seq, loff_t *pos) +{ + return *pos < 1 ? (void *)1 : NULL; +} + +static void *generic_single_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + ++*pos; + return NULL; +} + +static void generic_single_seq_stop(struct seq_file *seq, void *v) +{ +} + +struct bpf_iter__generic_single { + __bpf_md_ptr(struct bpf_iter_meta *, meta); +}; + +static int generic_single_seq_show(struct seq_file *seq, void *v) +{ + struct bpf_iter_meta meta; + struct bpf_iter__generic_single ctx; + struct bpf_prog *prog; + + meta.seq = seq; + prog = bpf_iter_get_info(&meta, false); + if (!prog) + return 0; + + ctx.meta = &meta; + return bpf_iter_run_prog(prog, &ctx); +} + +static const struct seq_operations generic_single_seq_ops = { + .start = generic_single_seq_start, + .next = generic_single_seq_next, + .stop = generic_single_seq_stop, + .show = generic_single_seq_show, +}; + +/* + * Users of "generic_single" iter type: + */ +DEFINE_BPF_ITER_FUNC(generic_single, struct bpf_iter_meta *meta) + +static const struct bpf_iter_seq_info generic_single_seq_info = { + .seq_ops = &generic_single_seq_ops, + .init_seq_private = NULL, + .fini_seq_private = NULL, + .seq_priv_size = 0, +}; + +static struct bpf_iter_reg generic_single_reg_info = { + .target = "generic_single", + .seq_info = &generic_single_seq_info, +}; + +static int __init generic_single_iter_init(void) +{ + return bpf_iter_reg_target(&generic_single_reg_info); +} +late_initcall(generic_single_iter_init); -- 2.25.1