aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 4b1122d0df37..ed1032d6f81d 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -101,10 +101,7 @@ static inline void ftrace_enable_cpu(void)
101 preempt_enable(); 101 preempt_enable();
102} 102}
103 103
104static cpumask_var_t __read_mostly tracing_buffer_mask; 104cpumask_var_t __read_mostly tracing_buffer_mask;
105
106#define for_each_tracing_cpu(cpu) \
107 for_each_cpu(cpu, tracing_buffer_mask)
108 105
109/* 106/*
110 * ftrace_dump_on_oops - variable to dump ftrace buffer on oops 107 * ftrace_dump_on_oops - variable to dump ftrace buffer on oops
@@ -1493,11 +1490,6 @@ int trace_vprintk(unsigned long ip, const char *fmt, va_list args)
1493} 1490}
1494EXPORT_SYMBOL_GPL(trace_vprintk); 1491EXPORT_SYMBOL_GPL(trace_vprintk);
1495 1492
1496enum trace_file_type {
1497 TRACE_FILE_LAT_FMT = 1,
1498 TRACE_FILE_ANNOTATE = 2,
1499};
1500
1501static void trace_iterator_increment(struct trace_iterator *iter) 1493static void trace_iterator_increment(struct trace_iterator *iter)
1502{ 1494{
1503 /* Don't allow ftrace to trace into the ring buffers */ 1495 /* Don't allow ftrace to trace into the ring buffers */
@@ -1595,7 +1587,7 @@ struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
1595} 1587}
1596 1588
1597/* Find the next real entry, and increment the iterator to the next entry */ 1589/* Find the next real entry, and increment the iterator to the next entry */
1598static void *find_next_entry_inc(struct trace_iterator *iter) 1590void *trace_find_next_entry_inc(struct trace_iterator *iter)
1599{ 1591{
1600 iter->ent = __find_next_entry(iter, &iter->cpu, 1592 iter->ent = __find_next_entry(iter, &iter->cpu,
1601 &iter->lost_events, &iter->ts); 1593 &iter->lost_events, &iter->ts);
@@ -1630,19 +1622,19 @@ static void *s_next(struct seq_file *m, void *v, loff_t *pos)
1630 return NULL; 1622 return NULL;
1631 1623
1632 if (iter->idx < 0) 1624 if (iter->idx < 0)
1633 ent = find_next_entry_inc(iter); 1625 ent = trace_find_next_entry_inc(iter);
1634 else 1626 else
1635 ent = iter; 1627 ent = iter;
1636 1628
1637 while (ent && iter->idx < i) 1629 while (ent && iter->idx < i)
1638 ent = find_next_entry_inc(iter); 1630 ent = trace_find_next_entry_inc(iter);
1639 1631
1640 iter->pos = *pos; 1632 iter->pos = *pos;
1641 1633
1642 return ent; 1634 return ent;
1643} 1635}
1644 1636
1645static void tracing_iter_reset(struct trace_iterator *iter, int cpu) 1637void tracing_iter_reset(struct trace_iterator *iter, int cpu)
1646{ 1638{
1647 struct trace_array *tr = iter->tr; 1639 struct trace_array *tr = iter->tr;
1648 struct ring_buffer_event *event; 1640 struct ring_buffer_event *event;
@@ -2003,7 +1995,7 @@ int trace_empty(struct trace_iterator *iter)
2003} 1995}
2004 1996
2005/* Called with trace_event_read_lock() held. */ 1997/* Called with trace_event_read_lock() held. */
2006static enum print_line_t print_trace_line(struct trace_iterator *iter) 1998enum print_line_t print_trace_line(struct trace_iterator *iter)
2007{ 1999{
2008 enum print_line_t ret; 2000 enum print_line_t ret;
2009 2001
@@ -3193,7 +3185,7 @@ waitagain:
3193 3185
3194 trace_event_read_lock(); 3186 trace_event_read_lock();
3195 trace_access_lock(iter->cpu_file); 3187 trace_access_lock(iter->cpu_file);
3196 while (find_next_entry_inc(iter) != NULL) { 3188 while (trace_find_next_entry_inc(iter) != NULL) {
3197 enum print_line_t ret; 3189 enum print_line_t ret;
3198 int len = iter->seq.len; 3190 int len = iter->seq.len;
3199 3191
@@ -3276,7 +3268,7 @@ tracing_fill_pipe_page(size_t rem, struct trace_iterator *iter)
3276 if (ret != TRACE_TYPE_NO_CONSUME) 3268 if (ret != TRACE_TYPE_NO_CONSUME)
3277 trace_consume(iter); 3269 trace_consume(iter);
3278 rem -= count; 3270 rem -= count;
3279 if (!find_next_entry_inc(iter)) { 3271 if (!trace_find_next_entry_inc(iter)) {
3280 rem = 0; 3272 rem = 0;
3281 iter->ent = NULL; 3273 iter->ent = NULL;
3282 break; 3274 break;
@@ -3332,7 +3324,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,
3332 if (ret <= 0) 3324 if (ret <= 0)
3333 goto out_err; 3325 goto out_err;
3334 3326
3335 if (!iter->ent && !find_next_entry_inc(iter)) { 3327 if (!iter->ent && !trace_find_next_entry_inc(iter)) {
3336 ret = -EFAULT; 3328 ret = -EFAULT;
3337 goto out_err; 3329 goto out_err;
3338 } 3330 }
@@ -4402,7 +4394,7 @@ static struct notifier_block trace_die_notifier = {
4402 */ 4394 */
4403#define KERN_TRACE KERN_EMERG 4395#define KERN_TRACE KERN_EMERG
4404 4396
4405static void 4397void
4406trace_printk_seq(struct trace_seq *s) 4398trace_printk_seq(struct trace_seq *s)
4407{ 4399{
4408 /* Probably should print a warning here. */ 4400 /* Probably should print a warning here. */
@@ -4417,6 +4409,13 @@ trace_printk_seq(struct trace_seq *s)
4417 trace_seq_init(s); 4409 trace_seq_init(s);
4418} 4410}
4419 4411
4412void trace_init_global_iter(struct trace_iterator *iter)
4413{
4414 iter->tr = &global_trace;
4415 iter->trace = current_trace;
4416 iter->cpu_file = TRACE_PIPE_ALL_CPU;
4417}
4418
4420static void 4419static void
4421__ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode) 4420__ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
4422{ 4421{
@@ -4442,8 +4441,10 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
4442 if (disable_tracing) 4441 if (disable_tracing)
4443 ftrace_kill(); 4442 ftrace_kill();
4444 4443
4444 trace_init_global_iter(&iter);
4445
4445 for_each_tracing_cpu(cpu) { 4446 for_each_tracing_cpu(cpu) {
4446 atomic_inc(&global_trace.data[cpu]->disabled); 4447 atomic_inc(&iter.tr->data[cpu]->disabled);
4447 } 4448 }
4448 4449
4449 old_userobj = trace_flags & TRACE_ITER_SYM_USEROBJ; 4450 old_userobj = trace_flags & TRACE_ITER_SYM_USEROBJ;
@@ -4492,7 +4493,7 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
4492 iter.iter_flags |= TRACE_FILE_LAT_FMT; 4493 iter.iter_flags |= TRACE_FILE_LAT_FMT;
4493 iter.pos = -1; 4494 iter.pos = -1;
4494 4495
4495 if (find_next_entry_inc(&iter) != NULL) { 4496 if (trace_find_next_entry_inc(&iter) != NULL) {
4496 int ret; 4497 int ret;
4497 4498
4498 ret = print_trace_line(&iter); 4499 ret = print_trace_line(&iter);
@@ -4514,7 +4515,7 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
4514 trace_flags |= old_userobj; 4515 trace_flags |= old_userobj;
4515 4516
4516 for_each_tracing_cpu(cpu) { 4517 for_each_tracing_cpu(cpu) {
4517 atomic_dec(&global_trace.data[cpu]->disabled); 4518 atomic_dec(&iter.tr->data[cpu]->disabled);
4518 } 4519 }
4519 tracing_on(); 4520 tracing_on();
4520 } 4521 }