mbox series

[bpf-next,v8,0/5] Add prog_kfunc feature probe

Message ID 20250224165912.599068-1-chen.dylane@linux.dev (mailing list archive)
Headers show
Series Add prog_kfunc feature probe | expand

Message

Tao Chen Feb. 24, 2025, 4:59 p.m. UTC
More and more kfunc functions are being added to the kernel.
Different prog types have different restrictions when using kfunc.
Therefore, prog_kfunc probe is added to check whether it is supported,
and the use of this api will be added to bpftool later.

Change list:
- v7 -> v8:
  - fix "kfuncs require device-bound" verifier info
  - init expected_attach_type for kprobe prog type
  - patchset Reviewed-by: Eduard Zingerman <eddyz87@gmail.com>
- v7
  https://lore.kernel.org/bpf/20250212153912.24116-1-chen.dylane@gmail.com/  

- v6 -> v7:
  - wrap err with libbpf_err
  - comments fix
  - handle btf_fd < 0 as vmlinux
  - patchset Reviewed-by: Jiri Olsa <jolsa@kernel.org>
- v6
  https://lore.kernel.org/bpf/20250211111859.6029-1-chen.dylane@gmail.com

- v5 -> v6:
  - remove fd_array_cnt
  - test case clean code
- v5
  https://lore.kernel.org/bpf/20250210055945.27192-1-chen.dylane@gmail.com

- v4 -> v5:
  - use fd_array on stack
  - declare the scope of use of btf_fd
- v4
  https://lore.kernel.org/bpf/20250206051557.27913-1-chen.dylane@gmail.com/

- v3 -> v4:
  - add fd_array init for kfunc in mod btf
  - add test case for kfunc in mod btf
  - refactor common part as prog load type check for
    libbpf_probe_bpf_{helper,kfunc}
- v3
  https://lore.kernel.org/bpf/20250124144411.13468-1-chen.dylane@gmail.com

- v2 -> v3:
  - rename parameter off with btf_fd
  - extract the common part for libbpf_probe_bpf_{helper,kfunc}
- v2
  https://lore.kernel.org/bpf/20250123170555.291896-1-chen.dylane@gmail.com

- v1 -> v2:
  - check unsupported prog type like probe_bpf_helper
  - add off parameter for module btf
  - check verifier info when kfunc id invalid
- v1
  https://lore.kernel.org/bpf/20250122171359.232791-1-chen.dylane@gmail.com

Tao Chen (5):
  libbpf: Extract prog load type check from libbpf_probe_bpf_helper
  libbpf: Init fd_array when prog probe load
  libbpf: Add libbpf_probe_bpf_kfunc API
  libbpf: Init kprobe prog expected_attach_type for kfunc probe
  selftests/bpf: Add libbpf_probe_bpf_kfunc API selftests

 tools/lib/bpf/libbpf.h                        |  19 ++-
 tools/lib/bpf/libbpf.map                      |   1 +
 tools/lib/bpf/libbpf_probes.c                 |  90 +++++++++++---
 .../selftests/bpf/prog_tests/libbpf_probes.c  | 111 ++++++++++++++++++
 4 files changed, 205 insertions(+), 16 deletions(-)

Comments

