• Steven Rostedt (Red Hat)'s avatar
    tracing: Add __tracepoint_string() to export string pointers · 102c9323
    Steven Rostedt (Red Hat) authored
    There are several tracepoints (mostly in RCU), that reference a string
    pointer and uses the print format of "%s" to display the string that
    exists in the kernel, instead of copying the actual string to the
    ring buffer (saves time and ring buffer space).
    
    But this has an issue with userspace tools that read the binary buffers
    that has the address of the string but has no access to what the string
    itself is. The end result is just output that looks like:
    
     rcu_dyntick:          ffffffff818adeaa 1 0
     rcu_dyntick:          ffffffff818adeb5 0 140000000000000
     rcu_dyntick:          ffffffff818adeb5 0 140000000000000
     rcu_utilization:      ffffffff8184333b
     rcu_utilization:      ffffffff8184333b
    
    The above is pretty useless when read by the userspace tools. Ideally
    we would want something that looks like this:
    
     rcu_dyntick:          Start 1 0
     rcu_dyntick:          End 0 140000000000000
     rcu_dyntick:          Start 140000000000000 0
     rcu_callback:         rcu_preempt rhp=0xffff880037aff710 func=put_cred_rcu 0/4
     rcu_callback:         rcu_preempt rhp=0xffff880078961980 func=file_free_rcu 0/5
     rcu_dyntick:          End 0 1
    
    The trace_printk() which also only stores the address of the string
    format instead of recording the string into the buffer itself, exports
    the mapping of kernel addresses to format strings via the printk_format
    file in the debugfs tracing directory.
    
    The tracepoint strings can use this same method and output the format
    to the same file and the userspace tools will be able to decipher
    the address without any modification.
    
    The tracepoint strings need its own section to save the strings because
    the trace_printk section will cause the trace_printk() buffers to be
    allocated if anything exists within the section. trace_printk() is only
    used for debugging and should never exist in the kernel, we can not use
    the trace_printk sections.
    
    Add a new tracepoint_str section that will also be examined by the output
    of the printk_format file.
    
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    102c9323
vmlinux.lds.h 23.4 KB