linux/samples/bpf/spintest_user.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <stdio.h>
   3#include <unistd.h>
   4#include <string.h>
   5#include <assert.h>
   6#include <sys/resource.h>
   7#include <bpf/libbpf.h>
   8#include <bpf/bpf.h>
   9#include "trace_helpers.h"
  10
  11int main(int ac, char **argv)
  12{
  13        char filename[256], symbol[256];
  14        struct bpf_object *obj = NULL;
  15        struct bpf_link *links[20];
  16        long key, next_key, value;
  17        struct bpf_program *prog;
  18        int map_fd, i, j = 0;
  19        const char *section;
  20        struct ksym *sym;
  21
  22        if (load_kallsyms()) {
  23                printf("failed to process /proc/kallsyms\n");
  24                return 2;
  25        }
  26
  27        snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
  28        obj = bpf_object__open_file(filename, NULL);
  29        if (libbpf_get_error(obj)) {
  30                fprintf(stderr, "ERROR: opening BPF object file failed\n");
  31                obj = NULL;
  32                goto cleanup;
  33        }
  34
  35        /* load BPF program */
  36        if (bpf_object__load(obj)) {
  37                fprintf(stderr, "ERROR: loading BPF object file failed\n");
  38                goto cleanup;
  39        }
  40
  41        map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
  42        if (map_fd < 0) {
  43                fprintf(stderr, "ERROR: finding a map in obj file failed\n");
  44                goto cleanup;
  45        }
  46
  47        bpf_object__for_each_program(prog, obj) {
  48                section = bpf_program__section_name(prog);
  49                if (sscanf(section, "kprobe/%s", symbol) != 1)
  50                        continue;
  51
  52                /* Attach prog only when symbol exists */
  53                if (ksym_get_addr(symbol)) {
  54                        links[j] = bpf_program__attach(prog);
  55                        if (libbpf_get_error(links[j])) {
  56                                fprintf(stderr, "bpf_program__attach failed\n");
  57                                links[j] = NULL;
  58                                goto cleanup;
  59                        }
  60                        j++;
  61                }
  62        }
  63
  64        for (i = 0; i < 5; i++) {
  65                key = 0;
  66                printf("kprobing funcs:");
  67                while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) {
  68                        bpf_map_lookup_elem(map_fd, &next_key, &value);
  69                        assert(next_key == value);
  70                        sym = ksym_search(value);
  71                        key = next_key;
  72                        if (!sym) {
  73                                printf("ksym not found. Is kallsyms loaded?\n");
  74                                continue;
  75                        }
  76
  77                        printf(" %s", sym->name);
  78                }
  79                if (key)
  80                        printf("\n");
  81                key = 0;
  82                while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0)
  83                        bpf_map_delete_elem(map_fd, &next_key);
  84                sleep(1);
  85        }
  86
  87cleanup:
  88        for (j--; j >= 0; j--)
  89                bpf_link__destroy(links[j]);
  90
  91        bpf_object__close(obj);
  92        return 0;
  93}
  94