kfunc
struct bpf_kfunc_meta kfunc;
err = fetch_kfunc_meta(env, func_id, offset, &kfunc);
meta->btf = kfunc.btf;
meta->func_id = kfunc.id;
meta->func_proto = kfunc.proto;
meta->func_name = kfunc.name;
if (!kfunc.flags || !btf_kfunc_is_allowed(kfunc.btf, kfunc.id, env->prog))
meta->kfunc_flags = *kfunc.flags;
struct bpf_kfunc_meta *kfunc)
memset(kfunc, 0, sizeof(*kfunc));
kfunc->btf = btf;
kfunc->id = func_id;
kfunc->name = func_name;
kfunc->proto = func_proto;
kfunc->flags = kfunc_flags;
struct bpf_kfunc_meta kfunc;
err = fetch_kfunc_meta(env, func_id, offset, &kfunc);
addr = kallsyms_lookup_name(kfunc.name);
verbose(env, "cannot find address for kernel function %s\n", kfunc.name);
err = btf_distill_func_proto(&env->log, kfunc.btf, kfunc.proto, kfunc.name, &func_model);
kfunc.name = id->name;
kfunc.btf_id = func_id;
kfunc.flags = flags;
err = push_kfunc(ctx, &kfunc);
static int process_kfunc_with_implicit_args(struct btf2btf_context *ctx, struct kfunc *kfunc)
t = (struct btf_type *)btf__type_by_id(btf, kfunc->btf_id);
pr_err("ERROR: resolve_btfids: btf id %d is not a function\n", kfunc->btf_id);
len = snprintf(tmp_name, sizeof(tmp_name), "%s%s", kfunc->name, KF_IMPL_SUFFIX);
pr_err("ERROR: function name is too long: %s%s\n", kfunc->name, KF_IMPL_SUFFIX);
if (t->type != kfunc->btf_id)
pr_err("ERROR: resolve_btfids: failed to add func proto for %s\n", kfunc->name);
param_name, kfunc->name);
t = (struct btf_type *)btf__type_by_id(btf, kfunc->btf_id);
pr_debug("resolve_btfids: updated BTF for kfunc with implicit args %s\n", kfunc->name);
struct kfunc *kfunc = &ctx.kfuncs[i];
if (!(kfunc->flags & KF_IMPLICIT_ARGS))
err = process_kfunc_with_implicit_args(&ctx, kfunc);
struct kfunc *kfuncs;
static int push_kfunc(struct btf2btf_context *ctx, struct kfunc *kfunc)
struct kfunc *arr = ctx->kfuncs;
arr = realloc(arr, sizeof(struct kfunc) * cap);
ctx->kfuncs[ctx->nr_kfuncs++] = *kfunc;
struct kfunc kfunc;
prog_type == BPF_PROG_TYPE_LSM) && test->kfunc) {
attach_btf_id = libbpf_find_vmlinux_btf_id(test->kfunc,
test->kfunc);
const char *kfunc;
const char *kfunc;
while (fixup_kfunc_btf_id->kfunc) {
fixup_kfunc_btf_id->kfunc,
fixup_kfunc_btf_id->kfunc,
.kfunc = "bpf_fentry_test7",
.kfunc = "bpf_fentry_test1",
.kfunc = "bpf_fentry_test1",
.kfunc = "task",
.kfunc = "bpf",
.kfunc = "bpf_fentry_test1",
.kfunc = "sched_switch",
.kfunc = "bpf_fentry_test1",