@@ -126,3 +126,38 @@ void test_libbpf_probe_helpers(void)
126126 ASSERT_EQ (res , d -> supported , buf );
127127 }
128128}
129+
130+ void test_libbpf_probe_kfuncs (void )
131+ {
132+ int ret , kfunc_id ;
133+ char * kfunc = "bpf_cpumask_create" ;
134+ struct btf * btf ;
135+
136+ btf = btf__parse ("/sys/kernel/btf/vmlinux" , NULL );
137+ if (!ASSERT_OK_PTR (btf , "btf_parse" ))
138+ return ;
139+
140+ kfunc_id = btf__find_by_name_kind (btf , kfunc , BTF_KIND_FUNC );
141+ if (!ASSERT_GT (kfunc_id , 0 , kfunc ))
142+ goto cleanup ;
143+
144+ /* prog BPF_PROG_TYPE_SYSCALL supports kfunc bpf_cpumask_create */
145+ ret = libbpf_probe_bpf_kfunc (BPF_PROG_TYPE_SYSCALL , kfunc_id , 0 , NULL );
146+ ASSERT_EQ (ret , 1 , kfunc );
147+
148+ /* prog BPF_PROG_TYPE_KPROBE does not support kfunc bpf_cpumask_create */
149+ ret = libbpf_probe_bpf_kfunc (BPF_PROG_TYPE_KPROBE , kfunc_id , 0 , NULL );
150+ ASSERT_EQ (ret , 0 , kfunc );
151+
152+ /* invalid kfunc id */
153+ ret = libbpf_probe_bpf_kfunc (BPF_PROG_TYPE_KPROBE , -1 , 0 , NULL );
154+ ASSERT_EQ (ret , 0 , "invalid kfunc id:-1" );
155+
156+ /* invalid prog type */
157+ ret = libbpf_probe_bpf_kfunc (100000 , kfunc_id , 0 , NULL );
158+ if (!ASSERT_LE (ret , 0 , "invalid prog type:100000" ))
159+ goto cleanup ;
160+
161+ cleanup :
162+ btf__free (btf );
163+ }
0 commit comments