Tao Chen Feb. 24, 2025, 5:13 p.m. UTC | #1
在 2025/2/25 00:59, Tao Chen 写道:
> More and more kfunc functions are being added to the kernel.
> Different prog types have different restrictions when using kfunc.
> Therefore, prog_kfunc probe is added to check whether it is supported,
> and the use of this api will be added to bpftool later.
> 
> Change list:
> - v7 -> v8:
>    - fix "kfuncs require device-bound" verifier info
>    - init expected_attach_type for kprobe prog type
>    - patchset Reviewed-by: Eduard Zingerman <eddyz87@gmail.com>
> - v7
>    https://lore.kernel.org/bpf/20250212153912.24116-1-chen.dylane@gmail.com/
> 
> - v6 -> v7:
>    - wrap err with libbpf_err
>    - comments fix
>    - handle btf_fd < 0 as vmlinux
>    - patchset Reviewed-by: Jiri Olsa <jolsa@kernel.org>
> - v6
>    https://lore.kernel.org/bpf/20250211111859.6029-1-chen.dylane@gmail.com
> 
> - v5 -> v6:
>    - remove fd_array_cnt
>    - test case clean code
> - v5
>    https://lore.kernel.org/bpf/20250210055945.27192-1-chen.dylane@gmail.com
> 
> - v4 -> v5:
>    - use fd_array on stack
>    - declare the scope of use of btf_fd
> - v4
>    https://lore.kernel.org/bpf/20250206051557.27913-1-chen.dylane@gmail.com/
> 
> - v3 -> v4:
>    - add fd_array init for kfunc in mod btf
>    - add test case for kfunc in mod btf
>    - refactor common part as prog load type check for
>      libbpf_probe_bpf_{helper,kfunc}
> - v3
>    https://lore.kernel.org/bpf/20250124144411.13468-1-chen.dylane@gmail.com
> 
> - v2 -> v3:
>    - rename parameter off with btf_fd
>    - extract the common part for libbpf_probe_bpf_{helper,kfunc}
> - v2
>    https://lore.kernel.org/bpf/20250123170555.291896-1-chen.dylane@gmail.com
> 
> - v1 -> v2:
>    - check unsupported prog type like probe_bpf_helper
>    - add off parameter for module btf
>    - check verifier info when kfunc id invalid
> - v1
>    https://lore.kernel.org/bpf/20250122171359.232791-1-chen.dylane@gmail.com
> 
> Tao Chen (5):
>    libbpf: Extract prog load type check from libbpf_probe_bpf_helper
>    libbpf: Init fd_array when prog probe load
>    libbpf: Add libbpf_probe_bpf_kfunc API
>    libbpf: Init kprobe prog expected_attach_type for kfunc probe
>    selftests/bpf: Add libbpf_probe_bpf_kfunc API selftests
> 
>   tools/lib/bpf/libbpf.h                        |  19 ++-
>   tools/lib/bpf/libbpf.map                      |   1 +
>   tools/lib/bpf/libbpf_probes.c                 |  90 +++++++++++---
>   .../selftests/bpf/prog_tests/libbpf_probes.c  | 111 ++++++++++++++++++
>   4 files changed, 205 insertions(+), 16 deletions(-)
> 


Hi Eduard,
I used a simple script to find all kfunc prog types and comapre it with 
your program, most of them are consistent, the results are as follows, 
and i add pathch 4 additionally to fix kfunc probe like 
bpf_session_is_return.

