summaryrefslogtreecommitdiff
path: root/tools/perf/tests/bpf-script-example.c
diff options
context:
space:
mode:
authorMike Marshall <hubcap@omnibond.com>2015-11-16 18:58:57 +0300
committerMike Marshall <hubcap@omnibond.com>2015-11-16 18:58:57 +0300
commita52079dad4718fa924ae81a939f8a665366f562b (patch)
treea9d6004f9bf1beff49cbfe0d5bf6edbf621b065d /tools/perf/tests/bpf-script-example.c
parent24c8d0804be00da90af9efa8eb404bd7a3284ba9 (diff)
parent8005c49d9aea74d382f474ce11afbbc7d7130bec (diff)
downloadlinux-a52079dad4718fa924ae81a939f8a665366f562b.tar.xz
Orangefs: Merge tag 'v4.4-rc1' into for-next
Linux 4.4-rc1
Diffstat (limited to 'tools/perf/tests/bpf-script-example.c')
-rw-r--r--tools/perf/tests/bpf-script-example.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/tools/perf/tests/bpf-script-example.c b/tools/perf/tests/bpf-script-example.c
new file mode 100644
index 000000000000..0ec9c2c03164
--- /dev/null
+++ b/tools/perf/tests/bpf-script-example.c
@@ -0,0 +1,48 @@
+/*
+ * bpf-script-example.c
+ * Test basic LLVM building
+ */
+#ifndef LINUX_VERSION_CODE
+# error Need LINUX_VERSION_CODE
+# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
+#endif
+#define BPF_ANY 0
+#define BPF_MAP_TYPE_ARRAY 2
+#define BPF_FUNC_map_lookup_elem 1
+#define BPF_FUNC_map_update_elem 2
+
+static void *(*bpf_map_lookup_elem)(void *map, void *key) =
+ (void *) BPF_FUNC_map_lookup_elem;
+static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
+ (void *) BPF_FUNC_map_update_elem;
+
+struct bpf_map_def {
+ unsigned int type;
+ unsigned int key_size;
+ unsigned int value_size;
+ unsigned int max_entries;
+};
+
+#define SEC(NAME) __attribute__((section(NAME), used))
+struct bpf_map_def SEC("maps") flip_table = {
+ .type = BPF_MAP_TYPE_ARRAY,
+ .key_size = sizeof(int),
+ .value_size = sizeof(int),
+ .max_entries = 1,
+};
+
+SEC("func=sys_epoll_pwait")
+int bpf_func__sys_epoll_pwait(void *ctx)
+{
+ int ind =0;
+ int *flag = bpf_map_lookup_elem(&flip_table, &ind);
+ int new_flag;
+ if (!flag)
+ return 0;
+ /* flip flag and store back */
+ new_flag = !*flag;
+ bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
+ return new_flag;
+}
+char _license[] SEC("license") = "GPL";
+int _version SEC("version") = LINUX_VERSION_CODE;