• Daniel T. Lee's avatar
    samples/bpf: Fix tracex2 by using BPF_KSYSCALL macro · 2e5c4dd7
    Daniel T. Lee authored
    Currently, there is a problem with tracex2, as it doesn't print the
    histogram properly and the results are misleading. (all results report
    as 0)
    
    The problem is caused by a change in arguments of the function to which
    the kprobe connects. This tracex2 bpf program uses kprobe (attached
    to __x64_sys_write) to figure out the size of the write system call. In
    order to achieve this, the third argument 'count' must be intact.
    
    The following is a prototype of the sys_write variant. (checked with
    pfunct)
    
        ~/git/linux$ pfunct -P fs/read_write.o | grep sys_write
        ssize_t ksys_write(unsigned int fd, const char  * buf, size_t count);
        long int __x64_sys_write(const struct pt_regs  * regs);
        ... cross compile with s390x ...
        long int __s390_sys_write(struct pt_regs * regs);
    
    Since the nature of SYSCALL_WRAPPER function wraps the argument once,
    additional process of argument extraction is required to properly parse
    the argument.
    
        #define BPF_KSYSCALL(name, args...)
        ... snip ...
        struct pt_regs *regs = LINUX_HAS_SYSCALL_WRAPPER                    \
    			   ? (struct pt_regs *)PT_REGS_PARM1(ctx)       \
    			   : ctx;                                       \
    
    In order to fix this problem, the BPF_SYSCALL macro has been used. This
    reduces the hassle of parsing arguments from pt_regs. Since the macro
    uses the CORE version of argument extraction, additional portability
    comes too.
    Signed-off-by: default avatarDaniel T. Lee <danieltimlee@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20221224071527.2292-5-danieltimlee@gmail.com
    2e5c4dd7
tracex2.bpf.c 2.28 KB