-------------------------------------------------
The script results:
hid_bpf_allocate_context: SYSCALL
hid_bpf_release_context: SYSCALL
hid_bpf_hw_request: SYSCALL
hid_bpf_hw_output_report: SYSCALL
hid_bpf_input_report: SYSCALL
bpf_session_is_return: KPROBE
bpf_session_cookie: KPROBE
scx_bpf_create_dsq: SYSCALL
scx_bpf_dsq_move_set_slice: SYSCALL
scx_bpf_dsq_move_set_vtime: SYSCALL
scx_bpf_dsq_move: SYSCALL
scx_bpf_dsq_move_vtime: SYSCALL
scx_bpf_dispatch_from_dsq_set_slice: SYSCALL
scx_bpf_dispatch_from_dsq_set_vtime: SYSCALL
scx_bpf_dispatch_from_dsq: SYSCALL
scx_bpf_dispatch_vtime_from_dsq: SYSCALL
scx_bpf_kick_cpu: SYSCALL
scx_bpf_dsq_nr_queued: SYSCALL
scx_bpf_destroy_dsq: SYSCALL
bpf_iter_scx_dsq_new: SYSCALL
bpf_iter_scx_dsq_next: SYSCALL
bpf_iter_scx_dsq_destroy: SYSCALL
scx_bpf_exit_bstr: SYSCALL
scx_bpf_error_bstr: SYSCALL
scx_bpf_dump_bstr: SYSCALL
scx_bpf_cpuperf_cap: SYSCALL
scx_bpf_cpuperf_cur: SYSCALL
scx_bpf_cpuperf_set: SYSCALL
scx_bpf_nr_cpu_ids: SYSCALL
scx_bpf_get_possible_cpumask: SYSCALL
scx_bpf_get_online_cpumask: SYSCALL
scx_bpf_put_cpumask: SYSCALL
scx_bpf_get_idle_cpumask: SYSCALL
scx_bpf_get_idle_smtmask: SYSCALL
scx_bpf_put_idle_cpumask: SYSCALL
scx_bpf_test_and_clear_cpu_idle: SYSCALL
scx_bpf_pick_idle_cpu: SYSCALL
scx_bpf_pick_any_cpu: SYSCALL
scx_bpf_task_running: SYSCALL
scx_bpf_task_cpu: SYSCALL
scx_bpf_cpu_rq: SYSCALL
scx_bpf_task_cgroup: SYSCALL
scx_bpf_now: SYSCALL
bpf_arena_alloc_pages: UNSPEC
bpf_arena_free_pages: UNSPEC
bpf_crypto_decrypt: XDP, SCHED_ACT, SCHED_CLS
bpf_crypto_encrypt: XDP, SCHED_ACT, SCHED_CLS
bpf_crypto_ctx_create: SYSCALL
bpf_crypto_ctx_release: SYSCALL
bpf_crypto_ctx_acquire: SYSCALL
bpf_map_sum_elem_count: UNSPEC
bpf_cpumask_create: SYSCALL
bpf_cpumask_release: SYSCALL
bpf_cpumask_acquire: SYSCALL
bpf_cpumask_first: SYSCALL
bpf_cpumask_first_zero: SYSCALL
bpf_cpumask_first_and: SYSCALL
bpf_cpumask_set_cpu: SYSCALL
bpf_cpumask_clear_cpu: SYSCALL
bpf_cpumask_test_cpu: SYSCALL
bpf_cpumask_test_and_set_cpu: SYSCALL
bpf_cpumask_test_and_clear_cpu: SYSCALL
bpf_cpumask_setall: SYSCALL
bpf_cpumask_clear: SYSCALL
bpf_cpumask_and: SYSCALL
bpf_cpumask_or: SYSCALL
bpf_cpumask_xor: SYSCALL
bpf_cpumask_equal: SYSCALL
bpf_cpumask_intersects: SYSCALL
bpf_cpumask_subset: SYSCALL
bpf_cpumask_empty: SYSCALL
bpf_cpumask_full: SYSCALL
bpf_cpumask_copy: SYSCALL
bpf_cpumask_any_distribute: SYSCALL
bpf_cpumask_any_and_distribute: SYSCALL
bpf_cpumask_weight: SYSCALL
crash_kexec: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_obj_new_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_percpu_obj_new_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_obj_drop_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_percpu_obj_drop_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_refcount_acquire_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_list_push_front_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_list_push_back_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_list_pop_front: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_list_pop_back: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_acquire: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_release: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_rbtree_remove: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_rbtree_add_impl: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_rbtree_first: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_cgroup_acquire: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_cgroup_release: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_cgroup_ancestor: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_cgroup_from_id: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_under_cgroup: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_get_cgroup1: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_from_pid: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_task_from_vpid: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_throw: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_send_signal_task: XDP, SCHED_CLS, CGROUP_SKB, SYSCALL
bpf_cast_to_kern_ctx: UNSPEC
bpf_rdonly_cast: UNSPEC
bpf_rcu_read_lock: UNSPEC
bpf_rcu_read_unlock: UNSPEC
bpf_dynptr_slice: UNSPEC
bpf_dynptr_slice_rdwr: UNSPEC
bpf_iter_num_new: UNSPEC
bpf_iter_num_next: UNSPEC
bpf_iter_num_destroy: UNSPEC
bpf_iter_task_vma_new: UNSPEC
bpf_iter_task_vma_next: UNSPEC
bpf_iter_task_vma_destroy: UNSPEC
bpf_iter_css_task_new: UNSPEC
bpf_iter_css_task_next: UNSPEC
bpf_iter_css_task_destroy: UNSPEC
bpf_iter_css_new: UNSPEC
bpf_iter_css_next: UNSPEC
bpf_iter_css_destroy: UNSPEC
bpf_iter_task_new: UNSPEC
bpf_iter_task_next: UNSPEC
bpf_iter_task_destroy: UNSPEC
bpf_dynptr_adjust: UNSPEC
bpf_dynptr_is_null: UNSPEC
bpf_dynptr_is_rdonly: UNSPEC
bpf_dynptr_size: UNSPEC
bpf_dynptr_clone: UNSPEC
bpf_modify_return_test_tp: UNSPEC
bpf_wq_init: UNSPEC
bpf_wq_set_callback_impl: UNSPEC
bpf_wq_start: UNSPEC
bpf_preempt_disable: UNSPEC
bpf_preempt_enable: UNSPEC
bpf_iter_bits_new: UNSPEC
bpf_iter_bits_next: UNSPEC
bpf_iter_bits_destroy: UNSPEC
bpf_copy_from_user_str: UNSPEC
bpf_get_kmem_cache: UNSPEC
bpf_iter_kmem_cache_new: UNSPEC
bpf_iter_kmem_cache_next: UNSPEC
bpf_iter_kmem_cache_destroy: UNSPEC
bpf_local_irq_save: UNSPEC
bpf_local_irq_restore: UNSPEC
bpf_skb_set_fou_encap: SCHED_CLS
bpf_skb_get_fou_encap: SCHED_CLS
bpf_xdp_ct_alloc: XDP, SCHED_CLS
bpf_xdp_ct_lookup: XDP, SCHED_CLS
bpf_skb_ct_alloc: XDP, SCHED_CLS
bpf_skb_ct_lookup: XDP, SCHED_CLS
bpf_ct_insert_entry: XDP, SCHED_CLS
bpf_ct_release: XDP, SCHED_CLS
bpf_ct_set_timeout: XDP, SCHED_CLS
bpf_ct_change_timeout: XDP, SCHED_CLS
bpf_ct_set_status: XDP, SCHED_CLS
bpf_ct_change_status: XDP, SCHED_CLS
bpf_ct_set_nat_info: XDP, SCHED_CLS
bpf_xdp_flow_lookup: XDP
bpf_skb_get_xfrm_info: SCHED_CLS
bpf_skb_set_xfrm_info: SCHED_CLS
bpf_xdp_get_xfrm_state: XDP
bpf_xdp_xfrm_state_release: XDP
name: XDP
bpf_dynptr_from_skb: LWT_OUT, SCHED_ACT, SCHED_CLS, LWT_XMIT, NETFILTER, 
LWT_IN, SK_SKB, LWT_SEG6LOCAL, SOCKET_FILTER, CGROUP_SKB
bpf_dynptr_from_xdp: XDP
bpf_sock_addr_set_sun_path: CGROUP_SOCK_ADDR
bpf_sk_assign_tcp_reqsk: SCHED_CLS
bpf_kfunc_call_test_release: SCHED_CLS, SYSCALL
bpf_kfunc_call_memb_release: SCHED_CLS, SYSCALL

