aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_irqsoff.c
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-05-12 15:20:54 -0400
committerThomas Gleixner <tglx@linutronix.de>2008-05-23 15:13:02 -0400
commit4fe8c3048cd8280a54256bca9cac2007bd546c33 (patch)
treeb6bba481a3dde79a027654675d3b34da24ca54f2 /kernel/trace/trace_irqsoff.c
parent8f96da02c14d722ad9a3713cd7273ce28c9036ad (diff)
ftrace: printk and trace irqsoff and wakeups
printk called from wakeup critical timings and irqs off can cause deadlocks since printk might do a wakeup itself. If the call to printk happens with the runqueue lock held, it can deadlock. This patch protects the printk from being called in trace irqs off with a test to see if the runqueue for the current CPU is locked. If it is locked, the printk is skipped. The wakeup always holds the runqueue lock, so the printk is simply removed. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/trace/trace_irqsoff.c')
-rw-r--r--kernel/trace/trace_irqsoff.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
index 7a4dc014b8ab..d0c1748b1e2c 100644
--- a/kernel/trace/trace_irqsoff.c
+++ b/kernel/trace/trace_irqsoff.c
@@ -165,18 +165,20 @@ check_critical_timing(struct trace_array *tr,
165 165
166 update_max_tr_single(tr, current, cpu); 166 update_max_tr_single(tr, current, cpu);
167 167
168 if (tracing_thresh) { 168 if (!runqueue_is_locked()) {
169 printk(KERN_INFO "(%16s-%-5d|#%d):" 169 if (tracing_thresh) {
170 " %lu us critical section violates %lu us threshold.\n", 170 printk(KERN_INFO "(%16s-%-5d|#%d): %lu us critical"
171 current->comm, current->pid, 171 " section violates %lu us threshold.\n",
172 raw_smp_processor_id(), 172 current->comm, current->pid,
173 latency, nsecs_to_usecs(tracing_thresh)); 173 raw_smp_processor_id(),
174 } else { 174 latency, nsecs_to_usecs(tracing_thresh));
175 printk(KERN_INFO "(%16s-%-5d|#%d):" 175 } else {
176 " new %lu us maximum-latency critical section.\n", 176 printk(KERN_INFO "(%16s-%-5d|#%d): new %lu us"
177 current->comm, current->pid, 177 " maximum-latency critical section.\n",
178 raw_smp_processor_id(), 178 current->comm, current->pid,
179 latency); 179 raw_smp_processor_id(),
180 latency);
181 }
180 } 182 }
181 183
182 max_sequence++; 184 max_sequence++;