@@ -37,6 +37,9 @@ DEFINE_PRINT_FN(info, 1)
37
37
DEFINE_PRINT_FN (debug , 1 )
38
38
39
39
struct bpf_prog_priv {
40
+ bool is_tp ;
41
+ char * sys_name ;
42
+ char * evt_name ;
40
43
struct perf_probe_event pev ;
41
44
bool need_prologue ;
42
45
struct bpf_insn * insns_buf ;
@@ -118,6 +121,8 @@ clear_prog_priv(struct bpf_program *prog __maybe_unused,
118
121
cleanup_perf_probe_events (& priv -> pev , 1 );
119
122
zfree (& priv -> insns_buf );
120
123
zfree (& priv -> type_mapping );
124
+ zfree (& priv -> sys_name );
125
+ zfree (& priv -> evt_name );
121
126
free (priv );
122
127
}
123
128
@@ -269,14 +274,31 @@ parse_prog_config_kvpair(const char *config_str, struct perf_probe_event *pev)
269
274
}
270
275
271
276
static int
272
- parse_prog_config (const char * config_str , struct perf_probe_event * pev )
277
+ parse_prog_config (const char * config_str , const char * * p_main_str ,
278
+ bool * is_tp , struct perf_probe_event * pev )
273
279
{
274
280
int err ;
275
281
const char * main_str = parse_prog_config_kvpair (config_str , pev );
276
282
277
283
if (IS_ERR (main_str ))
278
284
return PTR_ERR (main_str );
279
285
286
+ * p_main_str = main_str ;
287
+ if (!strchr (main_str , '=' )) {
288
+ /* Is a tracepoint event? */
289
+ const char * s = strchr (main_str , ':' );
290
+
291
+ if (!s ) {
292
+ pr_debug ("bpf: '%s' is not a valid tracepoint\n" ,
293
+ config_str );
294
+ return - BPF_LOADER_ERRNO__CONFIG ;
295
+ }
296
+
297
+ * is_tp = true;
298
+ return 0 ;
299
+ }
300
+
301
+ * is_tp = false;
280
302
err = parse_perf_probe_command (main_str , pev );
281
303
if (err < 0 ) {
282
304
pr_debug ("bpf: '%s' is not a valid config string\n" ,
@@ -292,7 +314,8 @@ config_bpf_program(struct bpf_program *prog)
292
314
{
293
315
struct perf_probe_event * pev = NULL ;
294
316
struct bpf_prog_priv * priv = NULL ;
295
- const char * config_str ;
317
+ const char * config_str , * main_str ;
318
+ bool is_tp = false;
296
319
int err ;
297
320
298
321
/* Initialize per-program probing setting */
@@ -313,10 +336,19 @@ config_bpf_program(struct bpf_program *prog)
313
336
pev = & priv -> pev ;
314
337
315
338
pr_debug ("bpf: config program '%s'\n" , config_str );
316
- err = parse_prog_config (config_str , pev );
339
+ err = parse_prog_config (config_str , & main_str , & is_tp , pev );
317
340
if (err )
318
341
goto errout ;
319
342
343
+ if (is_tp ) {
344
+ char * s = strchr (main_str , ':' );
345
+
346
+ priv -> is_tp = true;
347
+ priv -> sys_name = strndup (main_str , s - main_str );
348
+ priv -> evt_name = strdup (s + 1 );
349
+ goto set_priv ;
350
+ }
351
+
320
352
if (pev -> group && strcmp (pev -> group , PERF_BPF_PROBE_GROUP )) {
321
353
pr_debug ("bpf: '%s': group for event is set and not '%s'.\n" ,
322
354
config_str , PERF_BPF_PROBE_GROUP );
@@ -339,6 +371,7 @@ config_bpf_program(struct bpf_program *prog)
339
371
}
340
372
pr_debug ("bpf: config '%s' is ok\n" , config_str );
341
373
374
+ set_priv :
342
375
err = bpf_program__set_priv (prog , priv , clear_prog_priv );
343
376
if (err ) {
344
377
pr_debug ("Failed to set priv for program '%s'\n" , config_str );
@@ -387,7 +420,7 @@ preproc_gen_prologue(struct bpf_program *prog, int n,
387
420
size_t prologue_cnt = 0 ;
388
421
int i , err ;
389
422
390
- if (IS_ERR (priv ) || !priv )
423
+ if (IS_ERR (priv ) || !priv || priv -> is_tp )
391
424
goto errout ;
392
425
393
426
pev = & priv -> pev ;
@@ -544,6 +577,11 @@ static int hook_load_preprocessor(struct bpf_program *prog)
544
577
return - BPF_LOADER_ERRNO__INTERNAL ;
545
578
}
546
579
580
+ if (priv -> is_tp ) {
581
+ priv -> need_prologue = false;
582
+ return 0 ;
583
+ }
584
+
547
585
pev = & priv -> pev ;
548
586
for (i = 0 ; i < pev -> ntevs ; i ++ ) {
549
587
struct probe_trace_event * tev = & pev -> tevs [i ];
@@ -610,6 +648,13 @@ int bpf__probe(struct bpf_object *obj)
610
648
err = PTR_ERR (priv );
611
649
goto out ;
612
650
}
651
+
652
+ if (priv -> is_tp ) {
653
+ bpf_program__set_tracepoint (prog );
654
+ continue ;
655
+ }
656
+
657
+ bpf_program__set_kprobe (prog );
613
658
pev = & priv -> pev ;
614
659
615
660
err = convert_perf_probe_events (pev , 1 );
@@ -650,7 +695,7 @@ int bpf__unprobe(struct bpf_object *obj)
650
695
struct bpf_prog_priv * priv = bpf_program__priv (prog );
651
696
int i ;
652
697
653
- if (IS_ERR (priv ) || !priv )
698
+ if (IS_ERR (priv ) || !priv || priv -> is_tp )
654
699
continue ;
655
700
656
701
for (i = 0 ; i < priv -> pev .ntevs ; i ++ ) {
@@ -711,6 +756,16 @@ int bpf__foreach_event(struct bpf_object *obj,
711
756
return - BPF_LOADER_ERRNO__INTERNAL ;
712
757
}
713
758
759
+ if (priv -> is_tp ) {
760
+ fd = bpf_program__fd (prog );
761
+ err = (* func )(priv -> sys_name , priv -> evt_name , fd , arg );
762
+ if (err ) {
763
+ pr_debug ("bpf: tracepoint call back failed, stop iterate\n" );
764
+ return err ;
765
+ }
766
+ continue ;
767
+ }
768
+
714
769
pev = & priv -> pev ;
715
770
for (i = 0 ; i < pev -> ntevs ; i ++ ) {
716
771
tev = & pev -> tevs [i ];
0 commit comments