---------------------------------------------------
The c code results:
[106425] scx_bpf_select_cpu_dfl
[106393] scx_bpf_dsq_insert
[106394] scx_bpf_dsq_insert_vtime
[106381] scx_bpf_dispatch
[106391] scx_bpf_dispatch_vtime
[106389] scx_bpf_dispatch_nr_slots
[106382] scx_bpf_dispatch_cancel
[106398] scx_bpf_dsq_move_to_local
[106369] scx_bpf_consume
[106396] scx_bpf_dsq_move_set_slice         SYSCALL
[106397] scx_bpf_dsq_move_set_vtime         SYSCALL
[106395] scx_bpf_dsq_move                   SYSCALL
[106399] scx_bpf_dsq_move_vtime             SYSCALL
[106386] scx_bpf_dispatch_from_dsq_set_slice     SYSCALL
[106388] scx_bpf_dispatch_from_dsq_set_vtime     SYSCALL
[106384] scx_bpf_dispatch_from_dsq          SYSCALL
[106392] scx_bpf_dispatch_vtime_from_dsq     SYSCALL
[106423] scx_bpf_reenqueue_local
[106378] scx_bpf_create_dsq                 SYSCALL
[106413] scx_bpf_kick_cpu                   SYSCALL
[106401] scx_bpf_dsq_nr_queued              SYSCALL
[106379] scx_bpf_destroy_dsq                SYSCALL
[59846 ] bpf_iter_scx_dsq_new               SYSCALL
[59848 ] bpf_iter_scx_dsq_next              SYSCALL
[59844 ] bpf_iter_scx_dsq_destroy           SYSCALL
[106406] scx_bpf_exit_bstr                  SYSCALL
[106404] scx_bpf_error_bstr                 SYSCALL
[106403] scx_bpf_dump_bstr                  SYSCALL
[106373] scx_bpf_cpuperf_cap                SYSCALL
[106374] scx_bpf_cpuperf_cur                SYSCALL
[106376] scx_bpf_cpuperf_set                SYSCALL
[106415] scx_bpf_nr_cpu_ids                 SYSCALL
[106411] scx_bpf_get_possible_cpumask       SYSCALL
[106410] scx_bpf_get_online_cpumask         SYSCALL
[106420] scx_bpf_put_cpumask                SYSCALL
[106408] scx_bpf_get_idle_cpumask           SYSCALL
[106409] scx_bpf_get_idle_smtmask           SYSCALL
[106422] scx_bpf_put_idle_cpumask           SYSCALL
[106433] scx_bpf_test_and_clear_cpu_idle     SYSCALL
[106418] scx_bpf_pick_idle_cpu              SYSCALL
[106417] scx_bpf_pick_any_cpu               SYSCALL
[106431] scx_bpf_task_running               SYSCALL
[106429] scx_bpf_task_cpu                   SYSCALL
[106371] scx_bpf_cpu_rq                     SYSCALL
[106427] scx_bpf_task_cgroup                SYSCALL
[106414] scx_bpf_now                        SYSCALL
[62231 ] cgroup_rstat_updated
[62225 ] cgroup_rstat_flush
[60053 ] bpf_lookup_user_key
[60051 ] bpf_lookup_system_key
[59954 ] bpf_key_put
[60551 ] bpf_session_is_return          KPROBE
[60550 ] bpf_session_cookie             KPROBE
[64314 ] crash_kexec                      XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60256 ] bpf_obj_new_impl                 XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60290 ] bpf_percpu_obj_new_impl          XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60242 ] bpf_obj_drop_impl                XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60289 ] bpf_percpu_obj_drop_impl         XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60484 ] bpf_refcount_acquire_impl        XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60027 ] bpf_list_push_front_impl         XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60026 ] bpf_list_push_back_impl          XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60024 ] bpf_list_pop_front               XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60023 ] bpf_list_pop_back                XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60797 ] bpf_task_acquire                 XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60808 ] bpf_task_release                 XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60472 ] bpf_rbtree_remove                XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60468 ] bpf_rbtree_add_impl              XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60470 ] bpf_rbtree_first                 XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[59305 ] bpf_cgroup_acquire               XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[59320 ] bpf_cgroup_release               XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[59307 ] bpf_cgroup_ancestor              XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[59309 ] bpf_cgroup_from_id               XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60818 ] bpf_task_under_cgroup            XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60805 ] bpf_task_get_cgroup1             XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60801 ] bpf_task_from_pid                XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60803 ] bpf_task_from_vpid               XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60871 ] bpf_throw                        XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[60539 ] bpf_send_signal_task             XDP SYSCALL SCHED_CLS 
CGROUP_SKB
[59303 ] bpf_cast_to_kern_ctx           KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60476 ] bpf_rdonly_cast                KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60473 ] bpf_rcu_read_lock              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60474 ] bpf_rcu_read_unlock            KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59556 ] bpf_dynptr_slice               KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59557 ] bpf_dynptr_slice_rdwr          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59834 ] bpf_iter_num_new               KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59836 ] bpf_iter_num_next              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59832 ] bpf_iter_num_destroy           KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59867 ] bpf_iter_task_vma_new          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59869 ] bpf_iter_task_vma_next         KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59865 ] bpf_iter_task_vma_destroy      KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59774 ] bpf_iter_css_task_new          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59776 ] bpf_iter_css_task_next         KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59772 ] bpf_iter_css_task_destroy      KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59768 ] bpf_iter_css_new               KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59770 ] bpf_iter_css_next              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59766 ] bpf_iter_css_destroy           KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59858 ] bpf_iter_task_new              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59860 ] bpf_iter_task_next             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59854 ] bpf_iter_task_destroy          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59528 ] bpf_dynptr_adjust              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59546 ] bpf_dynptr_is_null             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59547 ] bpf_dynptr_is_rdonly           KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59554 ] bpf_dynptr_size                KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59532 ] bpf_dynptr_clone               KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60197 ] bpf_modify_return_test_tp      KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60981 ] bpf_wq_init                    KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60983 ] bpf_wq_set_callback_impl       KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60985 ] bpf_wq_start                   KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60311 ] bpf_preempt_disable            KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60312 ] bpf_preempt_enable             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59746 ] bpf_iter_bits_new              KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59748 ] bpf_iter_bits_next             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59744 ] bpf_iter_bits_destroy          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59356 ] bpf_copy_from_user_str         KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59657 ] bpf_get_kmem_cache             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59807 ] bpf_iter_kmem_cache_new        KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59809 ] bpf_iter_kmem_cache_next       KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59805 ] bpf_iter_kmem_cache_destroy    KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60030 ] bpf_local_irq_save             KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60029 ] bpf_local_irq_restore          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[60153 ] bpf_map_sum_elem_count         KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59280 ] bpf_arena_alloc_pages          KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59282 ] bpf_arena_free_pages           KPROBE XDP SYSCALL SCHED_CLS 
SCHED_ACT SK_SKB SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT 
LWT_SEG6LOCAL NETFILTER
[59404 ] bpf_cpumask_create                 SYSCALL
[59416 ] bpf_cpumask_release                SYSCALL
[59390 ] bpf_cpumask_acquire                SYSCALL
[59409 ] bpf_cpumask_first                  SYSCALL
[59411 ] bpf_cpumask_first_zero             SYSCALL
[59410 ] bpf_cpumask_first_and              SYSCALL
[59419 ] bpf_cpumask_set_cpu                SYSCALL
[59400 ] bpf_cpumask_clear_cpu              SYSCALL
[59426 ] bpf_cpumask_test_cpu               SYSCALL
[59424 ] bpf_cpumask_test_and_set_cpu       SYSCALL
[59423 ] bpf_cpumask_test_and_clear_cpu     SYSCALL
[59420 ] bpf_cpumask_setall                 SYSCALL
[59398 ] bpf_cpumask_clear                  SYSCALL
[59392 ] bpf_cpumask_and                    SYSCALL
[59415 ] bpf_cpumask_or                     SYSCALL
[59428 ] bpf_cpumask_xor                    SYSCALL
[59408 ] bpf_cpumask_equal                  SYSCALL
[59413 ] bpf_cpumask_intersects             SYSCALL
[59421 ] bpf_cpumask_subset                 SYSCALL
[59406 ] bpf_cpumask_empty                  SYSCALL
[59412 ] bpf_cpumask_full                   SYSCALL
[59402 ] bpf_cpumask_copy                   SYSCALL
[59396 ] bpf_cpumask_any_distribute         SYSCALL
[59394 ] bpf_cpumask_any_and_distribute     SYSCALL
[59427 ] bpf_cpumask_weight                 SYSCALL
[59434 ] bpf_crypto_ctx_create              SYSCALL
[59436 ] bpf_crypto_ctx_release             SYSCALL
[59432 ] bpf_crypto_ctx_acquire             SYSCALL
[59438 ] bpf_crypto_decrypt               XDP   SCHED_CLS SCHED_ACT
[59439 ] bpf_crypto_encrypt               XDP   SCHED_CLS SCHED_ACT
[59538 ] bpf_dynptr_from_skb                  SCHED_CLS SCHED_ACT SK_SKB 
SOCKET_FILTER CGROUP_SKB LWT_OUT LWT_IN LWT_XMIT LWT_SEG6LOCAL NETFILTER
[59542 ] bpf_dynptr_from_xdp              XDP
[60702 ] bpf_sock_addr_set_sun_path                   CGROUP_SKB
[60564 ] bpf_sk_assign_tcp_reqsk              SCHED_CLS
[60712 ] bpf_sock_destroy
[61023 ] bpf_xdp_metadata_rx_timestamp
[61021 ] bpf_xdp_metadata_rx_hash
[61025 ] bpf_xdp_metadata_rx_vlan_tag
[60193 ] bpf_modify_return_test
[60195 ] bpf_modify_return_test2
[59582 ] bpf_fentry_test1
[59960 ] bpf_kfunc_call_test_release        SYSCALL SCHED_CLS
[59957 ] bpf_kfunc_call_memb_release        SYSCALL SCHED_CLS
[60998 ] bpf_xdp_ct_alloc                 XDP   SCHED_CLS
[61000 ] bpf_xdp_ct_lookup                XDP   SCHED_CLS
[60635 ] bpf_skb_ct_alloc                 XDP   SCHED_CLS
[60637 ] bpf_skb_ct_lookup                XDP   SCHED_CLS
[59472 ] bpf_ct_insert_entry              XDP   SCHED_CLS
[59474 ] bpf_ct_release                   XDP   SCHED_CLS
[59480 ] bpf_ct_set_timeout               XDP   SCHED_CLS
[59470 ] bpf_ct_change_timeout            XDP   SCHED_CLS
[59478 ] bpf_ct_set_status                XDP   SCHED_CLS
[59468 ] bpf_ct_change_status             XDP   SCHED_CLS
[59476 ] bpf_ct_set_nat_info              XDP   SCHED_CLS
[65211 ] cubictcp_init
[65212 ] cubictcp_recalc_ssthresh
[65208 ] cubictcp_cong_avoid
[65214 ] cubictcp_state
[65210 ] cubictcp_cwnd_event
[65207 ] cubictcp_acked
[113327] tcp_reno_ssthresh
[113326] tcp_reno_cong_avoid
[113328] tcp_reno_undo_cwnd
[113396] tcp_slow_start
[113087] tcp_cong_avoid_ai
[61008 ] bpf_xdp_get_xfrm_state           XDP
[61037 ] bpf_xdp_xfrm_state_release       XDP

