23a49e6f7e
[ Upstream commit b8e3a87a627b575896e448021e5c2f8a3bc19931 ] Currently get_perf_callchain only supports user stack walking for the current task. Passing the correct *crosstask* param will return 0 frames if the task passed to __bpf_get_stack isn't the current one instead of a single incorrect frame/address. This change passes the correct *crosstask* param but also does a preemptive check in __bpf_get_stack if the task is current and returns -EOPNOTSUPP if it is not. This issue was found using bpf_get_task_stack inside a BPF iterator ("iter/task"), which iterates over all tasks. bpf_get_task_stack works fine for fetching kernel stacks but because get_perf_callchain relies on the caller to know if the requested *task* is the current one (via *crosstask*) it was failing in a confusing way. It might be possible to get user stacks for all tasks utilizing something like access_process_vm but that requires the bpf program calling bpf_get_task_stack to be sleepable and would therefore be a breaking change. Fixes: fa28dcb82a38 ("bpf: Introduce helper bpf_get_task_stack()") Signed-off-by: Jordan Rome <jordalgo@meta.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20231108112334.3433136-1-jordalgo@meta.com Signed-off-by: Sasha Levin <sashal@kernel.org> |
||
---|---|---|
.. | ||
tc_act | ||
bpf.h | ||
bpf_common.h | ||
bpf_perf_event.h | ||
btf.h | ||
const.h | ||
erspan.h | ||
ethtool.h | ||
fadvise.h | ||
fcntl.h | ||
filter.h | ||
fs.h | ||
fscrypt.h | ||
hw_breakpoint.h | ||
if_link.h | ||
if_tun.h | ||
if_xdp.h | ||
in.h | ||
kcmp.h | ||
kvm.h | ||
lirc.h | ||
mman.h | ||
mount.h | ||
netlink.h | ||
openat2.h | ||
perf_event.h | ||
pkt_cls.h | ||
pkt_sched.h | ||
prctl.h | ||
sched.h | ||
seg6.h | ||
seg6_local.h | ||
stat.h | ||
tls.h | ||
types.h | ||
usbdevice_fs.h | ||
vhost.h |