Blame view

samples/bpf/lathist_user.c 1.99 KB
0fb1170ee   Daniel Wagner   bpf: BPF based la...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  /* Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
   * Copyright (c) 2015 BMW Car IT GmbH
   *
   * 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 <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <signal.h>
  #include <linux/bpf.h>
  #include "libbpf.h"
  #include "bpf_load.h"
  
  #define MAX_ENTRIES	20
  #define MAX_CPU		4
  #define MAX_STARS	40
  
  struct cpu_hist {
  	long data[MAX_ENTRIES];
  	long max;
  };
  
  static struct cpu_hist cpu_hist[MAX_CPU];
  
  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';
  }
  
  static void print_hist(void)
  {
  	char starstr[MAX_STARS];
  	struct cpu_hist *hist;
  	int i, j;
  
  	/* clear screen */
  	printf("\033[2J");
  
  	for (j = 0; j < MAX_CPU; j++) {
  		hist = &cpu_hist[j];
  
  		/* ignore CPUs without data (maybe offline?) */
  		if (hist->max == 0)
  			continue;
  
  		printf("CPU %d
  ", j);
  		printf("      latency        : count     distribution
  ");
  		for (i = 1; i <= MAX_ENTRIES; i++) {
  			stars(starstr, hist->data[i - 1], hist->max, MAX_STARS);
  			printf("%8ld -> %-8ld : %-8ld |%-*s|
  ",
  				(1l << i) >> 1, (1l << i) - 1,
  				hist->data[i - 1], MAX_STARS, starstr);
  		}
  	}
  }
  
  static void get_data(int fd)
  {
  	long key, value;
  	int c, i;
  
  	for (i = 0; i < MAX_CPU; i++)
  		cpu_hist[i].max = 0;
  
  	for (c = 0; c < MAX_CPU; c++) {
  		for (i = 0; i < MAX_ENTRIES; i++) {
  			key = c * MAX_ENTRIES + i;
d40fc181e   Joe Stringer   samples/bpf: Make...
79
  			bpf_map_lookup_elem(fd, &key, &value);
0fb1170ee   Daniel Wagner   bpf: BPF based la...
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
  
  			cpu_hist[c].data[i] = value;
  			if (value > cpu_hist[c].max)
  				cpu_hist[c].max = value;
  		}
  	}
  }
  
  int main(int argc, char **argv)
  {
  	char filename[256];
  
  	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
  
  	if (load_bpf_file(filename)) {
  		printf("%s", bpf_log_buf);
  		return 1;
  	}
  
  	while (1) {
  		get_data(map_fd[1]);
  		print_hist();
  		sleep(5);
  	}
  
  	return 0;
  }