@@ -836,7 +836,8 @@ static int validate_probe_symbol(char *symbol)
836
836
static int trace_kprobe_entry_handler (struct kretprobe_instance * ri ,
837
837
struct pt_regs * regs );
838
838
839
- static int __trace_kprobe_create (int argc , const char * argv [])
839
+ static int trace_kprobe_create_internal (int argc , const char * argv [],
840
+ struct traceprobe_parse_context * ctx )
840
841
{
841
842
/*
842
843
* Argument syntax:
@@ -877,7 +878,6 @@ static int __trace_kprobe_create(int argc, const char *argv[])
877
878
char gbuf [MAX_EVENT_NAME_LEN ];
878
879
char abuf [MAX_BTF_ARGS_LEN ];
879
880
char * dbuf __free (kfree ) = NULL ;
880
- struct traceprobe_parse_context ctx = { .flags = TPARG_FL_KERNEL };
881
881
882
882
switch (argv [0 ][0 ]) {
883
883
case 'r' :
@@ -891,38 +891,36 @@ static int __trace_kprobe_create(int argc, const char *argv[])
891
891
if (argc < 2 )
892
892
return - ECANCELED ;
893
893
894
- trace_probe_log_init ("trace_kprobe" , argc , argv );
895
-
896
894
event = strchr (& argv [0 ][1 ], ':' );
897
895
if (event )
898
896
event ++ ;
899
897
900
898
if (isdigit (argv [0 ][1 ])) {
901
899
if (!is_return ) {
902
900
trace_probe_log_err (1 , BAD_MAXACT_TYPE );
903
- goto parse_error ;
901
+ return - EINVAL ;
904
902
}
905
903
if (event )
906
904
len = event - & argv [0 ][1 ] - 1 ;
907
905
else
908
906
len = strlen (& argv [0 ][1 ]);
909
907
if (len > MAX_EVENT_NAME_LEN - 1 ) {
910
908
trace_probe_log_err (1 , BAD_MAXACT );
911
- goto parse_error ;
909
+ return - EINVAL ;
912
910
}
913
911
memcpy (buf , & argv [0 ][1 ], len );
914
912
buf [len ] = '\0' ;
915
913
ret = kstrtouint (buf , 0 , & maxactive );
916
914
if (ret || !maxactive ) {
917
915
trace_probe_log_err (1 , BAD_MAXACT );
918
- goto parse_error ;
916
+ return - EINVAL ;
919
917
}
920
918
/* kretprobes instances are iterated over via a list. The
921
919
* maximum should stay reasonable.
922
920
*/
923
921
if (maxactive > KRETPROBE_MAXACTIVE_MAX ) {
924
922
trace_probe_log_err (1 , MAXACT_TOO_BIG );
925
- goto parse_error ;
923
+ return - EINVAL ;
926
924
}
927
925
}
928
926
@@ -931,16 +929,13 @@ static int __trace_kprobe_create(int argc, const char *argv[])
931
929
if (kstrtoul (argv [1 ], 0 , (unsigned long * )& addr )) {
932
930
trace_probe_log_set_index (1 );
933
931
/* Check whether uprobe event specified */
934
- if (strchr (argv [1 ], '/' ) && strchr (argv [1 ], ':' )) {
935
- ret = - ECANCELED ;
936
- goto out ;
937
- }
932
+ if (strchr (argv [1 ], '/' ) && strchr (argv [1 ], ':' ))
933
+ return - ECANCELED ;
934
+
938
935
/* a symbol specified */
939
936
symbol = kstrdup (argv [1 ], GFP_KERNEL );
940
- if (!symbol ) {
941
- ret = - ENOMEM ;
942
- goto out ;
943
- }
937
+ if (!symbol )
938
+ return - ENOMEM ;
944
939
945
940
tmp = strchr (symbol , '%' );
946
941
if (tmp ) {
@@ -949,33 +944,33 @@ static int __trace_kprobe_create(int argc, const char *argv[])
949
944
is_return = true;
950
945
} else {
951
946
trace_probe_log_err (tmp - symbol , BAD_ADDR_SUFFIX );
952
- goto parse_error ;
947
+ return - EINVAL ;
953
948
}
954
949
}
955
950
956
951
/* TODO: support .init module functions */
957
952
ret = traceprobe_split_symbol_offset (symbol , & offset );
958
953
if (ret || offset < 0 || offset > UINT_MAX ) {
959
954
trace_probe_log_err (0 , BAD_PROBE_ADDR );
960
- goto parse_error ;
955
+ return - EINVAL ;
961
956
}
962
957
ret = validate_probe_symbol (symbol );
963
958
if (ret ) {
964
959
if (ret == - EADDRNOTAVAIL )
965
960
trace_probe_log_err (0 , NON_UNIQ_SYMBOL );
966
961
else
967
962
trace_probe_log_err (0 , BAD_PROBE_ADDR );
968
- goto parse_error ;
963
+ return - EINVAL ;
969
964
}
970
965
if (is_return )
971
- ctx . flags |= TPARG_FL_RETURN ;
966
+ ctx -> flags |= TPARG_FL_RETURN ;
972
967
ret = kprobe_on_func_entry (NULL , symbol , offset );
973
968
if (ret == 0 && !is_return )
974
- ctx . flags |= TPARG_FL_FENTRY ;
969
+ ctx -> flags |= TPARG_FL_FENTRY ;
975
970
/* Defer the ENOENT case until register kprobe */
976
971
if (ret == - EINVAL && is_return ) {
977
972
trace_probe_log_err (0 , BAD_RETPROBE );
978
- goto parse_error ;
973
+ return - EINVAL ;
979
974
}
980
975
}
981
976
@@ -984,7 +979,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
984
979
ret = traceprobe_parse_event_name (& event , & group , gbuf ,
985
980
event - argv [0 ]);
986
981
if (ret )
987
- goto parse_error ;
982
+ return ret ;
988
983
}
989
984
990
985
if (!event ) {
@@ -1000,26 +995,24 @@ static int __trace_kprobe_create(int argc, const char *argv[])
1000
995
}
1001
996
1002
997
argc -= 2 ; argv += 2 ;
1003
- ctx . funcname = symbol ;
998
+ ctx -> funcname = symbol ;
1004
999
new_argv = traceprobe_expand_meta_args (argc , argv , & new_argc ,
1005
- abuf , MAX_BTF_ARGS_LEN , & ctx );
1000
+ abuf , MAX_BTF_ARGS_LEN , ctx );
1006
1001
if (IS_ERR (new_argv )) {
1007
1002
ret = PTR_ERR (new_argv );
1008
1003
new_argv = NULL ;
1009
- goto out ;
1004
+ return ret ;
1010
1005
}
1011
1006
if (new_argv ) {
1012
1007
argc = new_argc ;
1013
1008
argv = new_argv ;
1014
1009
}
1015
- if (argc > MAX_TRACE_ARGS ) {
1016
- ret = - E2BIG ;
1017
- goto out ;
1018
- }
1010
+ if (argc > MAX_TRACE_ARGS )
1011
+ return - E2BIG ;
1019
1012
1020
1013
ret = traceprobe_expand_dentry_args (argc , argv , & dbuf );
1021
1014
if (ret )
1022
- goto out ;
1015
+ return ret ;
1023
1016
1024
1017
/* setup a probe */
1025
1018
tk = alloc_trace_kprobe (group , event , addr , symbol , offset , maxactive ,
@@ -1028,16 +1021,16 @@ static int __trace_kprobe_create(int argc, const char *argv[])
1028
1021
ret = PTR_ERR (tk );
1029
1022
/* This must return -ENOMEM, else there is a bug */
1030
1023
WARN_ON_ONCE (ret != - ENOMEM );
1031
- goto out ; /* We know tk is not allocated */
1024
+ return ret ; /* We know tk is not allocated */
1032
1025
}
1033
1026
1034
1027
/* parse arguments */
1035
1028
for (i = 0 ; i < argc ; i ++ ) {
1036
1029
trace_probe_log_set_index (i + 2 );
1037
- ctx . offset = 0 ;
1038
- ret = traceprobe_parse_probe_arg (& tk -> tp , i , argv [i ], & ctx );
1030
+ ctx -> offset = 0 ;
1031
+ ret = traceprobe_parse_probe_arg (& tk -> tp , i , argv [i ], ctx );
1039
1032
if (ret )
1040
- goto out ; /* This can be -ENOMEM */
1033
+ return ret ; /* This can be -ENOMEM */
1041
1034
}
1042
1035
/* entry handler for kretprobe */
1043
1036
if (is_return && tk -> tp .entry_arg ) {
@@ -1048,7 +1041,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
1048
1041
ptype = is_return ? PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL ;
1049
1042
ret = traceprobe_set_print_fmt (& tk -> tp , ptype );
1050
1043
if (ret < 0 )
1051
- goto out ;
1044
+ return ret ;
1052
1045
1053
1046
ret = register_trace_kprobe (tk );
1054
1047
if (ret ) {
@@ -1059,26 +1052,34 @@ static int __trace_kprobe_create(int argc, const char *argv[])
1059
1052
trace_probe_log_err (0 , BAD_PROBE_ADDR );
1060
1053
else if (ret != - ENOMEM && ret != - EEXIST )
1061
1054
trace_probe_log_err (0 , FAIL_REG_PROBE );
1062
- } else
1063
- /*
1064
- * Here, 'tk' has been registered to the list successfully,
1065
- * so we don't need to free it.
1066
- */
1067
- tk = NULL ;
1055
+ return ret ;
1056
+ }
1057
+ /*
1058
+ * Here, 'tk' has been registered to the list successfully,
1059
+ * so we don't need to free it.
1060
+ */
1061
+ tk = NULL ;
1062
+
1063
+ return 0 ;
1064
+ }
1065
+
1066
+ static int trace_kprobe_create_cb (int argc , const char * argv [])
1067
+ {
1068
+ struct traceprobe_parse_context ctx = { .flags = TPARG_FL_KERNEL };
1069
+ int ret ;
1070
+
1071
+ trace_probe_log_init ("trace_kprobe" , argc , argv );
1072
+
1073
+ ret = trace_kprobe_create_internal (argc , argv , & ctx );
1068
1074
1069
- out :
1070
1075
traceprobe_finish_parse (& ctx );
1071
1076
trace_probe_log_clear ();
1072
1077
return ret ;
1073
-
1074
- parse_error :
1075
- ret = - EINVAL ;
1076
- goto out ;
1077
1078
}
1078
1079
1079
1080
static int trace_kprobe_create (const char * raw_command )
1080
1081
{
1081
- return trace_probe_create (raw_command , __trace_kprobe_create );
1082
+ return trace_probe_create (raw_command , trace_kprobe_create_cb );
1082
1083
}
1083
1084
1084
1085
static int create_or_delete_trace_kprobe (const char * raw_command )
0 commit comments