]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc/ftrace: Fix ftrace graph time measurement
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 17 May 2017 15:47:00 +0000 (11:47 -0400)
committerShannon Nelson <shannon.nelson@oracle.com>
Wed, 31 May 2017 23:43:52 +0000 (16:43 -0700)
The ftrace function_graph time measurements of a given function is not
accurate according to those recorded by ftrace using the function
filters.  This change pulls the x86_64 fix from 'commit 722b3c746953
("ftrace/graph: Trace function entry before updating index")' into the
sparc specific prepare_ftrace_return which stops ftrace from
counting interrupted tasks in the time measurement.

Example measurements for select_task_rq_fair running "hackbench 100
process 1000":

              |  tracing/trace_stat/function0  |  function_graph
 Before patch |  2.802 us                      |  4.255 us
 After patch  |  2.749 us                      |  3.094 us

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(Cherry picked from commit 48078d2dac0a26f84f5f3ec704f24f7c832cce14)

Note: Upstream fix needed an extra parameter of NULL for
prepare_ftrace_return.

Orabug: 25995351

Signed-off-by: Allen Pais <allen.pais@oracle.com>
Signed-off-by: Shannon Nelson <shannon.nelson@oracle.com>
arch/sparc/kernel/ftrace.c

index 0a2d2ddff543fd325709fc46eaf48d438d06b88b..b727b9488b355d7ed1d1e23000866e0139e75079 100644 (file)
@@ -130,17 +130,16 @@ unsigned long prepare_ftrace_return(unsigned long parent,
        if (unlikely(atomic_read(&current->tracing_graph_pause)))
                return parent + 8UL;
 
-       if (ftrace_push_return_trace(parent, self_addr, &trace.depth,
-                                    frame_pointer) == -EBUSY)
-               return parent + 8UL;
-
        trace.func = self_addr;
+       trace.depth = current->curr_ret_stack + 1;
 
        /* Only trace if the calling function expects to */
-       if (!ftrace_graph_entry(&trace)) {
-               current->curr_ret_stack--;
+       if (!ftrace_graph_entry(&trace))
+               return parent + 8UL;
+
+       if (ftrace_push_return_trace(parent, self_addr, &trace.depth,
+                                    frame_pointer) == -EBUSY)
                return parent + 8UL;
-       }
 
        return return_hooker;
 }