root/tools/perf/util/bpf_map.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. bpf_map_def__is_per_cpu
  2. bpf_map_def__alloc_value
  3. bpf_map__fprintf

   1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
   2 
   3 #include "util/bpf_map.h"
   4 #include <bpf/bpf.h>
   5 #include <bpf/libbpf.h>
   6 #include <linux/err.h>
   7 #include <linux/kernel.h>
   8 #include <stdbool.h>
   9 #include <stdlib.h>
  10 #include <unistd.h>
  11 
  12 static bool bpf_map_def__is_per_cpu(const struct bpf_map_def *def)
  13 {
  14         return def->type == BPF_MAP_TYPE_PERCPU_HASH ||
  15                def->type == BPF_MAP_TYPE_PERCPU_ARRAY ||
  16                def->type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
  17                def->type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE;
  18 }
  19 
  20 static void *bpf_map_def__alloc_value(const struct bpf_map_def *def)
  21 {
  22         if (bpf_map_def__is_per_cpu(def))
  23                 return malloc(round_up(def->value_size, 8) * sysconf(_SC_NPROCESSORS_CONF));
  24 
  25         return malloc(def->value_size);
  26 }
  27 
  28 int bpf_map__fprintf(struct bpf_map *map, FILE *fp)
  29 {
  30         const struct bpf_map_def *def = bpf_map__def(map);
  31         void *prev_key = NULL, *key, *value;
  32         int fd = bpf_map__fd(map), err;
  33         int printed = 0;
  34 
  35         if (fd < 0)
  36                 return fd;
  37 
  38         if (IS_ERR(def))
  39                 return PTR_ERR(def);
  40 
  41         err = -ENOMEM;
  42         key = malloc(def->key_size);
  43         if (key == NULL)
  44                 goto out;
  45 
  46         value = bpf_map_def__alloc_value(def);
  47         if (value == NULL)
  48                 goto out_free_key;
  49 
  50         while ((err = bpf_map_get_next_key(fd, prev_key, key) == 0)) {
  51                 int intkey = *(int *)key;
  52 
  53                 if (!bpf_map_lookup_elem(fd, key, value)) {
  54                         bool boolval = *(bool *)value;
  55                         if (boolval)
  56                                 printed += fprintf(fp, "[%d] = %d,\n", intkey, boolval);
  57                 } else {
  58                         printed += fprintf(fp, "[%d] = ERROR,\n", intkey);
  59                 }
  60 
  61                 prev_key = key;
  62         }
  63 
  64         if (err == ENOENT)
  65                 err = printed;
  66 
  67         free(value);
  68 out_free_key:
  69         free(key);
  70 out:
  71         return err;
  72 }

/* [<][>][^][v][top][bottom][index][help] */