trace_events.c (6b93f350e55f3f2ee071dd41109d936abfba8ebf) trace_events.c (d23569979ca1cd139a42c410e0c7b9e6014c3b3a)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * event tracer
4 *
5 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 *
7 * - Added format output of fields of the trace point.
8 * This was based off of work by Tom Zanussi <tzanussi@gmail.com>.

--- 2882 unchanged lines hidden (view full) ---

2891 update_event_fields(call, map[i]);
2892 }
2893 }
2894 cond_resched();
2895 }
2896 up_write(&trace_event_sem);
2897}
2898
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * event tracer
4 *
5 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 *
7 * - Added format output of fields of the trace point.
8 * This was based off of work by Tom Zanussi <tzanussi@gmail.com>.

--- 2882 unchanged lines hidden (view full) ---

2891 update_event_fields(call, map[i]);
2892 }
2893 }
2894 cond_resched();
2895 }
2896 up_write(&trace_event_sem);
2897}
2898
2899static bool event_in_systems(struct trace_event_call *call,
2900 const char *systems)
2901{
2902 const char *system;
2903 const char *p;
2904
2905 if (!systems)
2906 return true;
2907
2908 system = call->class->system;
2909 p = strstr(systems, system);
2910 if (!p)
2911 return false;
2912
2913 if (p != systems && !isspace(*(p - 1)) && *(p - 1) != ',')
2914 return false;
2915
2916 p += strlen(system);
2917 return !*p || isspace(*p) || *p == ',';
2918}
2919
2899static struct trace_event_file *
2900trace_create_new_event(struct trace_event_call *call,
2901 struct trace_array *tr)
2902{
2903 struct trace_pid_list *no_pid_list;
2904 struct trace_pid_list *pid_list;
2905 struct trace_event_file *file;
2906 unsigned int first;
2907
2920static struct trace_event_file *
2921trace_create_new_event(struct trace_event_call *call,
2922 struct trace_array *tr)
2923{
2924 struct trace_pid_list *no_pid_list;
2925 struct trace_pid_list *pid_list;
2926 struct trace_event_file *file;
2927 unsigned int first;
2928
2929 if (!event_in_systems(call, tr->system_names))
2930 return NULL;
2931
2908 file = kmem_cache_alloc(file_cachep, GFP_TRACE);
2909 if (!file)
2932 file = kmem_cache_alloc(file_cachep, GFP_TRACE);
2933 if (!file)
2910 return NULL;
2934 return ERR_PTR(-ENOMEM);
2911
2912 pid_list = rcu_dereference_protected(tr->filtered_pids,
2913 lockdep_is_held(&event_mutex));
2914 no_pid_list = rcu_dereference_protected(tr->filtered_no_pids,
2915 lockdep_is_held(&event_mutex));
2916
2917 if (!trace_pid_list_first(pid_list, &first) ||
2918 !trace_pid_list_first(no_pid_list, &first))

--- 48 unchanged lines hidden (view full) ---

2967
2968/* Add an event to a trace directory */
2969static int
2970__trace_add_new_event(struct trace_event_call *call, struct trace_array *tr)
2971{
2972 struct trace_event_file *file;
2973
2974 file = trace_create_new_event(call, tr);
2935
2936 pid_list = rcu_dereference_protected(tr->filtered_pids,
2937 lockdep_is_held(&event_mutex));
2938 no_pid_list = rcu_dereference_protected(tr->filtered_no_pids,
2939 lockdep_is_held(&event_mutex));
2940
2941 if (!trace_pid_list_first(pid_list, &first) ||
2942 !trace_pid_list_first(no_pid_list, &first))

--- 48 unchanged lines hidden (view full) ---

2991
2992/* Add an event to a trace directory */
2993static int
2994__trace_add_new_event(struct trace_event_call *call, struct trace_array *tr)
2995{
2996 struct trace_event_file *file;
2997
2998 file = trace_create_new_event(call, tr);
2999 /*
3000 * trace_create_new_event() returns ERR_PTR(-ENOMEM) if failed
3001 * allocation, or NULL if the event is not part of the tr->system_names.
3002 * When the event is not part of the tr->system_names, return zero, not
3003 * an error.
3004 */
2975 if (!file)
3005 if (!file)
2976 return -ENOMEM;
3006 return 0;
2977
3007
3008 if (IS_ERR(file))
3009 return PTR_ERR(file);
3010
2978 if (eventdir_initialized)
2979 return event_create_dir(tr->event_dir, file);
2980 else
2981 return event_define_fields(call);
2982}
2983
2984static void trace_early_triggers(struct trace_event_file *file, const char *name)
2985{

--- 21 unchanged lines hidden (view full) ---

3007static int
3008__trace_early_add_new_event(struct trace_event_call *call,
3009 struct trace_array *tr)
3010{
3011 struct trace_event_file *file;
3012 int ret;
3013
3014 file = trace_create_new_event(call, tr);
3011 if (eventdir_initialized)
3012 return event_create_dir(tr->event_dir, file);
3013 else
3014 return event_define_fields(call);
3015}
3016
3017static void trace_early_triggers(struct trace_event_file *file, const char *name)
3018{

--- 21 unchanged lines hidden (view full) ---

3040static int
3041__trace_early_add_new_event(struct trace_event_call *call,
3042 struct trace_array *tr)
3043{
3044 struct trace_event_file *file;
3045 int ret;
3046
3047 file = trace_create_new_event(call, tr);
3048 /*
3049 * trace_create_new_event() returns ERR_PTR(-ENOMEM) if failed
3050 * allocation, or NULL if the event is not part of the tr->system_names.
3051 * When the event is not part of the tr->system_names, return zero, not
3052 * an error.
3053 */
3015 if (!file)
3054 if (!file)
3016 return -ENOMEM;
3055 return 0;
3017
3056
3057 if (IS_ERR(file))
3058 return PTR_ERR(file);
3059
3018 ret = event_define_fields(call);
3019 if (ret)
3020 return ret;
3021
3022 trace_early_triggers(file, trace_event_name(call));
3023
3024 return 0;
3025}

--- 1273 unchanged lines hidden ---
3060 ret = event_define_fields(call);
3061 if (ret)
3062 return ret;
3063
3064 trace_early_triggers(file, trace_event_name(call));
3065
3066 return 0;
3067}

--- 1273 unchanged lines hidden ---