Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

tracing: eprobe: Cleanup eprobe event using __free()

Use __free(trace_event_probe_cleanup) to remove unneeded gotos and
cleanup the last part of trace_eprobe_parse_filter().

Link: https://lore.kernel.org/all/175509539571.193596.4674012182718751429.stgit@devnote2/

Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>

+30 -41
+30 -41
kernel/trace/trace_eprobe.c
··· 61 61 kfree(ep); 62 62 } 63 63 64 + DEFINE_FREE(trace_event_probe_cleanup, struct trace_eprobe *, 65 + if (!IS_ERR_OR_NULL(_T)) trace_event_probe_cleanup(_T)) 66 + 64 67 static struct trace_eprobe *to_trace_eprobe(struct dyn_event *ev) 65 68 { 66 69 return container_of(ev, struct trace_eprobe, devent); ··· 200 197 struct trace_event_call *event, 201 198 int nargs) 202 199 { 203 - struct trace_eprobe *ep; 200 + struct trace_eprobe *ep __free(trace_event_probe_cleanup) = NULL; 204 201 const char *event_name; 205 202 const char *sys_name; 206 - int ret = -ENOMEM; 203 + int ret; 207 204 208 205 if (!event) 209 206 return ERR_PTR(-ENODEV); ··· 214 211 ep = kzalloc(struct_size(ep, tp.args, nargs), GFP_KERNEL); 215 212 if (!ep) { 216 213 trace_event_put_ref(event); 217 - goto error; 214 + return ERR_PTR(-ENOMEM); 218 215 } 219 216 ep->event = event; 220 217 ep->event_name = kstrdup(event_name, GFP_KERNEL); 221 218 if (!ep->event_name) 222 - goto error; 219 + return ERR_PTR(-ENOMEM); 223 220 ep->event_system = kstrdup(sys_name, GFP_KERNEL); 224 221 if (!ep->event_system) 225 - goto error; 222 + return ERR_PTR(-ENOMEM); 226 223 227 224 ret = trace_probe_init(&ep->tp, this_event, group, false, nargs); 228 225 if (ret < 0) 229 - goto error; 226 + return ERR_PTR(ret); 230 227 231 228 dyn_event_init(&ep->devent, &eprobe_dyn_event_ops); 232 - return ep; 233 - error: 234 - trace_event_probe_cleanup(ep); 235 - return ERR_PTR(ret); 229 + return_ptr(ep); 236 230 } 237 231 238 232 static int eprobe_event_define_fields(struct trace_event_call *event_call) ··· 856 856 ret = create_event_filter(top_trace_array(), ep->event, ep->filter_str, 857 857 true, &dummy); 858 858 free_event_filter(dummy); 859 - if (ret) 860 - goto error; 861 - 862 - return 0; 863 - error: 864 - kfree(ep->filter_str); 865 - ep->filter_str = NULL; 859 + if (ret) { 860 + kfree(ep->filter_str); 861 + ep->filter_str = NULL; 862 + } 866 863 return ret; 867 864 } 868 865 ··· 871 874 * Fetch args (no space): 872 875 * <name>=$<field>[:TYPE] 873 876 */ 877 + struct trace_eprobe *ep __free(trace_event_probe_cleanup) = NULL; 874 878 const char *trlog __free(trace_probe_log_clear) = NULL; 875 879 const char *event = NULL, *group = EPROBE_EVENT_SYSTEM; 876 880 const char *sys_event = NULL, *sys_name = NULL; ··· 879 881 char *buf1 __free(kfree) = NULL; 880 882 char *buf2 __free(kfree) = NULL; 881 883 char *gbuf __free(kfree) = NULL; 882 - struct trace_eprobe *ep = NULL; 883 884 int ret = 0, filter_idx = 0; 884 885 int i, filter_cnt; 885 886 ··· 891 894 if (event) { 892 895 gbuf = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL); 893 896 if (!gbuf) 894 - goto mem_error; 897 + return -ENOMEM; 895 898 event++; 896 899 ret = traceprobe_parse_event_name(&event, &group, gbuf, 897 900 event - argv[0]); 898 901 if (ret) 899 - goto parse_error; 902 + return -EINVAL; 900 903 } 901 904 902 905 trace_probe_log_set_index(1); ··· 904 907 905 908 buf2 = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL); 906 909 if (!buf2) 907 - goto mem_error; 910 + return -ENOMEM; 908 911 909 912 ret = traceprobe_parse_event_name(&sys_event, &sys_name, buf2, 0); 910 913 if (ret || !sys_event || !sys_name) { 911 914 trace_probe_log_err(0, NO_EVENT_INFO); 912 - goto parse_error; 915 + return -EINVAL; 913 916 } 914 917 915 918 if (!event) { 916 919 buf1 = kstrdup(sys_event, GFP_KERNEL); 917 920 if (!buf1) 918 - goto mem_error; 921 + return -ENOMEM; 919 922 event = buf1; 920 923 } 921 924 ··· 931 934 if (argc - 2 > MAX_TRACE_ARGS) { 932 935 trace_probe_log_set_index(2); 933 936 trace_probe_log_err(0, TOO_MANY_ARGS); 934 - ret = -E2BIG; 935 - goto error; 937 + return -E2BIG; 936 938 } 937 939 938 940 scoped_guard(mutex, &event_mutex) { ··· 945 949 trace_probe_log_err(0, BAD_ATTACH_EVENT); 946 950 /* This must return -ENOMEM or missing event, else there is a bug */ 947 951 WARN_ON_ONCE(ret != -ENOMEM && ret != -ENODEV); 948 - ep = NULL; 949 - goto error; 952 + return ret; 950 953 } 951 954 952 955 if (filter_idx) { 953 956 trace_probe_log_set_index(filter_idx); 954 957 ret = trace_eprobe_parse_filter(ep, filter_cnt, argv + filter_idx); 955 958 if (ret) 956 - goto parse_error; 959 + return -EINVAL; 957 960 } else 958 961 ep->filter_str = NULL; 959 962 ··· 962 967 trace_probe_log_set_index(i + 2); 963 968 ret = trace_eprobe_tp_update_arg(ep, argv, i); 964 969 if (ret) 965 - goto error; 970 + return ret; 966 971 } 967 972 ret = traceprobe_set_print_fmt(&ep->tp, PROBE_PRINT_EVENT); 968 973 if (ret < 0) 969 - goto error; 974 + return ret; 975 + 970 976 init_trace_eprobe_call(ep); 971 977 scoped_guard(mutex, &event_mutex) { 972 978 ret = trace_probe_register_event_call(&ep->tp); ··· 976 980 trace_probe_log_set_index(0); 977 981 trace_probe_log_err(0, EVENT_EXIST); 978 982 } 979 - goto error; 983 + return ret; 980 984 } 981 985 ret = dyn_event_add(&ep->devent, &ep->tp.event->call); 982 986 if (ret < 0) { 983 987 trace_probe_unregister_event_call(&ep->tp); 984 - goto error; 988 + return ret; 985 989 } 990 + /* To avoid freeing registered eprobe event, clear ep. */ 991 + ep = NULL; 986 992 } 987 - return ret; 988 - 989 - mem_error: 990 - ret = -ENOMEM; 991 - goto error; 992 - parse_error: 993 - ret = -EINVAL; 994 - error: 995 - trace_event_probe_cleanup(ep); 996 993 return ret; 997 994 } 998 995