• Oleg Nesterov's avatar
    uprobes/perf: Teach trace_uprobe/perf code to use UPROBE_HANDLER_REMOVE · f42d24a1
    Oleg Nesterov authored
    Change uprobe_trace_func() and uprobe_perf_func() to return "int". Change
    uprobe_dispatcher() to return "trace_ret | perf_ret" although this is not
    needed, currently TP_FLAG_TRACE/TP_FLAG_PROFILE are mutually exclusive.
    
    The only functional change is that uprobe_perf_func() checks the filtering
    too and returns UPROBE_HANDLER_REMOVE if nobody wants to trace current.
    
    Testing:
    
    	# perf probe -x /lib/libc.so.6 syscall
    
    	# perf record -e probe_libc:syscall -i perl -e 'fork; syscall -1 for 1..10; wait'
    
    	# perf report --show-total-period
    		100.00%            10     perl  libc-2.8.so    [.] syscall
    
    Before this patch:
    
    	# cat /sys/kernel/debug/tracing/uprobe_profile
    		/lib/libc.so.6 syscall				20
    
    A child process doesn't have a counter, but still it hits this breakoint
    "copied" by dup_mmap().
    
    After the patch:
    
    	# cat /sys/kernel/debug/tracing/uprobe_profile
    		/lib/libc.so.6 syscall				11
    
    The child process hits this int3 only once and does unapply_uprobe().
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    f42d24a1
trace_uprobe.c 19.8 KB