Re: [PATCHv2 1/3] tracing: proper check for irq_depth routines

From: Jiri Olsa
Date: Fri Sep 24 2010 - 11:41:16 EST


On Thu, Sep 23, 2010 at 03:48:13PM -0400, Steven Rostedt wrote:
> On Thu, 2010-09-23 at 14:00 +0200, Jiri Olsa wrote:
> > 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.
> >
> > wbr,
> > jirka
> >
> >
> > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> > ---
> > 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 02c708a..1390159 100644
> > --- a/kernel/trace/trace_functions_graph.c
> > +++ b/kernel/trace/trace_functions_graph.c
> > @@ -887,12 +887,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)
> > + /*
> > + * We either display irqs, or we got called as
> > + * graph event, and out private data do no exist.
>
> "out private data do no exist" makes no sense.
>
> > + * In both cases 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
> > */
> > @@ -925,12 +933,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)
> > + /*
> > + * We either display irqs, or we got called as
> > + * graph event, and out private data do no exist.
>
> ditto.
>
> -- Steve
>
> > + * In both cases 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.
> > */
>
>

hi,
attaching changed patch

thanks,
jirka

---
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.

wbr,
jirka


Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
---
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 02c708a..1390159 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -887,12 +887,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)
+ /*
+ * We either display irqs, or we got called as
+ * graph event, and private data do no exist.
+ * In both cases 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
*/
@@ -925,12 +933,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)
+ /*
+ * We either display irqs, or we got called as
+ * graph event, and private data do no exist.
+ * In both cases 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.
*/
--
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/