On 05/23/2019 11:47 PM, Yonghong Song wrote: > This patch tries to solve the following specific use case. > > Currently, bpf program can already collect stack traces > through kernel function get_perf_callchain() > when certain events happens (e.g., cache miss counter or > cpu clock counter overflows). But such stack traces are > not enough for jitted programs, e.g., hhvm (jited php). > To get real stack trace, jit engine internal data structures > need to be traversed in order to get the real user functions. > > bpf program itself may not be the best place to traverse > the jit engine as the traversing logic could be complex and > it is not a stable interface either. > > Instead, hhvm implements a signal handler, > e.g. for SIGALARM, and a set of program locations which > it can dump stack traces. When it receives a signal, it will > dump the stack in next such program location. > > This patch implements bpf_send_signal() helper to send > a signal to hhvm in real time, resulting in intended stack traces. > > Patch #1 implemented the bpf_send_helper() in the kernel. > Patch #2 synced uapi header bpf.h to tools directory. > Patch #3 added a self test which covers tracepoint > and perf_event bpf programs. > > Changelogs: > v4 => v5: > . pass the "current" task struct to irq_work as well > since the current task struct may change between > nmi and subsequent irq_work_interrupt. > Discovered by Daniel. > v3 => v4: > . fix one typo and declare "const char *id_path = ..." > to avoid directly use the long string in the func body > in Patch #3. > v2 => v3: > . change the standalone test to be part of prog_tests. > RFC v1 => v2: > . previous version allows to send signal to an arbitrary > pid. This version just sends the signal to current > task to avoid unstable pid and potential races between > sending signals and task state changes for the pid. > > Yonghong Song (3): > bpf: implement bpf_send_signal() helper > tools/bpf: sync bpf uapi header bpf.h to tools directory > tools/bpf: add selftest in test_progs for bpf_send_signal() helper > > include/uapi/linux/bpf.h | 17 +- > kernel/trace/bpf_trace.c | 72 +++++++ > tools/include/uapi/linux/bpf.h | 17 +- > tools/testing/selftests/bpf/bpf_helpers.h | 1 + > .../selftests/bpf/prog_tests/send_signal.c | 198 ++++++++++++++++++ > .../bpf/progs/test_send_signal_kern.c | 51 +++++ > 6 files changed, 354 insertions(+), 2 deletions(-) > create mode 100644 tools/testing/selftests/bpf/prog_tests/send_signal.c > create mode 100644 tools/testing/selftests/bpf/progs/test_send_signal_kern.c > Applied, thanks. One more remark in patch 1, will reply there.