--------------------------------------------------------------
The script:
#!/bin/python3

import os
import re
from collections import defaultdict

# Regular expression to match register_btf_kfunc_id_set calls (supports 
multi-line)
register_pattern = re.compile(
     r'register_btf_kfunc_id_set\s*\(\s*(BPF_PROG_TYPE_\w+)\s*,'  # 
Match function name and first argument
     r'[\s\S]*?&(\w+)\s*\)',  # Match second argument (supports multi-line)
     re.DOTALL  # Enable multi-line matching
)

# Regular expression to match struct variable definitions and .set 
initialization
struct_var_pattern = re.compile(
     r'static\s+const\s+struct\s+btf_kfunc_id_set\s+'  # Match struct 
variable definition
     r'(\w+)\s*=\s*\{.*?\.set\s*=\s*&(\w+)\s*,.*?\};',  # Match .set 
initialization
     re.DOTALL  # Enable multi-line matching
)

# Regular expression to match BTF_KFUNCS_START and BTF_KFUNCS_END blocks
btf_kfuncs_pattern = re.compile(
     r'BTF_KFUNCS_START\s*\(\s*(\w+)\s*\)'  # Match BTF_KFUNCS_START
     r'([\s\S]*?)'  # Match any content (non-greedy)
     r'BTF_KFUNCS_END\s*\(\s*\1\s*\)',  # Match BTF_KFUNCS_END with the 
same parameter
     re.DOTALL  # Enable multi-line matching
)

