All of lore.kernel.org
 help / color / mirror / Atom feed
* Can't reproduce kfunc example in kfuncs documentation, kernel v6.0
@ 2022-10-04  2:18 Henrique Fingler
  2022-10-04 18:44 ` Henrique Fingler
  0 siblings, 1 reply; 2+ messages in thread
From: Henrique Fingler @ 2022-10-04  2:18 UTC (permalink / raw)
  To: bpf

I'm trying to reproduce the example in `Documentation/bpf/kfuncs.rst`
in kernel 6.0
My end goal is to be able to call a kfunc from a kprobe, so the
documentation seemed like a good start.
I've created a file with almost the same content as the documentation
(below) and put it in
net/bpf and added it to the Makefile, with the added __diag directives
that are in
net/bpf/test_run.c around the kfuncs.

 __diag_push();
 __diag_ignore_all("-Wmissing-prototypes",
      "Global functions as their definitions will be in vmlinux BTF");
  u64 bpf_get_task_pid(void) {
    return 1;
  }
   u64 bpf_put_pid(void) {
    return 2;
  }
  __diag_pop();

  BTF_SET8_START(bpf_task_set)
  BTF_ID_FLAGS(func, bpf_get_task_pid)
  BTF_ID_FLAGS(func, bpf_put_pid)
  BTF_SET8_END(bpf_task_set)

  static const struct btf_kfunc_id_set bpf_task_kfunc_set = {
      .owner = THIS_MODULE,
      .set   = &bpf_task_set,
  };

  static int bpftest_init_subsystem(void)
  {
    pr_warn(">>>>>>>>>>>>>>> bpftest_init_subsystem registered");
    //I want BPF_PROG_TYPE_KPROBE, but I'm testing also with
BPF_PROG_TYPE_TRACEPOINT
    return register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_task_kfunc_set);
  }
  late_initcall(bpftest_init_subsystem);


I can see that this is being registered, but after that I see many
(16, all the same) messages like the one below.
These messages are gone if I don't compile the file I created above.
Is this file breaking something in bpf?

[    5.845543] failed to validate module [cryptd] BTF: -22
[    5.861117] BPF: [129150] STRUCT
[    5.862980] BPF: size=96 vlen=1
[    5.864710] BPF:
[    5.865941] BPF: Invalid name
[    5.867221] BPF:


Ignoring these errors, I've tried both KPROBE and TRACEPOINT prog
types in `register_btf_kfunc_id_set`.
I can't find what a program with "tracing" is, so I changed it to
BPF_PROG_TYPE_TRACEPOINT and used
an example from the kernel: samples/bpf/syscall_tp_kern.c
As for testing with KPROBE, I'm using the kprobe.bpf.c do_unlinkat
example in libbpf/libbpf-bootstrap.
It seems like the kfunc is not being found in the set, or the set is
not registered correctly,
since running the bpf program with any of the two types prints out:

  libbpf: prog 'trace_enter_open': BPF program load failed: Permission denied
  ...
  calling kernel function bpf_get_task_pid is not allowed

Both the bpf programs are simple, their bodies have:
    __u64 a = bpf_get_task_pid();
The function is getting resolved since I see
libbpf: extern (func ksym) 'bpf_get_task_pid': resolved to kernel

How can I correctly register a set and make the kernel allow me to call a kfunc?
Thank you.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Can't reproduce kfunc example in kfuncs documentation, kernel v6.0
  2022-10-04  2:18 Can't reproduce kfunc example in kfuncs documentation, kernel v6.0 Henrique Fingler
@ 2022-10-04 18:44 ` Henrique Fingler
  0 siblings, 0 replies; 2+ messages in thread
From: Henrique Fingler @ 2022-10-04 18:44 UTC (permalink / raw)
  To: bpf

> I'm trying to reproduce the example in `Documentation/bpf/kfuncs.rst`
> in kernel 6.0
> My end goal is to be able to call a kfunc from a kprobe, so the
> documentation seemed like a good start.
> I've created a file with almost the same content as the documentation
> (below) and put it in
> net/bpf and added it to the Makefile, with the added __diag directives
> that are in
> net/bpf/test_run.c around the kfuncs.
>
>  __diag_push();
>  __diag_ignore_all("-Wmissing-prototypes",
>       "Global functions as their definitions will be in vmlinux BTF");
>   u64 bpf_get_task_pid(void) {
>     return 1;
>   }
>    u64 bpf_put_pid(void) {
>     return 2;
>   }
>   __diag_pop();
>
>   BTF_SET8_START(bpf_task_set)
>   BTF_ID_FLAGS(func, bpf_get_task_pid)
>   BTF_ID_FLAGS(func, bpf_put_pid)
>   BTF_SET8_END(bpf_task_set)
>
>   static const struct btf_kfunc_id_set bpf_task_kfunc_set = {
>       .owner = THIS_MODULE,
>       .set   = &bpf_task_set,
>   };
>
>   static int bpftest_init_subsystem(void)
>   {
>     pr_warn(">>>>>>>>>>>>>>> bpftest_init_subsystem registered");
>     //I want BPF_PROG_TYPE_KPROBE, but I'm testing also with
> BPF_PROG_TYPE_TRACEPOINT
>     return register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_task_kfunc_set);
>   }
>   late_initcall(bpftest_init_subsystem);
>
>
> I can see that this is being registered, but after that I see many
> (16, all the same) messages like the one below.
> These messages are gone if I don't compile the file I created above.
> Is this file breaking something in bpf?
>
> [    5.845543] failed to validate module [cryptd] BTF: -22
> [    5.861117] BPF: [129150] STRUCT
> [    5.862980] BPF: size=96 vlen=1
> [    5.864710] BPF:
> [    5.865941] BPF: Invalid name
> [    5.867221] BPF:
>
>
> Ignoring these errors, I've tried both KPROBE and TRACEPOINT prog
> types in `register_btf_kfunc_id_set`.
> I can't find what a program with "tracing" is, so I changed it to
> BPF_PROG_TYPE_TRACEPOINT and used
> an example from the kernel: samples/bpf/syscall_tp_kern.c
> As for testing with KPROBE, I'm using the kprobe.bpf.c do_unlinkat
> example in libbpf/libbpf-bootstrap.
> It seems like the kfunc is not being found in the set, or the set is
> not registered correctly,
> since running the bpf program with any of the two types prints out:
>
>   libbpf: prog 'trace_enter_open': BPF program load failed: Permission denied
>   ...
>   calling kernel function bpf_get_task_pid is not allowed
>
> Both the bpf programs are simple, their bodies have:
>     __u64 a = bpf_get_task_pid();
> The function is getting resolved since I see
> libbpf: extern (func ksym) 'bpf_get_task_pid': resolved to kernel
>
> How can I correctly register a set and make the kernel allow me to call a kfunc?
> Thank you.

Turns out KPROBE or TRACEPOINT don't have hooks, so the id is never found.
After creating one for each in kernel/bpf/btf.c it works.

I still don't know why the `failed to validate module [cryptd] BTF:
-22` error is happening,
but I'll ignore it for now.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-10-04 18:44 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-04  2:18 Can't reproduce kfunc example in kfuncs documentation, kernel v6.0 Henrique Fingler
2022-10-04 18:44 ` Henrique Fingler

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.