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 v5.2-rc5 100 lines 1.9 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com 3 * Copyright (c) 2015 BMW Car IT GmbH 4 */ 5#include <stdio.h> 6#include <unistd.h> 7#include <stdlib.h> 8#include <signal.h> 9#include <linux/bpf.h> 10#include <bpf/bpf.h> 11#include "bpf_load.h" 12 13#define MAX_ENTRIES 20 14#define MAX_CPU 4 15#define MAX_STARS 40 16 17struct cpu_hist { 18 long data[MAX_ENTRIES]; 19 long max; 20}; 21 22static struct cpu_hist cpu_hist[MAX_CPU]; 23 24static void stars(char *str, long val, long max, int width) 25{ 26 int i; 27 28 for (i = 0; i < (width * val / max) - 1 && i < width - 1; i++) 29 str[i] = '*'; 30 if (val > max) 31 str[i - 1] = '+'; 32 str[i] = '\0'; 33} 34 35static void print_hist(void) 36{ 37 char starstr[MAX_STARS]; 38 struct cpu_hist *hist; 39 int i, j; 40 41 /* clear screen */ 42 printf("\033[2J"); 43 44 for (j = 0; j < MAX_CPU; j++) { 45 hist = &cpu_hist[j]; 46 47 /* ignore CPUs without data (maybe offline?) */ 48 if (hist->max == 0) 49 continue; 50 51 printf("CPU %d\n", j); 52 printf(" latency : count distribution\n"); 53 for (i = 1; i <= MAX_ENTRIES; i++) { 54 stars(starstr, hist->data[i - 1], hist->max, MAX_STARS); 55 printf("%8ld -> %-8ld : %-8ld |%-*s|\n", 56 (1l << i) >> 1, (1l << i) - 1, 57 hist->data[i - 1], MAX_STARS, starstr); 58 } 59 } 60} 61 62static void get_data(int fd) 63{ 64 long key, value; 65 int c, i; 66 67 for (i = 0; i < MAX_CPU; i++) 68 cpu_hist[i].max = 0; 69 70 for (c = 0; c < MAX_CPU; c++) { 71 for (i = 0; i < MAX_ENTRIES; i++) { 72 key = c * MAX_ENTRIES + i; 73 bpf_map_lookup_elem(fd, &key, &value); 74 75 cpu_hist[c].data[i] = value; 76 if (value > cpu_hist[c].max) 77 cpu_hist[c].max = value; 78 } 79 } 80} 81 82int main(int argc, char **argv) 83{ 84 char filename[256]; 85 86 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 87 88 if (load_bpf_file(filename)) { 89 printf("%s", bpf_log_buf); 90 return 1; 91 } 92 93 while (1) { 94 get_data(map_fd[1]); 95 print_hist(); 96 sleep(5); 97 } 98 99 return 0; 100}