Blame view
samples/bpf/tracex2_user.c
3.02 KB
d822a1926 samples/bpf: Add ... |
1 2 3 4 5 |
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <linux/bpf.h> |
ffeedafbf bpf: introduce cu... |
6 |
#include <string.h> |
d822a1926 samples/bpf: Add ... |
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include "libbpf.h" #include "bpf_load.h" #define MAX_INDEX 64 #define MAX_STARS 38 static void stars(char *str, long val, long max, int width) { int i; for (i = 0; i < (width * val / max) - 1 && i < width - 1; i++) str[i] = '*'; if (val > max) str[i - 1] = '+'; str[i] = '\0'; } |
ffeedafbf bpf: introduce cu... |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
struct task { char comm[16]; __u64 pid_tgid; __u64 uid_gid; }; struct hist_key { struct task t; __u32 index; }; #define SIZE sizeof(struct task) static void print_hist_for_pid(int fd, void *task) |
d822a1926 samples/bpf: Add ... |
37 |
{ |
ffeedafbf bpf: introduce cu... |
38 |
struct hist_key key = {}, next_key; |
3059303f5 samples/bpf: upda... |
39 40 |
unsigned int nr_cpus = sysconf(_SC_NPROCESSORS_CONF); long values[nr_cpus]; |
ffeedafbf bpf: introduce cu... |
41 |
char starstr[MAX_STARS]; |
d822a1926 samples/bpf: Add ... |
42 43 |
long value; long data[MAX_INDEX] = {}; |
d822a1926 samples/bpf: Add ... |
44 45 |
int max_ind = -1; long max_value = 0; |
ffeedafbf bpf: introduce cu... |
46 |
int i, ind; |
d822a1926 samples/bpf: Add ... |
47 |
|
ffeedafbf bpf: introduce cu... |
48 49 50 51 52 |
while (bpf_get_next_key(fd, &key, &next_key) == 0) { if (memcmp(&next_key, task, SIZE)) { key = next_key; continue; } |
3059303f5 samples/bpf: upda... |
53 54 55 56 |
bpf_lookup_elem(fd, &next_key, values); value = 0; for (i = 0; i < nr_cpus; i++) value += values[i]; |
ffeedafbf bpf: introduce cu... |
57 58 59 60 |
ind = next_key.index; data[ind] = value; if (value && ind > max_ind) max_ind = ind; |
d822a1926 samples/bpf: Add ... |
61 62 |
if (value > max_value) max_value = value; |
ffeedafbf bpf: introduce cu... |
63 |
key = next_key; |
d822a1926 samples/bpf: Add ... |
64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
} printf(" syscall write() stats "); printf(" byte_size : count distribution "); for (i = 1; i <= max_ind + 1; i++) { stars(starstr, data[i - 1], max_value, MAX_STARS); printf("%8ld -> %-8ld : %-8ld |%-*s| ", (1l << i) >> 1, (1l << i) - 1, data[i - 1], MAX_STARS, starstr); } } |
ffeedafbf bpf: introduce cu... |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
static void print_hist(int fd) { struct hist_key key = {}, next_key; static struct task tasks[1024]; int task_cnt = 0; int i; while (bpf_get_next_key(fd, &key, &next_key) == 0) { int found = 0; for (i = 0; i < task_cnt; i++) if (memcmp(&tasks[i], &next_key, SIZE) == 0) found = 1; if (!found) memcpy(&tasks[task_cnt++], &next_key, SIZE); key = next_key; } for (i = 0; i < task_cnt; i++) { printf(" pid %d cmd %s uid %d ", (__u32) tasks[i].pid_tgid, tasks[i].comm, (__u32) tasks[i].uid_gid); print_hist_for_pid(fd, &tasks[i]); } } |
d822a1926 samples/bpf: Add ... |
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
static void int_exit(int sig) { print_hist(map_fd[1]); exit(0); } int main(int ac, char **argv) { char filename[256]; long key, next_key, value; FILE *f; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); signal(SIGINT, int_exit); /* start 'ping' in the background to have some kfree_skb events */ f = popen("ping -c5 localhost", "r"); (void) f; /* start 'dd' in the background to have plenty of 'write' syscalls */ f = popen("dd if=/dev/zero of=/dev/null count=5000000", "r"); (void) f; if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 0; i < 5; i++) { key = 0; while (bpf_get_next_key(map_fd[0], &key, &next_key) == 0) { bpf_lookup_elem(map_fd[0], &next_key, &value); printf("location 0x%lx count %ld ", next_key, value); key = next_key; } if (key) printf(" "); sleep(1); } print_hist(map_fd[1]); return 0; } |