Commit 694ce0a544fba37a60025a6803ee6265be8a2a22
Committed by
Ingo Molnar
1 parent
85951842a1
Exists in
master
and in
39 other branches
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>
Showing 1 changed file with 8 additions and 11 deletions Side-by-side Diff
kernel/trace/ftrace.c
... | ... | @@ -1467,8 +1467,6 @@ |
1467 | 1467 | iter->pg = iter->pg->next; |
1468 | 1468 | iter->idx = 0; |
1469 | 1469 | goto retry; |
1470 | - } else { | |
1471 | - iter->idx = -1; | |
1472 | 1470 | } |
1473 | 1471 | } else { |
1474 | 1472 | rec = &iter->pg->records[iter->idx++]; |
... | ... | @@ -1497,6 +1495,7 @@ |
1497 | 1495 | { |
1498 | 1496 | struct ftrace_iterator *iter = m->private; |
1499 | 1497 | void *p = NULL; |
1498 | + loff_t l; | |
1500 | 1499 | |
1501 | 1500 | mutex_lock(&ftrace_lock); |
1502 | 1501 | /* |
1503 | 1502 | |
1504 | 1503 | |
... | ... | @@ -1508,23 +1507,21 @@ |
1508 | 1507 | if (*pos > 0) |
1509 | 1508 | return t_hash_start(m, pos); |
1510 | 1509 | iter->flags |= FTRACE_ITER_PRINTALL; |
1511 | - (*pos)++; | |
1512 | 1510 | return iter; |
1513 | 1511 | } |
1514 | 1512 | |
1515 | 1513 | if (iter->flags & FTRACE_ITER_HASH) |
1516 | 1514 | return t_hash_start(m, pos); |
1517 | 1515 | |
1518 | - if (*pos > 0) { | |
1519 | - if (iter->idx < 0) | |
1520 | - return p; | |
1521 | - (*pos)--; | |
1522 | - iter->idx--; | |
1516 | + iter->pg = ftrace_pages_start; | |
1517 | + iter->idx = 0; | |
1518 | + for (l = 0; l <= *pos; ) { | |
1519 | + p = t_next(m, p, &l); | |
1520 | + if (!p) | |
1521 | + break; | |
1523 | 1522 | } |
1524 | 1523 | |
1525 | - p = t_next(m, p, pos); | |
1526 | - | |
1527 | - if (!p) | |
1524 | + if (!p && iter->flags & FTRACE_ITER_FILTER) | |
1528 | 1525 | return t_hash_start(m, pos); |
1529 | 1526 | |
1530 | 1527 | return p; |