From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752939AbbJRMAE (ORCPT ); Sun, 18 Oct 2015 08:00:04 -0400 Received: from mail-pa0-f41.google.com ([209.85.220.41]:35652 "EHLO mail-pa0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752730AbbJRL7P (ORCPT ); Sun, 18 Oct 2015 07:59:15 -0400 From: Jiaxing Wang To: Steven Rostedt Cc: linux-kernel@vger.kernel.org, Jiaxing Wang Subject: [PATCH 3/3] tracing: Apply tracer specific options from kernel command line. Date: Sun, 18 Oct 2015 19:58:10 +0800 Message-Id: <1445169490-18315-4-git-send-email-hello.wjx@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1445169490-18315-1-git-send-email-hello.wjx@gmail.com> References: <1445169490-18315-1-git-send-email-hello.wjx@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, the trace_options parameter is only applied in tracer_alloc_buffers() when global_trace.current_trace is nop_trace, so a tracer specific option will not be applied even when the specific tracer is also enabled from kernel command line. For example, the 'func_stack_trace' option can't be enabled with the following kernel parameter: ftrace=function ftrace_filter=kfree trace_options=func_stack_trace We can enable tracer specific options by simply apply the options again if the specific tracer is also supplied from command line and started in register_tracer(). To keep trace_boot_options_buf from overwritten by strsep() and strstrip() and can be parsed again, a copy is made for them to work on. Also make register_tracer() be __init to access the __init data, and in fact register_tracer is only called from __init code. Signed-off-by: Jiaxing Wang --- kernel/trace/trace.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 2d3042f..d42af59 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1204,13 +1204,15 @@ static inline int run_tracer_selftest(struct tracer *type) } #endif /* CONFIG_FTRACE_STARTUP_TEST */ +static int __init apply_trace_boot_options(void); + /** * register_tracer - register a tracer with the ftrace system. * @type - the plugin for the tracer * * Register a new plugin tracer. */ -int register_tracer(struct tracer *type) +int __init register_tracer(struct tracer *type) { struct tracer *t; int ret = 0; @@ -1268,6 +1270,9 @@ int register_tracer(struct tracer *type) /* Do we want this tracer to start on bootup? */ tracing_set_tracer(&global_trace, type->name); default_bootup_tracer = NULL; + + apply_trace_boot_options(); + /* disable other selftests, since this will break it. */ tracing_selftest_disabled = true; #ifdef CONFIG_FTRACE_STARTUP_TEST @@ -3603,6 +3608,33 @@ static int trace_set_options(struct trace_array *tr, char *option) return ret; } +static int __init apply_trace_boot_options(void) +{ + char *option; + char *buf; + char *str; + size_t len; + + if (trace_boot_options) { + len = strlen(trace_boot_options); + + buf = str = kmalloc(len + 1, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + memcpy(buf, trace_boot_options, len + 1); + + while (str) { + option = strsep(&str, ","); + trace_set_options(&global_trace, option); + } + + kfree(buf); + } + + return 0; +} + static ssize_t tracing_trace_options_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) @@ -7153,12 +7185,7 @@ __init static int tracer_alloc_buffers(void) INIT_LIST_HEAD(&global_trace.events); list_add(&global_trace.list, &ftrace_trace_arrays); - while (trace_boot_options) { - char *option; - - option = strsep(&trace_boot_options, ","); - trace_set_options(&global_trace, option); - } + apply_trace_boot_options(); register_snapshot_cmd(); -- 2.1.4