Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.19-rc8 67 lines 1.5 kB view raw
1#include <linux/ptrace.h> 2#include <linux/version.h> 3#include <uapi/linux/bpf.h> 4#include "bpf_helpers.h" 5 6struct bpf_map_def SEC("maps") counters = { 7 .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, 8 .key_size = sizeof(int), 9 .value_size = sizeof(u32), 10 .max_entries = 64, 11}; 12struct bpf_map_def SEC("maps") values = { 13 .type = BPF_MAP_TYPE_HASH, 14 .key_size = sizeof(int), 15 .value_size = sizeof(u64), 16 .max_entries = 64, 17}; 18struct bpf_map_def SEC("maps") values2 = { 19 .type = BPF_MAP_TYPE_HASH, 20 .key_size = sizeof(int), 21 .value_size = sizeof(struct bpf_perf_event_value), 22 .max_entries = 64, 23}; 24 25SEC("kprobe/htab_map_get_next_key") 26int bpf_prog1(struct pt_regs *ctx) 27{ 28 u32 key = bpf_get_smp_processor_id(); 29 u64 count, *val; 30 s64 error; 31 32 count = bpf_perf_event_read(&counters, key); 33 error = (s64)count; 34 if (error <= -2 && error >= -22) 35 return 0; 36 37 val = bpf_map_lookup_elem(&values, &key); 38 if (val) 39 *val = count; 40 else 41 bpf_map_update_elem(&values, &key, &count, BPF_NOEXIST); 42 43 return 0; 44} 45 46SEC("kprobe/htab_map_lookup_elem") 47int bpf_prog2(struct pt_regs *ctx) 48{ 49 u32 key = bpf_get_smp_processor_id(); 50 struct bpf_perf_event_value *val, buf; 51 int error; 52 53 error = bpf_perf_event_read_value(&counters, key, &buf, sizeof(buf)); 54 if (error) 55 return 0; 56 57 val = bpf_map_lookup_elem(&values2, &key); 58 if (val) 59 *val = buf; 60 else 61 bpf_map_update_elem(&values2, &key, &buf, BPF_NOEXIST); 62 63 return 0; 64} 65 66char _license[] SEC("license") = "GPL"; 67u32 _version SEC("version") = LINUX_VERSION_CODE;