@@ -422,220 +422,6 @@ static void test_unique_match(void)
422
422
kprobe_multi__destroy (skel );
423
423
}
424
424
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 comparision 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
-
639
425
static void do_bench_test (struct kprobe_multi_empty * skel , struct bpf_kprobe_multi_opts * opts )
640
426
{
641
427
long attach_start_ns , attach_end_ns ;
@@ -670,7 +456,7 @@ static void test_kprobe_multi_bench_attach(bool kernel)
670
456
char * * syms = NULL ;
671
457
size_t cnt = 0 ;
672
458
673
- if (!ASSERT_OK (get_syms (& syms , & cnt , kernel ), "get_syms " ))
459
+ if (!ASSERT_OK (bpf_get_ksyms (& syms , & cnt , kernel ), "bpf_get_ksyms " ))
674
460
return ;
675
461
676
462
skel = kprobe_multi_empty__open_and_load ();
@@ -696,13 +482,13 @@ static void test_kprobe_multi_bench_attach_addr(bool kernel)
696
482
size_t cnt = 0 ;
697
483
int err ;
698
484
699
- err = get_addrs (& addrs , & cnt , kernel );
485
+ err = bpf_get_addrs (& addrs , & cnt , kernel );
700
486
if (err == - ENOENT ) {
701
487
test__skip ();
702
488
return ;
703
489
}
704
490
705
- if (!ASSERT_OK (err , "get_addrs " ))
491
+ if (!ASSERT_OK (err , "bpf_get_addrs " ))
706
492
return ;
707
493
708
494
skel = kprobe_multi_empty__open_and_load ();
0 commit comments