using skip>0 with bpf_get_stack()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have a question about bpf_get_stack().  I'm interested in the case
        skip > 0
        user_build_id == 0
        num_elem < sysctl_perf_event_max_stack

The function sets
        init_nr = sysctl_perf_event_max_stack - num_elem;
which means that get_perf_callchain() will return "num_elem" stack frames.  Then, since we skip "skip" frames, we'll fill the user buffer with only "num_elem - skip" frames, the remaining frames being filled zero.

For example, let's say the call stack is
        leaf <- caller <- foo1 <- foo2 <- foo3 <- foo4 <- foo5 <- foo6

Let's say I pass bpf_get_stack() a buffer with num_elem==4 and ask skip==2.  I would expect to skip 2 frames then get 4 frames, getting back:
        foo1  foo2  foo3  foo4

Instead, I get
        foo1  foo2  0  0
skipping 2 frames but also leaving frames zeroed out.

I think the init_nr computation should be:

-       if (sysctl_perf_event_max_stack < num_elem)
+       if (sysctl_perf_event_max_stack <= num_elem + skip)
                init_nr = 0;
        else
-               init_nr = sysctl_perf_event_max_stack - num_elem;
+               init_nr = sysctl_perf_event_max_stack - num_elem - skip;

Incidentally, the return value of the function is presumably the size of the returned data.  Would it make sense to say so in include/uapi/linux/bpf.h?




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux