linux/samples/bpf/lathist_user.c
<<
>>
Prefs
   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}
 101