samples/bpf: Change _kern suffix to .bpf with syscall tracing program
authorDaniel T. Lee <danieltimlee@gmail.com>
Sat, 24 Dec 2022 07:15:24 +0000 (16:15 +0900)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 29 Dec 2022 22:22:34 +0000 (14:22 -0800)
Currently old compile rule (CLANG-bpf) doesn't contains VMLINUX_H define
flag which is essential for the bpf program that includes "vmlinux.h".
Also old compile rule doesn't directly specify the compile target as bpf,
instead it uses bunch of extra options with clang followed by long chain
of commands. (e.g. clang | opt | llvm-dis | llc)

In Makefile, there is already new compile rule which is more simple and
neat. And it also has -D__VMLINUX_H__ option. By just changing the _kern
suffix to .bpf will inherit the benefit of the new CLANG-BPF compile
target.

Also, this commit adds dummy gnu/stub.h to the samples/bpf directory.
As commit 1c2dd16add7e ("selftests/bpf: get rid of -D__x86_64__") noted,
compiling with 'clang -target bpf' will raise an error with stubs.h
unless workaround (-D__x86_64) is used. This commit solves this problem
by adding dummy stub.h to make /usr/include/features.h to follow the
expected path as the same way selftests/bpf dealt with.

Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20221224071527.2292-4-danieltimlee@gmail.com
17 files changed:
samples/bpf/Makefile
samples/bpf/gnu/stubs.h [new file with mode: 0644]
samples/bpf/map_perf_test.bpf.c [new file with mode: 0644]
samples/bpf/map_perf_test_kern.c [deleted file]
samples/bpf/map_perf_test_user.c
samples/bpf/test_current_task_under_cgroup.bpf.c [new file with mode: 0644]
samples/bpf/test_current_task_under_cgroup_kern.c [deleted file]
samples/bpf/test_current_task_under_cgroup_user.c
samples/bpf/test_probe_write_user.bpf.c [new file with mode: 0644]
samples/bpf/test_probe_write_user_kern.c [deleted file]
samples/bpf/test_probe_write_user_user.c
samples/bpf/trace_output.bpf.c [new file with mode: 0644]
samples/bpf/trace_output_kern.c [deleted file]
samples/bpf/trace_output_user.c
samples/bpf/tracex2.bpf.c [new file with mode: 0644]
samples/bpf/tracex2_kern.c [deleted file]
samples/bpf/tracex2_user.c

index 727da3c5879b2ecc2cae2095d20b9e2e8716c847..22039a0a5b35e7bd4214fcc763e0b5248f0b7152 100644 (file)
@@ -125,21 +125,21 @@ always-y += sockex1_kern.o
 always-y += sockex2_kern.o
 always-y += sockex3_kern.o
 always-y += tracex1_kern.o
-always-y += tracex2_kern.o
+always-y += tracex2.bpf.o
 always-y += tracex3_kern.o
 always-y += tracex4_kern.o
 always-y += tracex5_kern.o
 always-y += tracex6_kern.o
 always-y += tracex7_kern.o
 always-y += sock_flags_kern.o
-always-y += test_probe_write_user_kern.o
-always-y += trace_output_kern.o
+always-y += test_probe_write_user.bpf.o
+always-y += trace_output.bpf.o
 always-y += tcbpf1_kern.o
 always-y += tc_l2_redirect_kern.o
 always-y += lathist_kern.o
 always-y += offwaketime_kern.o
 always-y += spintest_kern.o
-always-y += map_perf_test_kern.o
+always-y += map_perf_test.bpf.o
 always-y += test_overhead_tp_kern.o
 always-y += test_overhead_raw_tp_kern.o
 always-y += test_overhead_kprobe_kern.o
@@ -147,7 +147,7 @@ always-y += parse_varlen.o parse_simple.o parse_ldabs.o
 always-y += test_cgrp2_tc_kern.o
 always-y += xdp1_kern.o
 always-y += xdp2_kern.o
-always-y += test_current_task_under_cgroup_kern.o
+always-y += test_current_task_under_cgroup.bpf.o
 always-y += trace_event_kern.o
 always-y += sampleip_kern.o
 always-y += lwt_len_hist_kern.o
