mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
tracing: Add creation of instances at boot command line
Add kernel command line to add tracing instances. This only creates instances at boot but still does not enable any events to them. Later changes will extend this command line to add enabling of events, filters, and triggers. As well as possibly redirecting trace_printk()! Link: https://lkml.kernel.org/r/20230207173026.186210158@goodmis.org Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Ross Zwisler <zwisler@google.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
9971c3f944
commit
cb1f98c5e5
@ -6272,6 +6272,12 @@
|
||||
comma-separated list of trace events to enable. See
|
||||
also Documentation/trace/events.rst
|
||||
|
||||
trace_instance=[instance-info]
|
||||
[FTRACE] Create a ring buffer instance early in boot up.
|
||||
This will be listed in:
|
||||
|
||||
/sys/kernel/tracing/instances
|
||||
|
||||
trace_options=[option-list]
|
||||
[FTRACE] Enable or disable tracer options at boot.
|
||||
The option-list is a comma delimited list of options
|
||||
|
@ -49,6 +49,8 @@
|
||||
#include <linux/irq_work.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include <asm/setup.h> /* COMMAND_LINE_SIZE */
|
||||
|
||||
#include "trace.h"
|
||||
#include "trace_output.h"
|
||||
|
||||
@ -186,6 +188,9 @@ static char *default_bootup_tracer;
|
||||
static bool allocate_snapshot;
|
||||
static bool snapshot_at_boot;
|
||||
|
||||
static char boot_instance_info[COMMAND_LINE_SIZE] __initdata;
|
||||
static int boot_instance_index;
|
||||
|
||||
static int __init set_cmdline_ftrace(char *str)
|
||||
{
|
||||
strlcpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);
|
||||
@ -239,6 +244,23 @@ static int __init boot_snapshot(char *str)
|
||||
__setup("ftrace_boot_snapshot", boot_snapshot);
|
||||
|
||||
|
||||
static int __init boot_instance(char *str)
|
||||
{
|
||||
char *slot = boot_instance_info + boot_instance_index;
|
||||
int left = sizeof(boot_instance_info) - boot_instance_index;
|
||||
int ret;
|
||||
|
||||
if (strlen(str) >= left)
|
||||
return -1;
|
||||
|
||||
ret = snprintf(slot, left, "%s\t", str);
|
||||
boot_instance_index += ret;
|
||||
|
||||
return 1;
|
||||
}
|
||||
__setup("trace_instance=", boot_instance);
|
||||
|
||||
|
||||
static char trace_boot_options_buf[MAX_TRACER_SIZE] __initdata;
|
||||
|
||||
static int __init set_trace_boot_options(char *str)
|
||||
@ -10144,6 +10166,31 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
__init static void enable_instances(void)
|
||||
{
|
||||
struct trace_array *tr;
|
||||
char *curr_str;
|
||||
char *str;
|
||||
char *tok;
|
||||
|
||||
/* A tab is always appended */
|
||||
boot_instance_info[boot_instance_index - 1] = '\0';
|
||||
str = boot_instance_info;
|
||||
|
||||
while ((curr_str = strsep(&str, "\t"))) {
|
||||
|
||||
tok = strsep(&curr_str, ",");
|
||||
|
||||
tr = trace_array_get_by_name(tok);
|
||||
if (!tr) {
|
||||
pr_warn("Failed to create instance buffer %s\n", curr_str);
|
||||
continue;
|
||||
}
|
||||
/* Allow user space to delete it */
|
||||
trace_array_put(tr);
|
||||
}
|
||||
}
|
||||
|
||||
__init static int tracer_alloc_buffers(void)
|
||||
{
|
||||
int ring_buf_size;
|
||||
@ -10302,6 +10349,9 @@ void __init early_trace_init(void)
|
||||
void __init trace_init(void)
|
||||
{
|
||||
trace_event_init();
|
||||
|
||||
if (boot_instance_index)
|
||||
enable_instances();
|
||||
}
|
||||
|
||||
__init static void clear_boot_tracer(void)
|
||||
|
Loading…
Reference in New Issue
Block a user