aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_functions_graph.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2010-09-24 17:41:02 +0200
committerSteven Rostedt <rostedt@goodmis.org>2010-10-18 10:53:25 -0400
commita9d61173dc1cb63e660ae89e874e51ba4fd2f991 (patch)
treee1ca3badfc9604199670d049e26871bd69d8932f /kernel/trace/trace_functions_graph.c
parent907f27840985fe6a0c62e43cd4702c6e04b4bcc7 (diff)
downloadkernel_samsung_espresso10-a9d61173dc1cb63e660ae89e874e51ba4fd2f991.tar.gz
kernel_samsung_espresso10-a9d61173dc1cb63e660ae89e874e51ba4fd2f991.tar.bz2
kernel_samsung_espresso10-a9d61173dc1cb63e660ae89e874e51ba4fd2f991.zip
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>
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
-rw-r--r--kernel/trace/trace_functions_graph.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index ef49e9370b2..4c58ccc6427 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.
*/