aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2009-06-23 21:54:19 -0400
committerIngo Molnar <mingo@elte.hu>2009-06-24 05:02:53 -0400
commit694ce0a544fba37a60025a6803ee6265be8a2a22 (patch)
treea6debd92de0dcf7b42dc129402ca793c540091ae /kernel
parent85951842a1020669f0a9eb0f0d1853b41341f097 (diff)
ftrace: Don't manipulate @pos in t_start()
It's rather confusing that in t_start(), in some cases @pos is incremented, and in some cases it's decremented and then incremented. This patch rewrites t_start() in a much more general way. Thus we fix a bug that if ftrace_filtered == 1, functions have tracer hooks won't be printed, because the branch is always unreachable: static void *t_start(...) { ... if (!p) return t_hash_start(m, pos); return p; } Before: # echo 'sys_open' > /mnt/tracing/set_ftrace_filter # echo 'sys_write:traceon:4' >> /mnt/tracing/set_ftrace_filter sys_open After: # echo 'sys_open' > /mnt/tracing/set_ftrace_filter # echo 'sys_write:traceon:4' >> /mnt/tracing/set_ftrace_filter sys_open sys_write:traceon:count=4 Reviewed-by: Liming Wang <liming.wang@windriver.com> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <4A41874B.4090507@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/ftrace.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index cde74b9973b7..dc810208edde 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1467,8 +1467,6 @@ t_next(struct seq_file *m, void *v, loff_t *pos)
1467 iter->pg = iter->pg->next; 1467 iter->pg = iter->pg->next;
1468 iter->idx = 0; 1468 iter->idx = 0;
1469 goto retry; 1469 goto retry;
1470 } else {
1471 iter->idx = -1;
1472 } 1470 }
1473 } else { 1471 } else {
1474 rec = &iter->pg->records[iter->idx++]; 1472 rec = &iter->pg->records[iter->idx++];
@@ -1497,6 +1495,7 @@ static void *t_start(struct seq_file *m, loff_t *pos)
1497{ 1495{
1498 struct ftrace_iterator *iter = m->private; 1496 struct ftrace_iterator *iter = m->private;
1499 void *p = NULL; 1497 void *p = NULL;
1498 loff_t l;
1500 1499
1501 mutex_lock(&ftrace_lock); 1500 mutex_lock(&ftrace_lock);
1502 /* 1501 /*
@@ -1508,23 +1507,21 @@ static void *t_start(struct seq_file *m, loff_t *pos)
1508 if (*pos > 0) 1507 if (*pos > 0)
1509 return t_hash_start(m, pos); 1508 return t_hash_start(m, pos);
1510 iter->flags |= FTRACE_ITER_PRINTALL; 1509 iter->flags |= FTRACE_ITER_PRINTALL;
1511 (*pos)++;
1512 return iter; 1510 return iter;
1513 } 1511 }
1514 1512
1515 if (iter->flags & FTRACE_ITER_HASH) 1513 if (iter->flags & FTRACE_ITER_HASH)
1516 return t_hash_start(m, pos); 1514 return t_hash_start(m, pos);
1517 1515
1518 if (*pos > 0) { 1516 iter->pg = ftrace_pages_start;
1519 if (iter->idx < 0) 1517 iter->idx = 0;
1520 return p; 1518 for (l = 0; l <= *pos; ) {
1521 (*pos)--; 1519 p = t_next(m, p, &l);
1522 iter->idx--; 1520 if (!p)
1521 break;
1523 } 1522 }
1524 1523
1525 p = t_next(m, p, pos); 1524 if (!p && iter->flags & FTRACE_ITER_FILTER)
1526
1527 if (!p)
1528 return t_hash_start(m, pos); 1525 return t_hash_start(m, pos);
1529 1526
1530 return p; 1527 return p;