From 4186f5ec4d8bd448fe57d061783ccd53c3148829 Mon Sep 17 00:00:00 2001 From: Teng Qin Date: Fri, 15 Dec 2017 00:22:18 -0800 Subject: [PATCH] Add new bpf_perf_{event|prog}_read_value helpers implementation --- docs/kernel-versions.md | 2 ++ src/cc/export/helpers.h | 5 +++++ src/cc/frontends/clang/b_frontend_action.cc | 3 +++ 3 files changed, 10 insertions(+) diff --git a/docs/kernel-versions.md b/docs/kernel-versions.md index be5ce10ed042..4985adcb48e4 100644 --- a/docs/kernel-versions.md +++ b/docs/kernel-versions.md @@ -159,3 +159,5 @@ Helper | Kernel version | Commit `BPF_FUNC_tail_call()` | 4.2 | [04fd61ab36ec](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=04fd61ab36ec065e194ab5e74ae34a5240d992bb) `BPF_FUNC_trace_printk()` | 4.1 | [9c959c863f82](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9c959c863f8217a2ff3d7c296e8223654d240569) `BPF_FUNC_xdp_adjust_head()` | 4.10 | [17bedab27231](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=17bedab2723145d17b14084430743549e6943d03) +`BPF_FUNC_perf_event_read_value()` | 4.15 | [908432ca84fc](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=908432ca84fc229e906ba164219e9ad0fe56f755) +`BPF_FUNC_perf_prog_read_value()` | 4.15 | [4bebdc7a85aa](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4bebdc7a85aa400c0222b5329861e4ad9252f1e5) diff --git a/src/cc/export/helpers.h b/src/cc/export/helpers.h index 2b64ee8d1a9c..2d4df881a23e 100644 --- a/src/cc/export/helpers.h +++ b/src/cc/export/helpers.h @@ -96,6 +96,7 @@ struct _name##_table_t { \ u32 leaf; \ /* counter = map.perf_read(index) */ \ u64 (*perf_read) (int); \ + int (*perf_counter_value) (int, void *, u32); \ u32 max_entries; \ }; \ __attribute__((section("maps/perf_array"))) \ @@ -245,6 +246,10 @@ static int (*bpf_perf_event_output)(void *ctx, void *map, u64 index, void *data, (void *) BPF_FUNC_perf_event_output; static int (*bpf_skb_load_bytes)(void *ctx, int offset, void *to, u32 len) = (void *) BPF_FUNC_skb_load_bytes; +static int (*bpf_perf_event_read_value)(void *map, u64 flags, void *buf, u32 buf_size) = + (void *) BPF_FUNC_perf_event_read_value; +static int (*bpf_perf_prog_read_value)(void *ctx, void *buf, u32 buf_size) = + (void *) BPF_FUNC_perf_prog_read_value; /* bcc_get_stackid will return a negative value in the case of an error * diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc index 9f1643a54fcf..f6d25832015b 100644 --- a/src/cc/frontends/clang/b_frontend_action.cc +++ b/src/cc/frontends/clang/b_frontend_action.cc @@ -433,6 +433,9 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) { } else if (memb_name == "perf_read") { prefix = "bpf_perf_event_read"; suffix = ")"; + } else if (memb_name == "perf_counter_value") { + prefix = "bpf_perf_event_read_value"; + suffix = ")"; } else { error(Call->getLocStart(), "invalid bpf_table operation %0") << memb_name; return false;