The main change is a move of the single line #include "iterators.lskel.h" from iterators/iterators.c to bpf_preload_kern.c. Which means that generated light skeleton can be used from user space or user mode driver like iterators.c or from the kernel module or the kernel itself. The direct use of light skeleton from the kernel module simplifies the code, since UMD is no longer necessary. The libbpf.a required user space and UMD. The CO-RE in the kernel and generated "loader bpf program" used by the light skeleton are capable to perform complex loading operations traditionally provided by libbpf. In addition UMD approach was launching UMD process every time bpffs has to be mounted. With light skeleton in the kernel the bpf_preload kernel module loads bpf iterators once and pins them multiple times into different bpffs mounts. Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20220209232001.27490-6-alexei.starovoitov@gmail.com
82 lines
1.6 KiB
C
82 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
#include "bpf_preload.h"
|
|
#include "iterators/iterators.lskel.h"
|
|
|
|
static struct bpf_link *maps_link, *progs_link;
|
|
static struct iterators_bpf *skel;
|
|
|
|
static void free_links_and_skel(void)
|
|
{
|
|
if (!IS_ERR_OR_NULL(maps_link))
|
|
bpf_link_put(maps_link);
|
|
if (!IS_ERR_OR_NULL(progs_link))
|
|
bpf_link_put(progs_link);
|
|
iterators_bpf__destroy(skel);
|
|
}
|
|
|
|
static int preload(struct bpf_preload_info *obj)
|
|
{
|
|
strlcpy(obj[0].link_name, "maps.debug", sizeof(obj[0].link_name));
|
|
obj[0].link = maps_link;
|
|
strlcpy(obj[1].link_name, "progs.debug", sizeof(obj[1].link_name));
|
|
obj[1].link = progs_link;
|
|
return 0;
|
|
}
|
|
|
|
static struct bpf_preload_ops ops = {
|
|
.preload = preload,
|
|
.owner = THIS_MODULE,
|
|
};
|
|
|
|
static int load_skel(void)
|
|
{
|
|
int err;
|
|
|
|
skel = iterators_bpf__open();
|
|
if (!skel)
|
|
return -ENOMEM;
|
|
err = iterators_bpf__load(skel);
|
|
if (err)
|
|
goto out;
|
|
err = iterators_bpf__attach(skel);
|
|
if (err)
|
|
goto out;
|
|
maps_link = bpf_link_get_from_fd(skel->links.dump_bpf_map_fd);
|
|
if (IS_ERR(maps_link)) {
|
|
err = PTR_ERR(maps_link);
|
|
goto out;
|
|
}
|
|
progs_link = bpf_link_get_from_fd(skel->links.dump_bpf_prog_fd);
|
|
if (IS_ERR(progs_link)) {
|
|
err = PTR_ERR(progs_link);
|
|
goto out;
|
|
}
|
|
return 0;
|
|
out:
|
|
free_links_and_skel();
|
|
return err;
|
|
}
|
|
|
|
static int __init load(void)
|
|
{
|
|
int err;
|
|
|
|
err = load_skel();
|
|
if (err)
|
|
return err;
|
|
bpf_preload_ops = &ops;
|
|
return err;
|
|
}
|
|
|
|
static void __exit fini(void)
|
|
{
|
|
bpf_preload_ops = NULL;
|
|
free_links_and_skel();
|
|
}
|
|
late_initcall(load);
|
|
module_exit(fini);
|
|
MODULE_LICENSE("GPL");
|