• Arnaldo Carvalho de Melo's avatar
    perf trace: Do not hardcode the size of the tracepoint common_ fields · b9b6a2ea
    Arnaldo Carvalho de Melo authored
    We shouldn't hardcode the size of the tracepoint common_ fields, use the
    offset of the 'id'/'__syscallnr' field in the sys_enter event instead.
    
    This caused the augmented syscalls code to fail on a particular build of a
    PREEMPT_RT_FULL kernel where these extra 'common_migrate_disable' and
    'common_padding' fields were before the syscall id one:
    
      # cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format
      name: sys_enter
      ID: 22
      format:
    	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
    	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
    	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
    	field:int common_pid;	offset:4;	size:4;	signed:1;
    	field:unsigned short common_migrate_disable;	offset:8;	size:2;	signed:0;
    	field:unsigned short common_padding;	offset:10;	size:2;	signed:0;
    
    	field:long id;	offset:16;	size:8;	signed:1;
    	field:unsigned long args[6];	offset:24;	size:48;	signed:0;
    
      print fmt: "NR %ld (%lx, %lx, %lx, %lx, %lx, %lx)", REC->id, REC->args[0], REC->args[1], REC->args[2], REC->args[3], REC->args[4], REC->args[5]
      #
    
    All those 'common_' prefixed fields are zeroed when they hit a BPF tracepoint
    hook, we better just discard those, i.e. somehow pass an offset to the
    BPF program from the start of the ctx and make adjustments in the 'perf trace'
    handlers to adjust the offset of the syscall arg offsets obtained from tracefs.
    
    Till then, fix it the quick way and add this to the augmented_raw_syscalls.c to
    bet it to work in such kernels:
    
      diff --git a/tools/perf/examples/bpf/augmented_raw_syscalls.c b/tools/perf/examples/bpf/augmented_raw_syscalls.c
      index 53c233370fae..1f746f931e13 100644
      --- a/tools/perf/examples/bpf/augmented_raw_syscalls.c
      +++ b/tools/perf/examples/bpf/augmented_raw_syscalls.c
      @@ -38,12 +38,14 @@ struct bpf_map SEC("maps") syscalls = {
    
       struct syscall_enter_args {
              unsigned long long common_tp_fields;
      +       long               rt_common_tp_fields;
              long               syscall_nr;
              unsigned long      args[6];
       };
    
       struct syscall_exit_args {
              unsigned long long common_tp_fields;
      +       long               rt_common_tp_fields;
              long               syscall_nr;
              long               ret;
       };
    
    Just to check that this was the case. Fix it properly later, for now remove the
    hardcoding of the offset in the 'perf trace' side and document the situation
    with this patch.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: https://lkml.kernel.org/n/tip-2pqavrktqkliu5b9nzouio21@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b9b6a2ea
Name
Last commit
Last update
..
accounting Loading commit data...
arch Loading commit data...
bpf Loading commit data...
build Loading commit data...
cgroup Loading commit data...
crypto Loading commit data...
firewire Loading commit data...
gpio Loading commit data...
hv Loading commit data...
iio Loading commit data...
include Loading commit data...
kvm/kvm_stat Loading commit data...
laptop Loading commit data...
leds Loading commit data...
lib Loading commit data...
memory-model Loading commit data...
nfsd Loading commit data...
objtool Loading commit data...
pci Loading commit data...
pcmcia Loading commit data...
perf Loading commit data...
power Loading commit data...
scripts Loading commit data...
spi Loading commit data...
testing Loading commit data...
thermal/tmon Loading commit data...
time Loading commit data...
usb Loading commit data...
virtio Loading commit data...
vm Loading commit data...
wmi Loading commit data...
Makefile Loading commit data...