@@ -158,6 +158,7 @@ struct bpf_program {
158
158
char * section_name ;
159
159
struct bpf_insn * insns ;
160
160
size_t insns_cnt ;
161
+ enum bpf_prog_type type ;
161
162
162
163
struct {
163
164
int insn_idx ;
@@ -299,6 +300,7 @@ bpf_program__init(void *data, size_t size, char *name, int idx,
299
300
prog -> idx = idx ;
300
301
prog -> instances .fds = NULL ;
301
302
prog -> instances .nr = -1 ;
303
+ prog -> type = BPF_PROG_TYPE_KPROBE ;
302
304
303
305
return 0 ;
304
306
errout :
@@ -894,8 +896,8 @@ static int bpf_object__collect_reloc(struct bpf_object *obj)
894
896
}
895
897
896
898
static int
897
- load_program (struct bpf_insn * insns , int insns_cnt ,
898
- char * license , u32 kern_version , int * pfd )
899
+ load_program (enum bpf_prog_type type , struct bpf_insn * insns ,
900
+ int insns_cnt , char * license , u32 kern_version , int * pfd )
899
901
{
900
902
int ret ;
901
903
char * log_buf ;
@@ -907,9 +909,8 @@ load_program(struct bpf_insn *insns, int insns_cnt,
907
909
if (!log_buf )
908
910
pr_warning ("Alloc log buffer for bpf loader error, continue without log\n" );
909
911
910
- ret = bpf_load_program (BPF_PROG_TYPE_KPROBE , insns ,
911
- insns_cnt , license , kern_version ,
912
- log_buf , BPF_LOG_BUF_SIZE );
912
+ ret = bpf_load_program (type , insns , insns_cnt , license ,
913
+ kern_version , log_buf , BPF_LOG_BUF_SIZE );
913
914
914
915
if (ret >= 0 ) {
915
916
* pfd = ret ;
@@ -968,7 +969,7 @@ bpf_program__load(struct bpf_program *prog,
968
969
pr_warning ("Program '%s' is inconsistent: nr(%d) != 1\n" ,
969
970
prog -> section_name , prog -> instances .nr );
970
971
}
971
- err = load_program (prog -> insns , prog -> insns_cnt ,
972
+ err = load_program (prog -> type , prog -> insns , prog -> insns_cnt ,
972
973
license , kern_version , & fd );
973
974
if (!err )
974
975
prog -> instances .fds [0 ] = fd ;
@@ -997,7 +998,7 @@ bpf_program__load(struct bpf_program *prog,
997
998
continue ;
998
999
}
999
1000
1000
- err = load_program (result .new_insn_ptr ,
1001
+ err = load_program (prog -> type , result .new_insn_ptr ,
1001
1002
result .new_insn_cnt ,
1002
1003
license , kern_version , & fd );
1003
1004
@@ -1316,6 +1317,44 @@ int bpf_program__nth_fd(struct bpf_program *prog, int n)
1316
1317
return fd ;
1317
1318
}
1318
1319
1320
+ static void bpf_program__set_type (struct bpf_program * prog ,
1321
+ enum bpf_prog_type type )
1322
+ {
1323
+ prog -> type = type ;
1324
+ }
1325
+
1326
+ int bpf_program__set_tracepoint (struct bpf_program * prog )
1327
+ {
1328
+ if (!prog )
1329
+ return - EINVAL ;
1330
+ bpf_program__set_type (prog , BPF_PROG_TYPE_TRACEPOINT );
1331
+ return 0 ;
1332
+ }
1333
+
1334
+ int bpf_program__set_kprobe (struct bpf_program * prog )
1335
+ {
1336
+ if (!prog )
1337
+ return - EINVAL ;
1338
+ bpf_program__set_type (prog , BPF_PROG_TYPE_KPROBE );
1339
+ return 0 ;
1340
+ }
1341
+
1342
+ static bool bpf_program__is_type (struct bpf_program * prog ,
1343
+ enum bpf_prog_type type )
1344
+ {
1345
+ return prog ? (prog -> type == type ) : false;
1346
+ }
1347
+
1348
+ bool bpf_program__is_tracepoint (struct bpf_program * prog )
1349
+ {
1350
+ return bpf_program__is_type (prog , BPF_PROG_TYPE_TRACEPOINT );
1351
+ }
1352
+
1353
+ bool bpf_program__is_kprobe (struct bpf_program * prog )
1354
+ {
1355
+ return bpf_program__is_type (prog , BPF_PROG_TYPE_KPROBE );
1356
+ }
1357
+
1319
1358
int bpf_map__fd (struct bpf_map * map )
1320
1359
{
1321
1360
return map ? map -> fd : - EINVAL ;
0 commit comments