lkml.org 
[lkml]   [2012]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 22/22] tracing: Add trace_options kernel command line parameter
    From: Steven Rostedt <srostedt@redhat.com>

    Add trace_options to the kernel command line parameter to be able to
    set options at early boot. For example, to enable stack dumps of
    events, add the following:

    trace_options=stacktrace

    This along with the trace_event option, you can get not only
    traces of the events but also the stack dumps with them.

    Requested-by: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    Documentation/kernel-parameters.txt | 16 +++++++++++
    kernel/trace/trace.c | 54 +++++++++++++++++++++++++----------
    2 files changed, 55 insertions(+), 15 deletions(-)

    diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
    index 9776f06..2b48c52 100644
    --- a/Documentation/kernel-parameters.txt
    +++ b/Documentation/kernel-parameters.txt
    @@ -2859,6 +2859,22 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
    to facilitate early boot debugging.
    See also Documentation/trace/events.txt

    + trace_options=[option-list]
    + [FTRACE] Enable or disable tracer options at boot.
    + The option-list is a comma delimited list of options
    + that can be enabled or disabled just as if you were
    + to echo the option name into
    +
    + /sys/kernel/debug/tracing/trace_options
    +
    + For example, to enable stacktrace option (to dump the
    + stack trace of each event), add to the command line:
    +
    + trace_options=stacktrace
    +
    + See also Documentation/trace/ftrace.txt "trace options"
    + section.
    +
    transparent_hugepage=
    [KNL]
    Format: [always|madvise|never]
    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index d5f5997..b69cc38 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -155,6 +155,18 @@ static int __init set_ftrace_dump_on_oops(char *str)
    }
    __setup("ftrace_dump_on_oops", set_ftrace_dump_on_oops);

    +
    +static char trace_boot_options_buf[MAX_TRACER_SIZE] __initdata;
    +static char *trace_boot_options __initdata;
    +
    +static int __init set_trace_boot_options(char *str)
    +{
    + strncpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
    + trace_boot_options = trace_boot_options_buf;
    + return 0;
    +}
    +__setup("trace_options=", set_trace_boot_options);
    +
    unsigned long long ns2usecs(cycle_t nsec)
    {
    nsec += 500;
    @@ -2844,24 +2856,14 @@ static void set_tracer_flags(unsigned int mask, int enabled)
    trace_printk_start_stop_comm(enabled);
    }

    -static ssize_t
    -tracing_trace_options_write(struct file *filp, const char __user *ubuf,
    - size_t cnt, loff_t *ppos)
    +static int trace_set_options(char *option)
    {
    - char buf[64];
    char *cmp;
    int neg = 0;
    - int ret;
    + int ret = 0;
    int i;

    - if (cnt >= sizeof(buf))
    - return -EINVAL;
    -
    - if (copy_from_user(&buf, ubuf, cnt))
    - return -EFAULT;
    -
    - buf[cnt] = 0;
    - cmp = strstrip(buf);
    + cmp = strstrip(option);

    if (strncmp(cmp, "no", 2) == 0) {
    neg = 1;
    @@ -2880,10 +2882,25 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
    mutex_lock(&trace_types_lock);
    ret = set_tracer_option(current_trace, cmp, neg);
    mutex_unlock(&trace_types_lock);
    - if (ret)
    - return ret;
    }

    + return ret;
    +}
    +
    +static ssize_t
    +tracing_trace_options_write(struct file *filp, const char __user *ubuf,
    + size_t cnt, loff_t *ppos)
    +{
    + char buf[64];
    +
    + if (cnt >= sizeof(buf))
    + return -EINVAL;
    +
    + if (copy_from_user(&buf, ubuf, cnt))
    + return -EFAULT;
    +
    + trace_set_options(buf);
    +
    *ppos += cnt;

    return cnt;
    @@ -5154,6 +5171,13 @@ __init static int tracer_alloc_buffers(void)

    register_die_notifier(&trace_die_notifier);

    + while (trace_boot_options) {
    + char *option;
    +
    + option = strsep(&trace_boot_options, ",");
    + trace_set_options(option);
    + }
    +
    return 0;

    out_free_cpumask:
    --
    1.7.10.4

    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2012-11-02 15:21    [W:2.649 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site