-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Alexei Starovoitov says: ==================== v7->v8: - moved 'u32 num_args' from 'struct tracepoint' into 'struct bpf_raw_event_map' that increases memory overhead, but can be optimized/compressed later. Now it's zero changes in tracepoint.[ch] v6->v7: - adopted Steven's bpf_raw_tp_map section approach to find tracepoint and corresponding bpf probe function instead of kallsyms approach. dropped kernel_tracepoint_find_by_name() patch v5->v6: - avoid changing semantics of for_each_kernel_tracepoint() function, instead introduce kernel_tracepoint_find_by_name() helper v4->v5: - adopted Daniel's fancy REPEAT macro in bpf_trace.c in patch 6 v3->v4: - adopted Linus's CAST_TO_U64 macro to cast any integer, pointer, or small struct to u64. That nicely reduced the size of patch 1 v2->v3: - with Linus's suggestion introduced generic COUNT_ARGS and CONCATENATE macros (or rather moved them from apparmor) that cleaned up patch 6 - added patch 4 to refactor trace_iwlwifi_dev_ucode_error() from 17 args to 4 Now any tracepoint with >12 args will have build error v1->v2: - simplified api by combing bpf_raw_tp_open(name) + bpf_attach(prog_fd) into bpf_raw_tp_open(name, prog_fd) as suggested by Daniel. That simplifies bpf_detach as well which is now simple close() of fd. - fixed memory leak in error path which was spotted by Daniel. - fixed bpf_get_stackid(), bpf_perf_event_output() called from raw tracepoints - added more tests - fixed allyesconfig build caught by buildbot v1: This patch set is a different way to address the pressing need to access task_struct pointers in sched tracepoints from bpf programs. The first approach simply added these pointers to sched tracepoints: https://lkml.org/lkml/2017/12/14/753 which Peter nacked. Few options were discussed and eventually the discussion converged on doing bpf specific tracepoint_probe_register() probe functions. Details here: https://lkml.org/lkml/2017/12/20/929 Patch 1 is kernel wide cleanup of pass-struct-by-value into pass-struct-by-reference into tracepoints. Patches 2 and 3 are minor cleanups to address allyesconfig build Patch 4 refactor trace_iwlwifi_dev_ucode_error from 17 to 4 args Patch 5 introduces COUNT_ARGS macro Patch 6 introduces BPF_RAW_TRACEPOINT api. the auto-cleanup and multiple concurrent users are must have features of tracing api. For bpf raw tracepoints it looks like: // load bpf prog with BPF_PROG_TYPE_RAW_TRACEPOINT type prog_fd = bpf_prog_load(...); // receive anon_inode fd for given bpf_raw_tracepoint // and attach bpf program to it raw_tp_fd = bpf_raw_tracepoint_open("xdp_exception", prog_fd); Ctrl-C of tracing daemon or cmdline tool will automatically detach bpf program, unload it and unregister tracepoint probe. More details in patch 6. Patch 7 - trivial support in libbpf Patches 8, 9 - user space tests samples/bpf/test_overhead performance on 1 cpu: tracepoint base kprobe+bpf tracepoint+bpf raw_tracepoint+bpf task_rename 1.1M 769K 947K 1.0M urandom_read 789K 697K 750K 755K ==================== Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
- Loading branch information
Showing
30 changed files
with
607 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
|
||
#undef TRACE_SYSTEM_VAR | ||
|
||
#ifdef CONFIG_BPF_EVENTS | ||
|
||
#undef __entry | ||
#define __entry entry | ||
|
||
#undef __get_dynamic_array | ||
#define __get_dynamic_array(field) \ | ||
((void *)__entry + (__entry->__data_loc_##field & 0xffff)) | ||
|
||
#undef __get_dynamic_array_len | ||
#define __get_dynamic_array_len(field) \ | ||
((__entry->__data_loc_##field >> 16) & 0xffff) | ||
|
||
#undef __get_str | ||
#define __get_str(field) ((char *)__get_dynamic_array(field)) | ||
|
||
#undef __get_bitmask | ||
#define __get_bitmask(field) (char *)__get_dynamic_array(field) | ||
|
||
#undef __perf_count | ||
#define __perf_count(c) (c) | ||
|
||
#undef __perf_task | ||
#define __perf_task(t) (t) | ||
|
||
/* cast any integer, pointer, or small struct to u64 */ | ||
#define UINTTYPE(size) \ | ||
__typeof__(__builtin_choose_expr(size == 1, (u8)1, \ | ||
__builtin_choose_expr(size == 2, (u16)2, \ | ||
__builtin_choose_expr(size == 4, (u32)3, \ | ||
__builtin_choose_expr(size == 8, (u64)4, \ | ||
(void)5))))) | ||
#define __CAST_TO_U64(x) ({ \ | ||
typeof(x) __src = (x); \ | ||
UINTTYPE(sizeof(x)) __dst; \ | ||
memcpy(&__dst, &__src, sizeof(__dst)); \ | ||
(u64)__dst; }) | ||
|
||
#define __CAST1(a,...) __CAST_TO_U64(a) | ||
#define __CAST2(a,...) __CAST_TO_U64(a), __CAST1(__VA_ARGS__) | ||
#define __CAST3(a,...) __CAST_TO_U64(a), __CAST2(__VA_ARGS__) | ||
#define __CAST4(a,...) __CAST_TO_U64(a), __CAST3(__VA_ARGS__) | ||
#define __CAST5(a,...) __CAST_TO_U64(a), __CAST4(__VA_ARGS__) | ||
#define __CAST6(a,...) __CAST_TO_U64(a), __CAST5(__VA_ARGS__) | ||
#define __CAST7(a,...) __CAST_TO_U64(a), __CAST6(__VA_ARGS__) | ||
#define __CAST8(a,...) __CAST_TO_U64(a), __CAST7(__VA_ARGS__) | ||
#define __CAST9(a,...) __CAST_TO_U64(a), __CAST8(__VA_ARGS__) | ||
#define __CAST10(a,...) __CAST_TO_U64(a), __CAST9(__VA_ARGS__) | ||
#define __CAST11(a,...) __CAST_TO_U64(a), __CAST10(__VA_ARGS__) | ||
#define __CAST12(a,...) __CAST_TO_U64(a), __CAST11(__VA_ARGS__) | ||
/* tracepoints with more than 12 arguments will hit build error */ | ||
#define CAST_TO_U64(...) CONCATENATE(__CAST, COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__) | ||
|
||
#undef DECLARE_EVENT_CLASS | ||
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | ||
static notrace void \ | ||
__bpf_trace_##call(void *__data, proto) \ | ||
{ \ | ||
struct bpf_prog *prog = __data; \ | ||
CONCATENATE(bpf_trace_run, COUNT_ARGS(args))(prog, CAST_TO_U64(args)); \ | ||
} | ||
|
||
/* | ||
* This part is compiled out, it is only here as a build time check | ||
* to make sure that if the tracepoint handling changes, the | ||
* bpf probe will fail to compile unless it too is updated. | ||
*/ | ||
#undef DEFINE_EVENT | ||
#define DEFINE_EVENT(template, call, proto, args) \ | ||
static inline void bpf_test_probe_##call(void) \ | ||
{ \ | ||
check_trace_callback_type_##call(__bpf_trace_##template); \ | ||
} \ | ||
static struct bpf_raw_event_map __used \ | ||
__attribute__((section("__bpf_raw_tp_map"))) \ | ||
__bpf_trace_tp_map_##call = { \ | ||
.tp = &__tracepoint_##call, \ | ||
.bpf_func = (void *)__bpf_trace_##template, \ | ||
.num_args = COUNT_ARGS(args), \ | ||
}; | ||
|
||
|
||
#undef DEFINE_EVENT_PRINT | ||
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
|
||
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||
#endif /* CONFIG_BPF_EVENTS */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.