• Steven Rostedt (VMware)'s avatar
    tracing: Process constants for (un)likely() profiler · d45ae1f7
    Steven Rostedt (VMware) authored
    When running the likely/unlikely profiler, one of the results did not look
    accurate. It noted that the unlikely() in link_path_walk() was 100%
    incorrect. When I added a trace_printk() to see what was happening there, it
    became 80% correct! Looking deeper into what whas happening, I found that
    gcc split that if statement into two paths. One where the if statement
    became a constant, the other path a variable. The other path had the if
    statement always hit (making the unlikely there, always false), but since
    the #define unlikely() has:
    
      #define unlikely() (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
    
    Where constants are ignored by the branch profiler, the "constant" path
    made by the compiler was ignored, even though it was hit 80% of the time.
    
    By just passing the constant value to the __branch_check__() function and
    tracing it out of line (as always correct, as likely/unlikely isn't a factor
    for constants), then we get back the accurate readings of branches that were
    optimized by gcc causing part of the execution to become constant.
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    d45ae1f7
trace_branch.c 9.03 KB