@@ -422,220 +422,6 @@ static void test_unique_match(void)
422422 kprobe_multi__destroy (skel );
423423}
424424
425- static size_t symbol_hash (long key , void * ctx __maybe_unused )
426- {
427- return str_hash ((const char * ) key );
428- }
429-
430- static bool symbol_equal (long key1 , long key2 , void * ctx __maybe_unused )
431- {
432- return strcmp ((const char * ) key1 , (const char * ) key2 ) == 0 ;
433- }
434-
435- static bool is_invalid_entry (char * buf , bool kernel )
436- {
437- if (kernel && strchr (buf , '[' ))
438- return true;
439- if (!kernel && !strchr (buf , '[' ))
440- return true;
441- return false;
442- }
443-
444- static bool skip_entry (char * name )
445- {
446- /*
447- * We attach to almost all kernel functions and some of them
448- * will cause 'suspicious RCU usage' when fprobe is attached
449- * to them. Filter out the current culprits - arch_cpu_idle
450- * default_idle and rcu_* functions.
451- */
452- if (!strcmp (name , "arch_cpu_idle" ))
453- return true;
454- if (!strcmp (name , "default_idle" ))
455- return true;
456- if (!strncmp (name , "rcu_" , 4 ))
457- return true;
458- if (!strcmp (name , "bpf_dispatcher_xdp_func" ))
459- return true;
460- if (!strncmp (name , "__ftrace_invalid_address__" ,
461- sizeof ("__ftrace_invalid_address__" ) - 1 ))
462- return true;
463- return false;
464- }
465-
466- /* Do comparison by ignoring '.llvm.<hash>' suffixes. */
467- static int compare_name (const char * name1 , const char * name2 )
468- {
469- const char * res1 , * res2 ;
470- int len1 , len2 ;
471-
472- res1 = strstr (name1 , ".llvm." );
473- res2 = strstr (name2 , ".llvm." );
474- len1 = res1 ? res1 - name1 : strlen (name1 );
475- len2 = res2 ? res2 - name2 : strlen (name2 );
476-
477- if (len1 == len2 )
478- return strncmp (name1 , name2 , len1 );
479- if (len1 < len2 )
480- return strncmp (name1 , name2 , len1 ) <= 0 ? -1 : 1 ;
481- return strncmp (name1 , name2 , len2 ) >= 0 ? 1 : -1 ;
482- }
483-
484- static int load_kallsyms_compare (const void * p1 , const void * p2 )
485- {
486- return compare_name (((const struct ksym * )p1 )-> name , ((const struct ksym * )p2 )-> name );
487- }
488-
489- static int search_kallsyms_compare (const void * p1 , const struct ksym * p2 )
490- {
491- return compare_name (p1 , p2 -> name );
492- }
493-
494- static int get_syms (char * * * symsp , size_t * cntp , bool kernel )
495- {
496- size_t cap = 0 , cnt = 0 ;
497- char * name = NULL , * ksym_name , * * syms = NULL ;
498- struct hashmap * map ;
499- struct ksyms * ksyms ;
500- struct ksym * ks ;
501- char buf [256 ];
502- FILE * f ;
503- int err = 0 ;
504-
505- ksyms = load_kallsyms_custom_local (load_kallsyms_compare );
506- if (!ASSERT_OK_PTR (ksyms , "load_kallsyms_custom_local" ))
507- return - EINVAL ;
508-
509- /*
510- * The available_filter_functions contains many duplicates,
511- * but other than that all symbols are usable in kprobe multi
512- * interface.
513- * Filtering out duplicates by using hashmap__add, which won't
514- * add existing entry.
515- */
516-
517- if (access ("/sys/kernel/tracing/trace" , F_OK ) == 0 )
518- f = fopen ("/sys/kernel/tracing/available_filter_functions" , "r" );
519- else
520- f = fopen ("/sys/kernel/debug/tracing/available_filter_functions" , "r" );
521-
522- if (!f )
523- return - EINVAL ;
524-
525- map = hashmap__new (symbol_hash , symbol_equal , NULL );
526- if (IS_ERR (map )) {
527- err = libbpf_get_error (map );
528- goto error ;
529- }
530-
531- while (fgets (buf , sizeof (buf ), f )) {
532- if (is_invalid_entry (buf , kernel ))
533- continue ;
534-
535- free (name );
536- if (sscanf (buf , "%ms$*[^\n]\n" , & name ) != 1 )
537- continue ;
538- if (skip_entry (name ))
539- continue ;
540-
541- ks = search_kallsyms_custom_local (ksyms , name , search_kallsyms_compare );
542- if (!ks ) {
543- err = - EINVAL ;
544- goto error ;
545- }
546-
547- ksym_name = ks -> name ;
548- err = hashmap__add (map , ksym_name , 0 );
549- if (err == - EEXIST ) {
550- err = 0 ;
551- continue ;
552- }
553- if (err )
554- goto error ;
555-
556- err = libbpf_ensure_mem ((void * * ) & syms , & cap ,
557- sizeof (* syms ), cnt + 1 );
558- if (err )
559- goto error ;
560-
561- syms [cnt ++ ] = ksym_name ;
562- }
563-
564- * symsp = syms ;
565- * cntp = cnt ;
566-
567- error :
568- free (name );
569- fclose (f );
570- hashmap__free (map );
571- if (err )
572- free (syms );
573- return err ;
574- }
575-
576- static int get_addrs (unsigned long * * addrsp , size_t * cntp , bool kernel )
577- {
578- unsigned long * addr , * addrs , * tmp_addrs ;
579- int err = 0 , max_cnt , inc_cnt ;
580- char * name = NULL ;
581- size_t cnt = 0 ;
582- char buf [256 ];
583- FILE * f ;
584-
585- if (access ("/sys/kernel/tracing/trace" , F_OK ) == 0 )
586- f = fopen ("/sys/kernel/tracing/available_filter_functions_addrs" , "r" );
587- else
588- f = fopen ("/sys/kernel/debug/tracing/available_filter_functions_addrs" , "r" );
589-
590- if (!f )
591- return - ENOENT ;
592-
593- /* In my local setup, the number of entries is 50k+ so Let us initially
594- * allocate space to hold 64k entries. If 64k is not enough, incrementally
595- * increase 1k each time.
596- */
597- max_cnt = 65536 ;
598- inc_cnt = 1024 ;
599- addrs = malloc (max_cnt * sizeof (long ));
600- if (addrs == NULL ) {
601- err = - ENOMEM ;
602- goto error ;
603- }
604-
605- while (fgets (buf , sizeof (buf ), f )) {
606- if (is_invalid_entry (buf , kernel ))
607- continue ;
608-
609- free (name );
610- if (sscanf (buf , "%p %ms$*[^\n]\n" , & addr , & name ) != 2 )
611- continue ;
612- if (skip_entry (name ))
613- continue ;
614-
615- if (cnt == max_cnt ) {
616- max_cnt += inc_cnt ;
617- tmp_addrs = realloc (addrs , max_cnt );
618- if (!tmp_addrs ) {
619- err = - ENOMEM ;
620- goto error ;
621- }
622- addrs = tmp_addrs ;
623- }
624-
625- addrs [cnt ++ ] = (unsigned long )addr ;
626- }
627-
628- * addrsp = addrs ;
629- * cntp = cnt ;
630-
631- error :
632- free (name );
633- fclose (f );
634- if (err )
635- free (addrs );
636- return err ;
637- }
638-
639425static void do_bench_test (struct kprobe_multi_empty * skel , struct bpf_kprobe_multi_opts * opts )
640426{
641427 long attach_start_ns , attach_end_ns ;
@@ -670,7 +456,7 @@ static void test_kprobe_multi_bench_attach(bool kernel)
670456 char * * syms = NULL ;
671457 size_t cnt = 0 ;
672458
673- if (!ASSERT_OK (get_syms (& syms , & cnt , kernel ), "get_syms " ))
459+ if (!ASSERT_OK (bpf_get_ksyms (& syms , & cnt , kernel ), "bpf_get_ksyms " ))
674460 return ;
675461
676462 skel = kprobe_multi_empty__open_and_load ();
@@ -696,13 +482,13 @@ static void test_kprobe_multi_bench_attach_addr(bool kernel)
696482 size_t cnt = 0 ;
697483 int err ;
698484
699- err = get_addrs (& addrs , & cnt , kernel );
485+ err = bpf_get_addrs (& addrs , & cnt , kernel );
700486 if (err == - ENOENT ) {
701487 test__skip ();
702488 return ;
703489 }
704490
705- if (!ASSERT_OK (err , "get_addrs " ))
491+ if (!ASSERT_OK (err , "bpf_get_addrs " ))
706492 return ;
707493
708494 skel = kprobe_multi_empty__open_and_load ();
0 commit comments