Merge tag 'trace-v5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Tracing fixes for 5.15: - Fix defined but not use warning/error for osnoise function - Fix memory leak in event probe - Fix memblock leak in bootconfig - Fix the API of event probes to be like kprobes - Added test to check removal of event probe API - Fix recordmcount.pl for nds32 failed build * tag 'trace-v5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^' selftests/ftrace: Update test for more eprobe removal process tracing: Fix event probe removal from dynamic events tracing: Fix missing * in comment block bootconfig: init: Fix memblock leak in xbc_make_cmdline() tracing: Fix memory leak in eprobe_register() tracing: Fix missing osnoise tracer on max_latency
This commit is contained in:
@@ -1744,16 +1744,15 @@ void latency_fsnotify(struct trace_array *tr)
|
||||
irq_work_queue(&tr->fsnotify_irqwork);
|
||||
}
|
||||
|
||||
/*
|
||||
* (defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER)) && \
|
||||
* defined(CONFIG_FSNOTIFY)
|
||||
*/
|
||||
#else
|
||||
#elif defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) \
|
||||
|| defined(CONFIG_OSNOISE_TRACER)
|
||||
|
||||
#define trace_create_maxlat_file(tr, d_tracer) \
|
||||
trace_create_file("tracing_max_latency", 0644, d_tracer, \
|
||||
&tr->max_latency, &tracing_max_lat_fops)
|
||||
|
||||
#else
|
||||
#define trace_create_maxlat_file(tr, d_tracer) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TRACER_MAX_TRACE
|
||||
@@ -9473,9 +9472,7 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
|
||||
|
||||
create_trace_options_dir(tr);
|
||||
|
||||
#if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER)
|
||||
trace_create_maxlat_file(tr, d_tracer);
|
||||
#endif
|
||||
|
||||
if (ftrace_create_function_files(tr, d_tracer))
|
||||
MEM_FAIL(1, "Could not allocate function filter files");
|
||||
|
||||
@@ -119,10 +119,58 @@ static bool eprobe_dyn_event_match(const char *system, const char *event,
|
||||
int argc, const char **argv, struct dyn_event *ev)
|
||||
{
|
||||
struct trace_eprobe *ep = to_trace_eprobe(ev);
|
||||
const char *slash;
|
||||
|
||||
return strcmp(trace_probe_name(&ep->tp), event) == 0 &&
|
||||
(!system || strcmp(trace_probe_group_name(&ep->tp), system) == 0) &&
|
||||
trace_probe_match_command_args(&ep->tp, argc, argv);
|
||||
/*
|
||||
* We match the following:
|
||||
* event only - match all eprobes with event name
|
||||
* system and event only - match all system/event probes
|
||||
*
|
||||
* The below has the above satisfied with more arguments:
|
||||
*
|
||||
* attached system/event - If the arg has the system and event
|
||||
* the probe is attached to, match
|
||||
* probes with the attachment.
|
||||
*
|
||||
* If any more args are given, then it requires a full match.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If system exists, but this probe is not part of that system
|
||||
* do not match.
|
||||
*/
|
||||
if (system && strcmp(trace_probe_group_name(&ep->tp), system) != 0)
|
||||
return false;
|
||||
|
||||
/* Must match the event name */
|
||||
if (strcmp(trace_probe_name(&ep->tp), event) != 0)
|
||||
return false;
|
||||
|
||||
/* No arguments match all */
|
||||
if (argc < 1)
|
||||
return true;
|
||||
|
||||
/* First argument is the system/event the probe is attached to */
|
||||
|
||||
slash = strchr(argv[0], '/');
|
||||
if (!slash)
|
||||
slash = strchr(argv[0], '.');
|
||||
if (!slash)
|
||||
return false;
|
||||
|
||||
if (strncmp(ep->event_system, argv[0], slash - argv[0]))
|
||||
return false;
|
||||
if (strcmp(ep->event_name, slash + 1))
|
||||
return false;
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
/* If there are no other args, then match */
|
||||
if (argc < 1)
|
||||
return true;
|
||||
|
||||
return trace_probe_match_command_args(&ep->tp, argc, argv);
|
||||
}
|
||||
|
||||
static struct dyn_event_operations eprobe_dyn_event_ops = {
|
||||
@@ -632,6 +680,13 @@ static int disable_eprobe(struct trace_eprobe *ep,
|
||||
|
||||
trace_event_trigger_enable_disable(file, 0);
|
||||
update_cond_flag(file);
|
||||
|
||||
/* Make sure nothing is using the edata or trigger */
|
||||
tracepoint_synchronize_unregister();
|
||||
|
||||
kfree(edata);
|
||||
kfree(trigger);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2506,7 +2506,7 @@ find_synthetic_field_var(struct hist_trigger_data *target_hist_data,
|
||||
* events. However, for convenience, users are allowed to directly
|
||||
* specify an event field in an action, which will be automatically
|
||||
* converted into a variable on their behalf.
|
||||
|
||||
*
|
||||
* If a user specifies a field on an event that isn't the event the
|
||||
* histogram currently being defined (the target event histogram), the
|
||||
* only way that can be accomplished is if a new hist trigger is
|
||||
|
||||
Reference in New Issue
Block a user