linux/tools/perf/util/bpf_map.c
<<
>>
Prefs
   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
  12static 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
  20static 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
  28int 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);
  68out_free_key:
  69        free(key);
  70out:
  71        return err;
  72}
  73