diff --git a/samples/bpf/gnu/stubs.h b/samples/bpf/gnu/stubs.h
new file mode 100644 (file)
index 0000000..719225b
--- /dev/null
@@ -0,0 +1 @@
+/* dummy .h to trick /usr/include/features.h to work with 'clang -target bpf' */
diff --git a/samples/bpf/map_perf_test.bpf.c b/samples/bpf/map_perf_test.bpf.c
new file mode 100644 (file)
index 0000000..0c78850
--- /dev/null
@@ -0,0 +1,301 @@
+/* Copyright (c) 2016 Facebook
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ */
+#include "vmlinux.h"
+#include <errno.h>
+#include <linux/version.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+#include <bpf/bpf_core_read.h>
+
+#define MAX_ENTRIES 1000
+#define MAX_NR_CPUS 1024
+
+struct {
+       __uint(type, BPF_MAP_TYPE_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, MAX_ENTRIES);
+} hash_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_LRU_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, 10000);
+} lru_hash_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_LRU_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, 10000);
+       __uint(map_flags, BPF_F_NO_COMMON_LRU);
+} nocommon_lru_hash_map SEC(".maps");
+
+struct inner_lru {
+       __uint(type, BPF_MAP_TYPE_LRU_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, MAX_ENTRIES);
+       __uint(map_flags, BPF_F_NUMA_NODE);
+       __uint(numa_node, 0);
+} inner_lru_hash_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
+       __uint(max_entries, MAX_NR_CPUS);
+       __uint(key_size, sizeof(u32));
+       __array(values, struct inner_lru); /* use inner_lru as inner map */
+} array_of_lru_hashs SEC(".maps") = {
+       /* statically initialize the first element */
+       .values = { &inner_lru_hash_map },
+};
+
+struct {
+       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
+       __uint(key_size, sizeof(u32));
+       __uint(value_size, sizeof(long));
+       __uint(max_entries, MAX_ENTRIES);
+} percpu_hash_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, MAX_ENTRIES);
+       __uint(map_flags, BPF_F_NO_PREALLOC);
+} hash_map_alloc SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
+       __uint(key_size, sizeof(u32));
+       __uint(value_size, sizeof(long));
+       __uint(max_entries, MAX_ENTRIES);
+       __uint(map_flags, BPF_F_NO_PREALLOC);
+} percpu_hash_map_alloc SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_LPM_TRIE);
+       __uint(key_size, 8);
+       __uint(value_size, sizeof(long));
+       __uint(max_entries, 10000);
+       __uint(map_flags, BPF_F_NO_PREALLOC);
+} lpm_trie_map_alloc SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_ARRAY);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, MAX_ENTRIES);
+} array_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_LRU_HASH);
+       __type(key, u32);
+       __type(value, long);
+       __uint(max_entries, MAX_ENTRIES);
+} lru_hash_lookup_map SEC(".maps");
+
+SEC("ksyscall/getuid")
+int stress_hmap(struct pt_regs *ctx)
+{
+       u32 key = bpf_get_current_pid_tgid();
+       long init_val = 1;
+       long *value;
+       int i;
+
+       for (i = 0; i < 10; i++) {
+               bpf_map_update_elem(&hash_map, &key, &init_val, BPF_ANY);
+               value = bpf_map_lookup_elem(&hash_map, &key);
+               if (value)
+                       bpf_map_delete_elem(&hash_map, &key);
+       }
+
+       return 0;
+}
+
+SEC("ksyscall/geteuid")
+int stress_percpu_hmap(struct pt_regs *ctx)
+{
+       u32 key = bpf_get_current_pid_tgid();
+       long init_val = 1;
+       long *value;
+       int i;
+
+       for (i = 0; i < 10; i++) {
+               bpf_map_update_elem(&percpu_hash_map, &key, &init_val, BPF_ANY);
+               value = bpf_map_lookup_elem(&percpu_hash_map, &key);
+               if (value)
+                       bpf_map_delete_elem(&percpu_hash_map, &key);
+       }
+       return 0;
+}
+
+SEC("ksyscall/getgid")
+int stress_hmap_alloc(struct pt_regs *ctx)
+{
+       u32 key = bpf_get_current_pid_tgid();
+       long init_val = 1;
+       long *value;
+       int i;
+
+       for (i = 0; i < 10; i++) {
+               bpf_map_update_elem(&hash_map_alloc, &key, &init_val, BPF_ANY);
+               value = bpf_map_lookup_elem(&hash_map_alloc, &key);
+               if (value)
+                       bpf_map_delete_elem(&hash_map_alloc, &key);
+       }
+       return 0;
+}
+
+SEC("ksyscall/getegid")
+int stress_percpu_hmap_alloc(struct pt_regs *ctx)
+{
+       u32 key = bpf_get_current_pid_tgid();
+       long init_val = 1;
+       long *value;
+       int i;
+
+       for (i = 0; i < 10; i++) {
+               bpf_map_update_elem(&percpu_hash_map_alloc, &key, &init_val, BPF_ANY);
+               value = bpf_map_lookup_elem(&percpu_hash_map_alloc, &key);
+               if (value)
+                       bpf_map_delete_elem(&percpu_hash_map_alloc, &key);
+       }
+       return 0;
+}
+
+SEC("ksyscall/connect")
+int stress_lru_hmap_alloc(struct pt_regs *ctx)
+{
+       struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1_CORE(ctx);
+       char fmt[] = "Failed at stress_lru_hmap_alloc. ret:%dn";
+       union {
+               u16 dst6[8];
+               struct {
+                       u16 magic0;
+                       u16 magic1;
+                       u16 tcase;
+                       u16 unused16;
+                       u32 unused32;
+                       u32 key;
+               };
+       } test_params;
+       struct sockaddr_in6 *in6;
+       u16 test_case;
+       int addrlen, ret;
+       long val = 1;
+       u32 key = 0;
+
+       in6 = (struct sockaddr_in6 *)PT_REGS_PARM2_CORE(real_regs);
+       addrlen = (int)PT_REGS_PARM3_CORE(real_regs);
+
+       if (addrlen != sizeof(*in6))
+               return 0;
+
+       ret = bpf_probe_read_user(test_params.dst6, sizeof(test_params.dst6),
+                                 &in6->sin6_addr);
+       if (ret)
+               goto done;
+
+       if (test_params.magic0 != 0xdead ||
+           test_params.magic1 != 0xbeef)
+               return 0;
+
+       test_case = test_params.tcase;
+       if (test_case != 3)
+               key = bpf_get_prandom_u32();
+
+       if (test_case == 0) {
+               ret = bpf_map_update_elem(&lru_hash_map, &key, &val, BPF_ANY);
+       } else if (test_case == 1) {
+               ret = bpf_map_update_elem(&nocommon_lru_hash_map, &key, &val,
+                                         BPF_ANY);
+       } else if (test_case == 2) {
+               void *nolocal_lru_map;
+               int cpu = bpf_get_smp_processor_id();
+
+               nolocal_lru_map = bpf_map_lookup_elem(&array_of_lru_hashs,
+                                                     &cpu);
+               if (!nolocal_lru_map) {
+                       ret = -ENOENT;
+                       goto done;
+               }
+
+               ret = bpf_map_update_elem(nolocal_lru_map, &key, &val,
+                                         BPF_ANY);
+       } else if (test_case == 3) {
+               u32 i;
+
+               key = test_params.key;
+
+#pragma clang loop unroll(full)
+               for (i = 0; i < 32; i++) {
+                       bpf_map_lookup_elem(&lru_hash_lookup_map, &key);
+                       key++;
+               }
+       } else {
+               ret = -EINVAL;
+       }
+
+done:
+       if (ret)
+               bpf_trace_printk(fmt, sizeof(fmt), ret);
+
+       return 0;
+}
+
+SEC("ksyscall/gettid")
+int stress_lpm_trie_map_alloc(struct pt_regs *ctx)
+{
+       union {
+               u32 b32[2];
+               u8 b8[8];
+       } key;
+       unsigned int i;
+
+       key.b32[0] = 32;
+       key.b8[4] = 192;
+       key.b8[5] = 168;
+       key.b8[6] = 0;
+       key.b8[7] = 1;
+
+#pragma clang loop unroll(full)
+       for (i = 0; i < 32; ++i)
+               bpf_map_lookup_elem(&lpm_trie_map_alloc, &key);
+
+       return 0;
+}
+
+SEC("ksyscall/getpgid")
+int stress_hash_map_lookup(struct pt_regs *ctx)
+{
+       u32 key = 1, i;
+       long *value;
+
+#pragma clang loop unroll(full)
+       for (i = 0; i < 64; ++i)
+               value = bpf_map_lookup_elem(&hash_map, &key);
+
+       return 0;
+}
+
+SEC("ksyscall/getppid")
+int stress_array_map_lookup(struct pt_regs *ctx)
+{
+       u32 key = 1, i;
+       long *value;
+
+#pragma clang loop unroll(full)
+       for (i = 0; i < 64; ++i)
+               value = bpf_map_lookup_elem(&array_map, &key);
+
+       return 0;
+}
+
+char _license[] SEC("license") = "GPL";
+u32 _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/samples/bpf/map_perf_test_kern.c b/samples/bpf/map_perf_test_kern.c
deleted file mode 100644 (file)
index 0c78850..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-/* Copyright (c) 2016 Facebook
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- */
-#include "vmlinux.h"
-#include <errno.h>
-#include <linux/version.h>
-#include <bpf/bpf_helpers.h>
-#include <bpf/bpf_tracing.h>
-#include <bpf/bpf_core_read.h>
-
-#define MAX_ENTRIES 1000
-#define MAX_NR_CPUS 1024
-
-struct {
-       __uint(type, BPF_MAP_TYPE_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, MAX_ENTRIES);
-} hash_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_LRU_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, 10000);
-} lru_hash_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_LRU_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, 10000);
-       __uint(map_flags, BPF_F_NO_COMMON_LRU);
-} nocommon_lru_hash_map SEC(".maps");
-
-struct inner_lru {
-       __uint(type, BPF_MAP_TYPE_LRU_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, MAX_ENTRIES);
-       __uint(map_flags, BPF_F_NUMA_NODE);
-       __uint(numa_node, 0);
-} inner_lru_hash_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
-       __uint(max_entries, MAX_NR_CPUS);
-       __uint(key_size, sizeof(u32));
-       __array(values, struct inner_lru); /* use inner_lru as inner map */
-} array_of_lru_hashs SEC(".maps") = {
-       /* statically initialize the first element */
-       .values = { &inner_lru_hash_map },
-};
-
-struct {
-       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
-       __uint(key_size, sizeof(u32));
-       __uint(value_size, sizeof(long));
-       __uint(max_entries, MAX_ENTRIES);
-} percpu_hash_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, MAX_ENTRIES);
-       __uint(map_flags, BPF_F_NO_PREALLOC);
-} hash_map_alloc SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
-       __uint(key_size, sizeof(u32));
-       __uint(value_size, sizeof(long));
-       __uint(max_entries, MAX_ENTRIES);
-       __uint(map_flags, BPF_F_NO_PREALLOC);
-} percpu_hash_map_alloc SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_LPM_TRIE);
-       __uint(key_size, 8);
-       __uint(value_size, sizeof(long));
-       __uint(max_entries, 10000);
-       __uint(map_flags, BPF_F_NO_PREALLOC);
-} lpm_trie_map_alloc SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_ARRAY);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, MAX_ENTRIES);
-} array_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_LRU_HASH);
-       __type(key, u32);
-       __type(value, long);
-       __uint(max_entries, MAX_ENTRIES);
-} lru_hash_lookup_map SEC(".maps");
-
-SEC("ksyscall/getuid")
-int stress_hmap(struct pt_regs *ctx)
-{
-       u32 key = bpf_get_current_pid_tgid();
-       long init_val = 1;
-       long *value;
-       int i;
-
-       for (i = 0; i < 10; i++) {
-               bpf_map_update_elem(&hash_map, &key, &init_val, BPF_ANY);
-               value = bpf_map_lookup_elem(&hash_map, &key);
-               if (value)
-                       bpf_map_delete_elem(&hash_map, &key);
-       }
-
-       return 0;
-}
-
-SEC("ksyscall/geteuid")
-int stress_percpu_hmap(struct pt_regs *ctx)
-{
-       u32 key = bpf_get_current_pid_tgid();
-       long init_val = 1;
-       long *value;
-       int i;
-
-       for (i = 0; i < 10; i++) {
-               bpf_map_update_elem(&percpu_hash_map, &key, &init_val, BPF_ANY);
-               value = bpf_map_lookup_elem(&percpu_hash_map, &key);
-               if (value)
-                       bpf_map_delete_elem(&percpu_hash_map, &key);
-       }
-       return 0;
-}
-
-SEC("ksyscall/getgid")
-int stress_hmap_alloc(struct pt_regs *ctx)
-{
-       u32 key = bpf_get_current_pid_tgid();
-       long init_val = 1;
-       long *value;
-       int i;
-
-       for (i = 0; i < 10; i++) {
-               bpf_map_update_elem(&hash_map_alloc, &key, &init_val, BPF_ANY);
-               value = bpf_map_lookup_elem(&hash_map_alloc, &key);
-               if (value)
-                       bpf_map_delete_elem(&hash_map_alloc, &key);
-       }
-       return 0;
-}
-
-SEC("ksyscall/getegid")
-int stress_percpu_hmap_alloc(struct pt_regs *ctx)
-{
-       u32 key = bpf_get_current_pid_tgid();
-       long init_val = 1;
-       long *value;
-       int i;
-
-       for (i = 0; i < 10; i++) {
-               bpf_map_update_elem(&percpu_hash_map_alloc, &key, &init_val, BPF_ANY);
-               value = bpf_map_lookup_elem(&percpu_hash_map_alloc, &key);
-               if (value)
-                       bpf_map_delete_elem(&percpu_hash_map_alloc, &key);
-       }
-       return 0;
-}
-
-SEC("ksyscall/connect")
-int stress_lru_hmap_alloc(struct pt_regs *ctx)
-{
-       struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1_CORE(ctx);
-       char fmt[] = "Failed at stress_lru_hmap_alloc. ret:%dn";
-       union {
-               u16 dst6[8];
-               struct {
-                       u16 magic0;
-                       u16 magic1;
-                       u16 tcase;
-                       u16 unused16;
-                       u32 unused32;
-                       u32 key;
-               };
-       } test_params;
-       struct sockaddr_in6 *in6;
-       u16 test_case;
-       int addrlen, ret;
-       long val = 1;
-       u32 key = 0;
-
-       in6 = (struct sockaddr_in6 *)PT_REGS_PARM2_CORE(real_regs);
-       addrlen = (int)PT_REGS_PARM3_CORE(real_regs);
-
-       if (addrlen != sizeof(*in6))
-               return 0;
-
-       ret = bpf_probe_read_user(test_params.dst6, sizeof(test_params.dst6),
-                                 &in6->sin6_addr);
-       if (ret)
-               goto done;
-
-       if (test_params.magic0 != 0xdead ||
-           test_params.magic1 != 0xbeef)
-               return 0;
-
-       test_case = test_params.tcase;
-       if (test_case != 3)
-               key = bpf_get_prandom_u32();
-
-       if (test_case == 0) {
-               ret = bpf_map_update_elem(&lru_hash_map, &key, &val, BPF_ANY);
-       } else if (test_case == 1) {
-               ret = bpf_map_update_elem(&nocommon_lru_hash_map, &key, &val,
-                                         BPF_ANY);
-       } else if (test_case == 2) {
-               void *nolocal_lru_map;
-               int cpu = bpf_get_smp_processor_id();
-
-               nolocal_lru_map = bpf_map_lookup_elem(&array_of_lru_hashs,
-                                                     &cpu);
-               if (!nolocal_lru_map) {
-                       ret = -ENOENT;
-                       goto done;
-               }
-
-               ret = bpf_map_update_elem(nolocal_lru_map, &key, &val,
-                                         BPF_ANY);
-       } else if (test_case == 3) {
-               u32 i;
-
-               key = test_params.key;
-
-#pragma clang loop unroll(full)
-               for (i = 0; i < 32; i++) {
-                       bpf_map_lookup_elem(&lru_hash_lookup_map, &key);
-                       key++;
-               }
-       } else {
-               ret = -EINVAL;
-       }
-
-done:
-       if (ret)
-               bpf_trace_printk(fmt, sizeof(fmt), ret);
-
-       return 0;
-}
-
-SEC("ksyscall/gettid")
-int stress_lpm_trie_map_alloc(struct pt_regs *ctx)
-{
-       union {
-               u32 b32[2];
-               u8 b8[8];
-       } key;
-       unsigned int i;
-
-       key.b32[0] = 32;
-       key.b8[4] = 192;
-       key.b8[5] = 168;
-       key.b8[6] = 0;
-       key.b8[7] = 1;
-
-#pragma clang loop unroll(full)
-       for (i = 0; i < 32; ++i)
-               bpf_map_lookup_elem(&lpm_trie_map_alloc, &key);
-
-       return 0;
-}
-
-SEC("ksyscall/getpgid")
-int stress_hash_map_lookup(struct pt_regs *ctx)
-{
-       u32 key = 1, i;
-       long *value;
-
-#pragma clang loop unroll(full)
-       for (i = 0; i < 64; ++i)
-               value = bpf_map_lookup_elem(&hash_map, &key);
-
-       return 0;
-}
-
-SEC("ksyscall/getppid")
-int stress_array_map_lookup(struct pt_regs *ctx)
-{
-       u32 key = 1, i;
-       long *value;
-
-#pragma clang loop unroll(full)
-       for (i = 0; i < 64; ++i)
-               value = bpf_map_lookup_elem(&array_map, &key);
-
-       return 0;
-}
-
-char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;
index 1bb53f4b29e11efc39458713c4871ac4c0ccecd4..d2fbcf963cdf6dab910b4c99057474fc4d5d5fbc 100644 (file)
@@ -443,7 +443,7 @@ int main(int argc, char **argv)
        if (argc > 4)
                max_cnt = atoi(argv[4]);
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj)) {
                fprintf(stderr, "ERROR: opening BPF object file failed\n");
diff --git a/samples/bpf/test_current_task_under_cgroup.bpf.c b/samples/bpf/test_current_task_under_cgroup.bpf.c
new file mode 100644 (file)
index 0000000..0b059ce
--- /dev/null
@@ -0,0 +1,41 @@
+/* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ */
+
+#include "vmlinux.h"
+#include <linux/version.h>
+#include <bpf/bpf_helpers.h>
+
+struct {
+       __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
+       __uint(key_size, sizeof(u32));
+       __uint(value_size, sizeof(u32));
+       __uint(max_entries, 1);
+} cgroup_map SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_ARRAY);
+       __type(key, u32);
+       __type(value, u64);
+       __uint(max_entries, 1);
+} perf_map SEC(".maps");
+
+/* Writes the last PID that called sync to a map at index 0 */
+SEC("ksyscall/sync")
+int bpf_prog1(struct pt_regs *ctx)
+{
+       u64 pid = bpf_get_current_pid_tgid();
+       int idx = 0;
+
+       if (!bpf_current_task_under_cgroup(&cgroup_map, 0))
+               return 0;
+
+       bpf_map_update_elem(&perf_map, &idx, &pid, BPF_ANY);
+       return 0;
+}
+
+char _license[] SEC("license") = "GPL";
+u32 _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/samples/bpf/test_current_task_under_cgroup_kern.c b/samples/bpf/test_current_task_under_cgroup_kern.c
deleted file mode 100644 (file)
index 0b059ce..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- */
-
-#include "vmlinux.h"
-#include <linux/version.h>
-#include <bpf/bpf_helpers.h>
-
-struct {
-       __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
-       __uint(key_size, sizeof(u32));
-       __uint(value_size, sizeof(u32));
-       __uint(max_entries, 1);
-} cgroup_map SEC(".maps");
-
-struct {
-       __uint(type, BPF_MAP_TYPE_ARRAY);
-       __type(key, u32);
-       __type(value, u64);
-       __uint(max_entries, 1);
-} perf_map SEC(".maps");
-
-/* Writes the last PID that called sync to a map at index 0 */
-SEC("ksyscall/sync")
-int bpf_prog1(struct pt_regs *ctx)
-{
-       u64 pid = bpf_get_current_pid_tgid();
-       int idx = 0;
-
-       if (!bpf_current_task_under_cgroup(&cgroup_map, 0))
-               return 0;
-
-       bpf_map_update_elem(&perf_map, &idx, &pid, BPF_ANY);
-       return 0;
-}
-
-char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;
index 6fb25906835e99068e0a2daac480aaa1d2cbf5df..9726ed2a8a8bf519d4cc3a95df661269c8589ba9 100644 (file)
@@ -21,7 +21,7 @@ int main(int argc, char **argv)
        char filename[256];
        int map_fd[2];
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj)) {
                fprintf(stderr, "ERROR: opening BPF object file failed\n");
diff --git a/samples/bpf/test_probe_write_user.bpf.c b/samples/bpf/test_probe_write_user.bpf.c
new file mode 100644 (file)
index 0000000..a0f10c5
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ */
+#include "vmlinux.h"
+#include <string.h>
+#include <linux/version.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+#include <bpf/bpf_core_read.h>
+
+struct {
+       __uint(type, BPF_MAP_TYPE_HASH);
+       __type(key, struct sockaddr_in);
+       __type(value, struct sockaddr_in);
+       __uint(max_entries, 256);
+} dnat_map SEC(".maps");
+
+/* kprobe is NOT a stable ABI
+ * kernel functions can be removed, renamed or completely change semantics.
+ * Number of arguments and their positions can change, etc.
+ * In such case this bpf+kprobe example will no longer be meaningful
+ *
+ * This example sits on a syscall, and the syscall ABI is relatively stable
+ * of course, across platforms, and over time, the ABI may change.
+ */
+SEC("ksyscall/connect")
+int bpf_prog1(struct pt_regs *ctx)
+{
+       struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1_CORE(ctx);
+       void *sockaddr_arg = (void *)PT_REGS_PARM2_CORE(real_regs);
+       int sockaddr_len = (int)PT_REGS_PARM3_CORE(real_regs);
+       struct sockaddr_in new_addr, orig_addr = {};
+       struct sockaddr_in *mapped_addr;
+
+       if (sockaddr_len > sizeof(orig_addr))
+               return 0;
+
+       if (bpf_probe_read_user(&orig_addr, sizeof(orig_addr), sockaddr_arg) != 0)
+               return 0;
+
+       mapped_addr = bpf_map_lookup_elem(&dnat_map, &orig_addr);
+       if (mapped_addr != NULL) {
+               memcpy(&new_addr, mapped_addr, sizeof(new_addr));
+               bpf_probe_write_user(sockaddr_arg, &new_addr,
+                                    sizeof(new_addr));
+       }
+       return 0;
+}
+
+char _license[] SEC("license") = "GPL";
+u32 _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/samples/bpf/test_probe_write_user_kern.c b/samples/bpf/test_probe_write_user_kern.c
deleted file mode 100644 (file)
index a0f10c5..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- */
-#include "vmlinux.h"
-#include <string.h>
-#include <linux/version.h>
-#include <bpf/bpf_helpers.h>
-#include <bpf/bpf_tracing.h>
-#include <bpf/bpf_core_read.h>
-
-struct {
-       __uint(type, BPF_MAP_TYPE_HASH);
-       __type(key, struct sockaddr_in);
-       __type(value, struct sockaddr_in);
-       __uint(max_entries, 256);
-} dnat_map SEC(".maps");
-
-/* kprobe is NOT a stable ABI
- * kernel functions can be removed, renamed or completely change semantics.
- * Number of arguments and their positions can change, etc.
- * In such case this bpf+kprobe example will no longer be meaningful
- *
- * This example sits on a syscall, and the syscall ABI is relatively stable
- * of course, across platforms, and over time, the ABI may change.
- */
-SEC("ksyscall/connect")
-int bpf_prog1(struct pt_regs *ctx)
-{
-       struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1_CORE(ctx);
-       void *sockaddr_arg = (void *)PT_REGS_PARM2_CORE(real_regs);
-       int sockaddr_len = (int)PT_REGS_PARM3_CORE(real_regs);
-       struct sockaddr_in new_addr, orig_addr = {};
-       struct sockaddr_in *mapped_addr;
-
-       if (sockaddr_len > sizeof(orig_addr))
-               return 0;
-
-       if (bpf_probe_read_user(&orig_addr, sizeof(orig_addr), sockaddr_arg) != 0)
-               return 0;
-
-       mapped_addr = bpf_map_lookup_elem(&dnat_map, &orig_addr);
-       if (mapped_addr != NULL) {
-               memcpy(&new_addr, mapped_addr, sizeof(new_addr));
-               bpf_probe_write_user(sockaddr_arg, &new_addr,
-                                    sizeof(new_addr));
-       }
-       return 0;
-}
-
-char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;
index 00ccfb834e4567f709f56a5958bf03986e5893cd..2a539aec411630161e819a2d512dd7a42021db9e 100644 (file)
@@ -24,7 +24,7 @@ int main(int ac, char **argv)
        mapped_addr_in = (struct sockaddr_in *)&mapped_addr;
        tmp_addr_in = (struct sockaddr_in *)&tmp_addr;
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj)) {
                fprintf(stderr, "ERROR: opening BPF object file failed\n");
diff --git a/samples/bpf/trace_output.bpf.c b/samples/bpf/trace_output.bpf.c
new file mode 100644 (file)
index 0000000..565a73b
--- /dev/null
@@ -0,0 +1,29 @@
+#include "vmlinux.h"
+#include <linux/version.h>
+#include <bpf/bpf_helpers.h>
+
+struct {
+       __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
+       __uint(key_size, sizeof(int));
+       __uint(value_size, sizeof(u32));
+       __uint(max_entries, 2);
+} my_map SEC(".maps");
+
+SEC("ksyscall/write")
+int bpf_prog1(struct pt_regs *ctx)
+{
+       struct S {
+               u64 pid;
+               u64 cookie;
+       } data;
+
+       data.pid = bpf_get_current_pid_tgid();
+       data.cookie = 0x12345678;
+
+       bpf_perf_event_output(ctx, &my_map, 0, &data, sizeof(data));
+
+       return 0;
+}
+
+char _license[] SEC("license") = "GPL";
+u32 _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/samples/bpf/trace_output_kern.c b/samples/bpf/trace_output_kern.c
deleted file mode 100644 (file)
index 565a73b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "vmlinux.h"
-#include <linux/version.h>
-#include <bpf/bpf_helpers.h>
-
-struct {
-       __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
-       __uint(key_size, sizeof(int));
-       __uint(value_size, sizeof(u32));
-       __uint(max_entries, 2);
-} my_map SEC(".maps");
-
-SEC("ksyscall/write")
-int bpf_prog1(struct pt_regs *ctx)
-{
-       struct S {
-               u64 pid;
-               u64 cookie;
-       } data;
-
-       data.pid = bpf_get_current_pid_tgid();
-       data.cookie = 0x12345678;
-
-       bpf_perf_event_output(ctx, &my_map, 0, &data, sizeof(data));
-
-       return 0;
-}
-
-char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;
index 371732f9cf8ee0c79748c8d71de311aab35a86d4..d316fd2c8e2456140f4ccfc79d8cdb8ae643c853 100644 (file)
@@ -51,7 +51,7 @@ int main(int argc, char **argv)
        char filename[256];
        FILE *f;
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj)) {
                fprintf(stderr, "ERROR: opening BPF object file failed\n");
diff --git a/samples/bpf/tracex2.bpf.c b/samples/bpf/tracex2.bpf.c
new file mode 100644 (file)
index 0000000..a712eef
--- /dev/null
@@ -0,0 +1,99 @@
+/* Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ */
+#include "vmlinux.h"
+#include <linux/version.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+struct {
+       __uint(type, BPF_MAP_TYPE_HASH);
+       __type(key, long);
+       __type(value, long);
+       __uint(max_entries, 1024);
+} my_map SEC(".maps");
+
+/* kprobe is NOT a stable ABI. If kernel internals change this bpf+kprobe
+ * example will no longer be meaningful
+ */
+SEC("kprobe/kfree_skb_reason")
+int bpf_prog2(struct pt_regs *ctx)
+{
+       long loc = 0;
+       long init_val = 1;
+       long *value;
+
+       /* read ip of kfree_skb_reason caller.
+        * non-portable version of __builtin_return_address(0)
+        */
+       BPF_KPROBE_READ_RET_IP(loc, ctx);
+
+       value = bpf_map_lookup_elem(&my_map, &loc);
+       if (value)
+               *value += 1;
+       else
+               bpf_map_update_elem(&my_map, &loc, &init_val, BPF_ANY);
+       return 0;
+}
+
+static unsigned int log2(unsigned int v)
+{
+       unsigned int r;
+       unsigned int shift;
+
+       r = (v > 0xFFFF) << 4; v >>= r;
+       shift = (v > 0xFF) << 3; v >>= shift; r |= shift;
+       shift = (v > 0xF) << 2; v >>= shift; r |= shift;
+       shift = (v > 0x3) << 1; v >>= shift; r |= shift;
+       r |= (v >> 1);
+       return r;
+}
+
+static unsigned int log2l(unsigned long v)
+{
+       unsigned int hi = v >> 32;
+       if (hi)
+               return log2(hi) + 32;
+       else
+               return log2(v);
+}
+
+struct hist_key {
+       char comm[16];
+       u64 pid_tgid;
+       u64 uid_gid;
+       u64 index;
+};
+
+struct {
+       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
+       __uint(key_size, sizeof(struct hist_key));
+       __uint(value_size, sizeof(long));
+       __uint(max_entries, 1024);
+} my_hist_map SEC(".maps");
+
+SEC("ksyscall/write")
+int bpf_prog3(struct pt_regs *ctx)
+{
+       long write_size = PT_REGS_PARM3(ctx);
+       long init_val = 1;
+       long *value;
+       struct hist_key key;
+
+       key.index = log2l(write_size);
+       key.pid_tgid = bpf_get_current_pid_tgid();
+       key.uid_gid = bpf_get_current_uid_gid();
+       bpf_get_current_comm(&key.comm, sizeof(key.comm));
+
+       value = bpf_map_lookup_elem(&my_hist_map, &key);
+       if (value)
+               __sync_fetch_and_add(value, 1);
+       else
+               bpf_map_update_elem(&my_hist_map, &key, &init_val, BPF_ANY);
+       return 0;
+}
+char _license[] SEC("license") = "GPL";
+u32 _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/samples/bpf/tracex2_kern.c b/samples/bpf/tracex2_kern.c
deleted file mode 100644 (file)
index a712eef..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- */
-#include "vmlinux.h"
-#include <linux/version.h>
-#include <bpf/bpf_helpers.h>
-#include <bpf/bpf_tracing.h>
-
-struct {
-       __uint(type, BPF_MAP_TYPE_HASH);
-       __type(key, long);
-       __type(value, long);
-       __uint(max_entries, 1024);
-} my_map SEC(".maps");
-
-/* kprobe is NOT a stable ABI. If kernel internals change this bpf+kprobe
- * example will no longer be meaningful
- */
-SEC("kprobe/kfree_skb_reason")
-int bpf_prog2(struct pt_regs *ctx)
-{
-       long loc = 0;
-       long init_val = 1;
-       long *value;
-
-       /* read ip of kfree_skb_reason caller.
-        * non-portable version of __builtin_return_address(0)
-        */
-       BPF_KPROBE_READ_RET_IP(loc, ctx);
-
-       value = bpf_map_lookup_elem(&my_map, &loc);
-       if (value)
-               *value += 1;
-       else
-               bpf_map_update_elem(&my_map, &loc, &init_val, BPF_ANY);
-       return 0;
-}
-
-static unsigned int log2(unsigned int v)
-{
-       unsigned int r;
-       unsigned int shift;
-
-       r = (v > 0xFFFF) << 4; v >>= r;
-       shift = (v > 0xFF) << 3; v >>= shift; r |= shift;
-       shift = (v > 0xF) << 2; v >>= shift; r |= shift;
-       shift = (v > 0x3) << 1; v >>= shift; r |= shift;
-       r |= (v >> 1);
-       return r;
-}
-
-static unsigned int log2l(unsigned long v)
-{
-       unsigned int hi = v >> 32;
-       if (hi)
-               return log2(hi) + 32;
-       else
-               return log2(v);
-}
-
-struct hist_key {
-       char comm[16];
-       u64 pid_tgid;
-       u64 uid_gid;
-       u64 index;
-};
-
-struct {
-       __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
-       __uint(key_size, sizeof(struct hist_key));
-       __uint(value_size, sizeof(long));
-       __uint(max_entries, 1024);
-} my_hist_map SEC(".maps");
-
-SEC("ksyscall/write")
-int bpf_prog3(struct pt_regs *ctx)
-{
-       long write_size = PT_REGS_PARM3(ctx);
-       long init_val = 1;
-       long *value;
-       struct hist_key key;
-
-       key.index = log2l(write_size);
-       key.pid_tgid = bpf_get_current_pid_tgid();
-       key.uid_gid = bpf_get_current_uid_gid();
-       bpf_get_current_comm(&key.comm, sizeof(key.comm));
-
-       value = bpf_map_lookup_elem(&my_hist_map, &key);
-       if (value)
-               __sync_fetch_and_add(value, 1);
-       else
-               bpf_map_update_elem(&my_hist_map, &key, &init_val, BPF_ANY);
-       return 0;
-}
-char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;
index 089e408abd7ad522f1497a10bae2cc13e96c11a4..2131f1648cf16dd5c49e0496fb9dcb9d62ed132e 100644 (file)
@@ -123,7 +123,7 @@ int main(int ac, char **argv)
        int i, j = 0;
        FILE *f;
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj)) {
                fprintf(stderr, "ERROR: opening BPF object file failed\n");