Message ID | 20250224165912.599068-1-chen.dylane@linux.dev (mailing list archive) |
---|---|
Headers | show |
Series | Add prog_kfunc feature probe | expand |
在 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); }