@@ -34,6 +34,11 @@ enum stat_id {
34
34
PEAK_STATES ,
35
35
MAX_STATES_PER_INSN ,
36
36
MARK_READ_MAX_LEN ,
37
+ SIZE ,
38
+ JITED_SIZE ,
39
+ STACK ,
40
+ PROG_TYPE ,
41
+ ATTACH_TYPE ,
37
42
38
43
FILE_NAME ,
39
44
PROG_NAME ,
@@ -640,19 +645,21 @@ static int append_filter_file(const char *path)
640
645
}
641
646
642
647
static const struct stat_specs default_output_spec = {
643
- .spec_cnt = 7 ,
648
+ .spec_cnt = 8 ,
644
649
.ids = {
645
650
FILE_NAME , PROG_NAME , VERDICT , DURATION ,
646
- TOTAL_INSNS , TOTAL_STATES , PEAK_STATES ,
651
+ TOTAL_INSNS , TOTAL_STATES , SIZE , JITED_SIZE
647
652
},
648
653
};
649
654
650
655
static const struct stat_specs default_csv_output_spec = {
651
- .spec_cnt = 9 ,
656
+ .spec_cnt = 14 ,
652
657
.ids = {
653
658
FILE_NAME , PROG_NAME , VERDICT , DURATION ,
654
659
TOTAL_INSNS , TOTAL_STATES , PEAK_STATES ,
655
660
MAX_STATES_PER_INSN , MARK_READ_MAX_LEN ,
661
+ SIZE , JITED_SIZE , PROG_TYPE , ATTACH_TYPE ,
662
+ STACK ,
656
663
},
657
664
};
658
665
@@ -688,6 +695,11 @@ static struct stat_def {
688
695
[PEAK_STATES ] = { "Peak states" , {"peak_states" }, },
689
696
[MAX_STATES_PER_INSN ] = { "Max states per insn" , {"max_states_per_insn" }, },
690
697
[MARK_READ_MAX_LEN ] = { "Max mark read length" , {"max_mark_read_len" , "mark_read" }, },
698
+ [SIZE ] = { "Program size" , {"prog_size" }, },
699
+ [JITED_SIZE ] = { "Jited size" , {"prog_size_jited" }, },
700
+ [STACK ] = {"Stack depth" , {"stack_depth" , "stack" }, },
701
+ [PROG_TYPE ] = { "Program type" , {"prog_type" }, },
702
+ [ATTACH_TYPE ] = { "Attach type" , {"attach_type" , }, },
691
703
};
692
704
693
705
static bool parse_stat_id_var (const char * name , size_t len , int * id ,
@@ -835,7 +847,8 @@ static char verif_log_buf[64 * 1024];
835
847
static int parse_verif_log (char * const buf , size_t buf_sz , struct verif_stats * s )
836
848
{
837
849
const char * cur ;
838
- int pos , lines ;
850
+ int pos , lines , sub_stack , cnt = 0 ;
851
+ char * state = NULL , * token , stack [512 ];
839
852
840
853
buf [buf_sz - 1 ] = '\0' ;
841
854
@@ -853,15 +866,22 @@ static int parse_verif_log(char * const buf, size_t buf_sz, struct verif_stats *
853
866
854
867
if (1 == sscanf (cur , "verification time %ld usec\n" , & s -> stats [DURATION ]))
855
868
continue ;
856
- if (6 == sscanf (cur , "processed %ld insns (limit %*d) max_states_per_insn %ld total_states %ld peak_states %ld mark_read %ld" ,
869
+ if (5 == sscanf (cur , "processed %ld insns (limit %*d) max_states_per_insn %ld total_states %ld peak_states %ld mark_read %ld" ,
857
870
& s -> stats [TOTAL_INSNS ],
858
871
& s -> stats [MAX_STATES_PER_INSN ],
859
872
& s -> stats [TOTAL_STATES ],
860
873
& s -> stats [PEAK_STATES ],
861
874
& s -> stats [MARK_READ_MAX_LEN ]))
862
875
continue ;
863
- }
864
876
877
+ if (1 == sscanf (cur , "stack depth %511s" , stack ))
878
+ continue ;
879
+ }
880
+ while ((token = strtok_r (cnt ++ ? NULL : stack , "+" , & state ))) {
881
+ if (sscanf (token , "%d" , & sub_stack ) == 0 )
882
+ break ;
883
+ s -> stats [STACK ] += sub_stack ;
884
+ }
865
885
return 0 ;
866
886
}
867
887
@@ -1146,8 +1166,11 @@ static int process_prog(const char *filename, struct bpf_object *obj, struct bpf
1146
1166
char * buf ;
1147
1167
int buf_sz , log_level ;
1148
1168
struct verif_stats * stats ;
1169
+ struct bpf_prog_info info ;
1170
+ __u32 info_len = sizeof (info );
1149
1171
int err = 0 ;
1150
1172
void * tmp ;
1173
+ int fd ;
1151
1174
1152
1175
if (!should_process_file_prog (base_filename , bpf_program__name (prog ))) {
1153
1176
env .progs_skipped ++ ;
@@ -1196,6 +1219,15 @@ static int process_prog(const char *filename, struct bpf_object *obj, struct bpf
1196
1219
stats -> file_name = strdup (base_filename );
1197
1220
stats -> prog_name = strdup (bpf_program__name (prog ));
1198
1221
stats -> stats [VERDICT ] = err == 0 ; /* 1 - success, 0 - failure */
1222
+ stats -> stats [SIZE ] = bpf_program__insn_cnt (prog );
1223
+ stats -> stats [PROG_TYPE ] = bpf_program__type (prog );
1224
+ stats -> stats [ATTACH_TYPE ] = bpf_program__expected_attach_type (prog );
1225
+
1226
+ memset (& info , 0 , info_len );
1227
+ fd = bpf_program__fd (prog );
1228
+ if (fd > 0 && bpf_prog_get_info_by_fd (fd , & info , & info_len ) == 0 )
1229
+ stats -> stats [JITED_SIZE ] = info .jited_prog_len ;
1230
+
1199
1231
parse_verif_log (buf , buf_sz , stats );
1200
1232
1201
1233
if (env .verbose ) {
@@ -1309,6 +1341,11 @@ static int cmp_stat(const struct verif_stats *s1, const struct verif_stats *s2,
1309
1341
case PROG_NAME :
1310
1342
cmp = strcmp (s1 -> prog_name , s2 -> prog_name );
1311
1343
break ;
1344
+ case ATTACH_TYPE :
1345
+ case PROG_TYPE :
1346
+ case SIZE :
1347
+ case JITED_SIZE :
1348
+ case STACK :
1312
1349
case VERDICT :
1313
1350
case DURATION :
1314
1351
case TOTAL_INSNS :
@@ -1523,12 +1560,27 @@ static void prepare_value(const struct verif_stats *s, enum stat_id id,
1523
1560
else
1524
1561
* str = s -> stats [VERDICT ] ? "success" : "failure" ;
1525
1562
break ;
1563
+ case ATTACH_TYPE :
1564
+ if (!s )
1565
+ * str = "N/A" ;
1566
+ else
1567
+ * str = libbpf_bpf_attach_type_str (s -> stats [ATTACH_TYPE ]) ?: "N/A" ;
1568
+ break ;
1569
+ case PROG_TYPE :
1570
+ if (!s )
1571
+ * str = "N/A" ;
1572
+ else
1573
+ * str = libbpf_bpf_prog_type_str (s -> stats [PROG_TYPE ]) ?: "N/A" ;
1574
+ break ;
1526
1575
case DURATION :
1527
1576
case TOTAL_INSNS :
1528
1577
case TOTAL_STATES :
1529
1578
case PEAK_STATES :
1530
1579
case MAX_STATES_PER_INSN :
1531
1580
case MARK_READ_MAX_LEN :
1581
+ case STACK :
1582
+ case SIZE :
1583
+ case JITED_SIZE :
1532
1584
* val = s ? s -> stats [id ] : 0 ;
1533
1585
break ;
1534
1586
default :
0 commit comments