Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef __PERF_BPF_COUNTER_H
  3#define __PERF_BPF_COUNTER_H 1
  4
  5#include <linux/list.h>
  6#include <sys/resource.h>
  7#include <bpf/bpf.h>
  8#include <bpf/btf.h>
  9#include <bpf/libbpf.h>
 10
 11struct evsel;
 12struct target;
 13struct bpf_counter;
 14
 15typedef int (*bpf_counter_evsel_op)(struct evsel *evsel);
 16typedef int (*bpf_counter_evsel_target_op)(struct evsel *evsel,
 17					   struct target *target);
 18typedef int (*bpf_counter_evsel_install_pe_op)(struct evsel *evsel,
 19					       int cpu,
 20					       int fd);
 21
 22struct bpf_counter_ops {
 23	bpf_counter_evsel_target_op load;
 24	bpf_counter_evsel_op enable;
 25	bpf_counter_evsel_op disable;
 26	bpf_counter_evsel_op read;
 27	bpf_counter_evsel_op destroy;
 28	bpf_counter_evsel_install_pe_op install_pe;
 29};
 30
 31struct bpf_counter {
 32	void *skel;
 33	struct list_head list;
 34};
 35
 36#ifdef HAVE_BPF_SKEL
 37
 38int bpf_counter__load(struct evsel *evsel, struct target *target);
 39int bpf_counter__enable(struct evsel *evsel);
 40int bpf_counter__disable(struct evsel *evsel);
 41int bpf_counter__read(struct evsel *evsel);
 42void bpf_counter__destroy(struct evsel *evsel);
 43int bpf_counter__install_pe(struct evsel *evsel, int cpu, int fd);
 44
 45#else /* HAVE_BPF_SKEL */
 46
 47#include <linux/err.h>
 48
 49static inline int bpf_counter__load(struct evsel *evsel __maybe_unused,
 50				    struct target *target __maybe_unused)
 51{
 52	return 0;
 53}
 54
 55static inline int bpf_counter__enable(struct evsel *evsel __maybe_unused)
 56{
 57	return 0;
 58}
 59
 60static inline int bpf_counter__disable(struct evsel *evsel __maybe_unused)
 61{
 62	return 0;
 63}
 64
 65static inline int bpf_counter__read(struct evsel *evsel __maybe_unused)
 66{
 67	return -EAGAIN;
 68}
 69
 70static inline void bpf_counter__destroy(struct evsel *evsel __maybe_unused)
 71{
 72}
 73
 74static inline int bpf_counter__install_pe(struct evsel *evsel __maybe_unused,
 75					  int cpu __maybe_unused,
 76					  int fd __maybe_unused)
 77{
 78	return 0;
 79}
 80
 81#endif /* HAVE_BPF_SKEL */
 82
 83static inline void set_max_rlimit(void)
 84{
 85	struct rlimit rinf = { RLIM_INFINITY, RLIM_INFINITY };
 86
 87	setrlimit(RLIMIT_MEMLOCK, &rinf);
 88}
 89
 90static inline __u32 bpf_link_get_id(int fd)
 91{
 92	struct bpf_link_info link_info = { .id = 0, };
 93	__u32 link_info_len = sizeof(link_info);
 94
 95	bpf_obj_get_info_by_fd(fd, &link_info, &link_info_len);
 96	return link_info.id;
 97}
 98
 99static inline __u32 bpf_link_get_prog_id(int fd)
100{
101	struct bpf_link_info link_info = { .id = 0, };
102	__u32 link_info_len = sizeof(link_info);
103
104	bpf_obj_get_info_by_fd(fd, &link_info, &link_info_len);
105	return link_info.prog_id;
106}
107
108static inline __u32 bpf_map_get_id(int fd)
109{
110	struct bpf_map_info map_info = { .id = 0, };
111	__u32 map_info_len = sizeof(map_info);
112
113	bpf_obj_get_info_by_fd(fd, &map_info, &map_info_len);
114	return map_info.id;
115}
116
117/* trigger the leader program on a cpu */
118static inline int bperf_trigger_reading(int prog_fd, int cpu)
119{
120	DECLARE_LIBBPF_OPTS(bpf_test_run_opts, opts,
121			    .ctx_in = NULL,
122			    .ctx_size_in = 0,
123			    .flags = BPF_F_TEST_RUN_ON_CPU,
124			    .cpu = cpu,
125			    .retval = 0,
126		);
127
128	return bpf_prog_test_run_opts(prog_fd, &opts);
129}
130
131#endif /* __PERF_BPF_COUNTER_H */