# Regular expression to match BTF_ID_FLAGS(func, ...) declared functions
btf_id_flags_pattern = re.compile(
     r'BTF_ID_FLAGS\s*\(\s*func\s*,\s*(\w+)\s*(?:,\s*.*?)?\)'  # Match 
function name
)

# Dictionary to store functions and their corresponding prog_types
func_prog_types = defaultdict(set)

# Set of prog_types to exclude
excluded_prog_types = {
     "TRACING",
     "EXT",
     "LSM",
     "STRUCT_OPS",
}

def scan_file(file_path):
     """
     Scan a single file to find register_btf_kfunc_id_set calls and 
further scan for struct variables and BTF_KFUNCS blocks.
     """
     with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
         content = file.read()
         content = content.replace('\r\n', '\n')

         # Find register_btf_kfunc_id_set calls
         register_matches = register_pattern.findall(content)
         for prog_type, kfunc_set in register_matches:
             # Remove BPF_PROG_TYPE_ prefix
             prog_type_short = prog_type.replace("BPF_PROG_TYPE_", "")

             # Skip excluded prog_types
             if prog_type_short in excluded_prog_types:
                 continue

             print(f"File: {file_path}")
             print(f"  prog_type: {prog_type_short}")
             print(f"  kfunc_set: {kfunc_set}")

             # Find struct variables with the same name
             struct_var_matches = struct_var_pattern.findall(content)
             found = False
             for struct_var_name, set_name in struct_var_matches:
                 if struct_var_name == kfunc_set:
                     print(f"  Struct variable: {struct_var_name}")
                     print(f"  .set initialized with: {set_name}")
                     found = True

                     # Find BTF_KFUNCS_START and BTF_KFUNCS_END blocks
                     btf_kfuncs_matches = 
