Commit 694ce0a544fba37a60025a6803ee6265be8a2a22

Authored by Li Zefan
Committed by Ingo Molnar
1 parent 85951842a1

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;