lkml.org 
[lkml]   [2010]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] tracing: Add proper check for irq_depth routines
    Commit-ID:  a9d61173dc1cb63e660ae89e874e51ba4fd2f991
    Gitweb: http://git.kernel.org/tip/a9d61173dc1cb63e660ae89e874e51ba4fd2f991
    Author: Jiri Olsa <jolsa@redhat.com>
    AuthorDate: Fri, 24 Sep 2010 17:41:02 +0200
    Committer: Steven Rostedt <rostedt@goodmis.org>
    CommitDate: Mon, 18 Oct 2010 10:53:25 -0400

    tracing: Add proper check for irq_depth routines

    The check_irq_entry and check_irq_return could be called
    from graph event context. In such case there's no graph
    private data allocated. Adding checks to handle this case.

    Signed-off-by: Jiri Olsa <jolsa@redhat.com>
    LKML-Reference: <20100924154102.GB1818@jolsa.brq.redhat.com>

    [ Fixed some grammar in the comments ]

    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    kernel/trace/trace_functions_graph.c | 24 ++++++++++++++++++++----
    1 files changed, 20 insertions(+), 4 deletions(-)

    diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
    index ef49e93..4c58ccc 100644
    --- a/kernel/trace/trace_functions_graph.c
    +++ b/kernel/trace/trace_functions_graph.c
    @@ -888,12 +888,20 @@ check_irq_entry(struct trace_iterator *iter, u32 flags,
    unsigned long addr, int depth)
    {
    int cpu = iter->cpu;
    + int *depth_irq;
    struct fgraph_data *data = iter->private;
    - int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

    - if (flags & TRACE_GRAPH_PRINT_IRQS)
    + /*
    + * If we are either displaying irqs, or we got called as
    + * a graph event and private data does not exist,
    + * then we bypass the irq check.
    + */
    + if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
    + (!data))
    return 0;

    + depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
    +
    /*
    * We are inside the irq code
    */
    @@ -926,12 +934,20 @@ static int
    check_irq_return(struct trace_iterator *iter, u32 flags, int depth)
    {
    int cpu = iter->cpu;
    + int *depth_irq;
    struct fgraph_data *data = iter->private;
    - int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

    - if (flags & TRACE_GRAPH_PRINT_IRQS)
    + /*
    + * If we are either displaying irqs, or we got called as
    + * a graph event and private data does not exist,
    + * then we bypass the irq check.
    + */
    + if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
    + (!data))
    return 0;

    + depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
    +
    /*
    * We are not inside the irq code.
    */

    \
     
     \ /
      Last update: 2010-10-20 07:01    [W:4.100 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site