btf_kfuncs_pattern.findall(content)
                     #print(btf_kfuncs_matches)
                     if btf_kfuncs_matches:
                         for func, block_content in btf_kfuncs_matches:
                             if func == set_name:
                                 #block_content = btf_kfuncs_match.group(2)
                                 print(f"  BTF_KFUNCS block found for 
{set_name}")

                                 # Extract functions declared in 
BTF_ID_FLAGS(func, ...)
                                 func_matches = 
btf_id_flags_pattern.findall(block_content)
                                 if func_matches:
                                     print("  Functions declared in block:")
                                     for func_name in func_matches:
                                         print(f"    {func_name} 
(prog_type: {prog_type_short})")
                                         # Record function and its 
corresponding prog_type
  
func_prog_types[func_name].add(prog_type_short)
                                 else:
                                     print("  No functions found in block")
                     else:
                         print(f"  No BTF_KFUNCS block found for 
{set_name}")

                     break

             if not found:
                 print(f"  No matching struct variable found for 
{kfunc_set}")

             print("-" * 40)

def scan_repository(repo_path):
     """
     Traverse all .c and .h files in the repository and call scan_file 
for each file.
     """
     for root, dirs, files in os.walk(repo_path):
         # Exclude selftest directory
         if "selftests" in dirs:
             dirs.remove("selftests")

         for file_name in files:
             if file_name.endswith(('.c', '.h')):
                 file_path = os.path.join(root, file_name)
                 scan_file(file_path)

def print_func_prog_types():
     print("\nSummary of functions and their corresponding prog_types:")
     for func_name, prog_types in func_prog_types.items():
         print(f"{func_name}: {', '.join(prog_types)}")

if __name__ == "__main__":
     repo_path = "/home/dylane/sdb/bpf-next2/bpf-next"  # Replace with 
your repository path

     print(f"Scanning repository: {repo_path}")
     scan_repository(repo_path)

     print_func_prog_types()

------------------------------------------------------
the c code:
static const struct {
	const char *name;
	int code;
} program_types[] = {
#define _T(n) { #n, BPF_PROG_TYPE_ ## n }
	_T(KPROBE),
	_T(XDP),
	_T(SYSCALL),
	_T(SCHED_CLS),
	_T(SCHED_ACT),
	_T(SK_SKB),
	_T(SOCKET_FILTER),
	_T(CGROUP_SKB),
	_T(LWT_OUT),
	_T(LWT_IN),
	_T(LWT_XMIT),
	_T(LWT_SEG6LOCAL),
	_T(NETFILTER)
#undef _T
};

void test_libbpf_probe_kfuncs_many(void)
{
	int i, kfunc_id, ret, id;
	const struct btf_type *t;
	struct btf *btf = NULL;
	const char *kfunc;
	const char *tag;

	btf = btf__parse("/sys/kernel/btf/vmlinux", NULL);
	if (!ASSERT_OK_PTR(btf, "btf_parse"))
		return;
	for (id = 0; id < btf__type_cnt(btf); ++id) {
		t = btf__type_by_id(btf, id);
		if (!t)
			continue;
		if (!btf_is_decl_tag(t))
			continue;
		tag = btf__name_by_offset(btf, t->name_off);
		if (strcmp(tag, "bpf_kfunc") != 0)
			continue;
		kfunc_id = t->type;
		t = btf__type_by_id(btf, kfunc_id);
		if (!btf_is_func(t))
			continue;
		kfunc = btf__name_by_offset(btf, t->name_off);
		printf("[%-6d] %-42s ", kfunc_id, kfunc);
		for (i = 0; i < ARRAY_SIZE(program_types); ++i) {
			ret = libbpf_probe_bpf_kfunc(program_types[i].code, kfunc_id, -1, NULL);
			if (ret < 0)
				printf("%-2d  ", ret);
			else if (ret == 0)
				printf("%2s", "");
			else
				printf("%2s  ", program_types[i].name);
		}
		printf("\n");
	}
	btf__free(btf);
}