• Steven Rostedt (Red Hat)'s avatar
    rcu: Have the RCU tracepoints use the tracepoint_string infrastructure · f7f7bac9
    Steven Rostedt (Red Hat) authored
    Currently, RCU tracepoints save only a pointer to strings in the
    ring buffer. When displayed via the /sys/kernel/debug/tracing/trace file
    they are referenced like the printf "%s" that looks at the address
    in the ring buffer and prints out the string it points too. This requires
    that the strings are constant and persistent in the kernel.
    
    The problem with this is for tools like trace-cmd and perf that read the
    binary data from the buffers but have no access to the kernel memory to
    find out what string is represented by the address in the buffer.
    
    By using the tracepoint_string infrastructure, the RCU tracepoint strings
    can be exported such that userspace tools can map the addresses to
    the strings.
    
     # cat /sys/kernel/debug/tracing/printk_formats
    0xffffffff81a4a0e8 : "rcu_preempt"
    0xffffffff81a4a0f4 : "rcu_bh"
    0xffffffff81a4a100 : "rcu_sched"
    0xffffffff818437a0 : "cpuqs"
    0xffffffff818437a6 : "rcu_sched"
    0xffffffff818437a0 : "cpuqs"
    0xffffffff818437b0 : "rcu_bh"
    0xffffffff818437b7 : "Start context switch"
    0xffffffff818437cc : "End context switch"
    0xffffffff818437a0 : "cpuqs"
    [...]
    
    Now userspaces tools can display:
    
     rcu_utilization:      Start context switch
     rcu_dyntick:          Start 1 0
     rcu_utilization:      End context switch
     rcu_batch_start:      rcu_preempt CBs=0/5 bl=10
     rcu_dyntick:          End 0 140000000000000
     rcu_invoke_callback:  rcu_preempt rhp=0xffff880071c0d600 func=proc_i_callback
     rcu_invoke_callback:  rcu_preempt rhp=0xffff880077b5b230 func=__d_free
     rcu_dyntick:          Start 140000000000000 0
     rcu_invoke_callback:  rcu_preempt rhp=0xffff880077563980 func=file_free_rcu
     rcu_batch_end:        rcu_preempt CBs-invoked=3 idle=>c<>c<>c<>c<
     rcu_utilization:      End RCU core
     rcu_grace_period:     rcu_preempt 9741 start
     rcu_dyntick:          Start 1 0
     rcu_dyntick:          End 0 140000000000000
     rcu_dyntick:          Start 140000000000000 0
    
    Instead of:
    
     rcu_utilization:      ffffffff81843110
     rcu_future_grace_period: ffffffff81842f1d 9939 9939 9940 0 0 3 ffffffff81842f32
     rcu_batch_start:      ffffffff81842f1d CBs=0/4 bl=10
     rcu_future_grace_period: ffffffff81842f1d 9939 9939 9940 0 0 3 ffffffff81842f3c
     rcu_grace_period:     ffffffff81842f1d 9939 ffffffff81842f80
     rcu_invoke_callback:  ffffffff81842f1d rhp=0xffff88007888aac0 func=file_free_rcu
     rcu_grace_period:     ffffffff81842f1d 9939 ffffffff81842f95
     rcu_invoke_callback:  ffffffff81842f1d rhp=0xffff88006aeb4600 func=proc_i_callback
     rcu_future_grace_period: ffffffff81842f1d 9939 9939 9940 0 0 3 ffffffff81842f32
     rcu_future_grace_period: ffffffff81842f1d 9939 9939 9940 0 0 3 ffffffff81842f3c
     rcu_invoke_callback:  ffffffff81842f1d rhp=0xffff880071cb9fc0 func=__d_free
     rcu_grace_period:     ffffffff81842f1d 9939 ffffffff81842f80
     rcu_invoke_callback:  ffffffff81842f1d rhp=0xffff88007888ae80 func=file_free_rcu
     rcu_batch_end:        ffffffff81842f1d CBs-invoked=4 idle=>c<>c<>c<>c<
     rcu_utilization:      ffffffff8184311f
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    f7f7bac9
rcutree.c 102 KB