| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | #include <errno.h> |
|---|
| 2 | 3 | #include <stdio.h> |
|---|
| 3 | 4 | #include <stdlib.h> |
|---|
| .. | .. |
|---|
| 5 | 6 | #include <sys/types.h> |
|---|
| 6 | 7 | #include <sys/stat.h> |
|---|
| 7 | 8 | #include <fcntl.h> |
|---|
| 9 | +#include <util/record.h> |
|---|
| 8 | 10 | #include <util/util.h> |
|---|
| 9 | 11 | #include <util/bpf-loader.h> |
|---|
| 10 | 12 | #include <util/evlist.h> |
|---|
| 11 | 13 | #include <linux/bpf.h> |
|---|
| 12 | 14 | #include <linux/filter.h> |
|---|
| 13 | 15 | #include <linux/kernel.h> |
|---|
| 16 | +#include <linux/string.h> |
|---|
| 14 | 17 | #include <api/fs/fs.h> |
|---|
| 15 | 18 | #include <bpf/bpf.h> |
|---|
| 19 | +#include <perf/mmap.h> |
|---|
| 16 | 20 | #include "tests.h" |
|---|
| 17 | 21 | #include "llvm.h" |
|---|
| 18 | 22 | #include "debug.h" |
|---|
| 23 | +#include "parse-events.h" |
|---|
| 24 | +#include "util/mmap.h" |
|---|
| 19 | 25 | #define NR_ITERS 111 |
|---|
| 20 | 26 | #define PERF_TEST_BPF_PATH "/sys/fs/bpf/perf_test" |
|---|
| 21 | 27 | |
|---|
| .. | .. |
|---|
| 118 | 124 | |
|---|
| 119 | 125 | char pid[16]; |
|---|
| 120 | 126 | char sbuf[STRERR_BUFSIZE]; |
|---|
| 121 | | - struct perf_evlist *evlist; |
|---|
| 127 | + struct evlist *evlist; |
|---|
| 122 | 128 | int i, ret = TEST_FAIL, err = 0, count = 0; |
|---|
| 123 | 129 | |
|---|
| 124 | 130 | struct parse_events_state parse_state; |
|---|
| .. | .. |
|---|
| 140 | 146 | opts.target.tid = opts.target.pid = pid; |
|---|
| 141 | 147 | |
|---|
| 142 | 148 | /* Instead of perf_evlist__new_default, don't add default events */ |
|---|
| 143 | | - evlist = perf_evlist__new(); |
|---|
| 149 | + evlist = evlist__new(); |
|---|
| 144 | 150 | if (!evlist) { |
|---|
| 145 | 151 | pr_debug("Not enough memory to create evlist\n"); |
|---|
| 146 | 152 | return TEST_FAIL; |
|---|
| .. | .. |
|---|
| 157 | 163 | |
|---|
| 158 | 164 | perf_evlist__config(evlist, &opts, NULL); |
|---|
| 159 | 165 | |
|---|
| 160 | | - err = perf_evlist__open(evlist); |
|---|
| 166 | + err = evlist__open(evlist); |
|---|
| 161 | 167 | if (err < 0) { |
|---|
| 162 | 168 | pr_debug("perf_evlist__open: %s\n", |
|---|
| 163 | 169 | str_error_r(errno, sbuf, sizeof(sbuf))); |
|---|
| 164 | 170 | goto out_delete_evlist; |
|---|
| 165 | 171 | } |
|---|
| 166 | 172 | |
|---|
| 167 | | - err = perf_evlist__mmap(evlist, opts.mmap_pages); |
|---|
| 173 | + err = evlist__mmap(evlist, opts.mmap_pages); |
|---|
| 168 | 174 | if (err < 0) { |
|---|
| 169 | | - pr_debug("perf_evlist__mmap: %s\n", |
|---|
| 175 | + pr_debug("evlist__mmap: %s\n", |
|---|
| 170 | 176 | str_error_r(errno, sbuf, sizeof(sbuf))); |
|---|
| 171 | 177 | goto out_delete_evlist; |
|---|
| 172 | 178 | } |
|---|
| 173 | 179 | |
|---|
| 174 | | - perf_evlist__enable(evlist); |
|---|
| 180 | + evlist__enable(evlist); |
|---|
| 175 | 181 | (*func)(); |
|---|
| 176 | | - perf_evlist__disable(evlist); |
|---|
| 182 | + evlist__disable(evlist); |
|---|
| 177 | 183 | |
|---|
| 178 | | - for (i = 0; i < evlist->nr_mmaps; i++) { |
|---|
| 184 | + for (i = 0; i < evlist->core.nr_mmaps; i++) { |
|---|
| 179 | 185 | union perf_event *event; |
|---|
| 180 | | - struct perf_mmap *md; |
|---|
| 186 | + struct mmap *md; |
|---|
| 181 | 187 | |
|---|
| 182 | 188 | md = &evlist->mmap[i]; |
|---|
| 183 | | - if (perf_mmap__read_init(md) < 0) |
|---|
| 189 | + if (perf_mmap__read_init(&md->core) < 0) |
|---|
| 184 | 190 | continue; |
|---|
| 185 | 191 | |
|---|
| 186 | | - while ((event = perf_mmap__read_event(md)) != NULL) { |
|---|
| 192 | + while ((event = perf_mmap__read_event(&md->core)) != NULL) { |
|---|
| 187 | 193 | const u32 type = event->header.type; |
|---|
| 188 | 194 | |
|---|
| 189 | 195 | if (type == PERF_RECORD_SAMPLE) |
|---|
| 190 | 196 | count ++; |
|---|
| 191 | 197 | } |
|---|
| 192 | | - perf_mmap__read_done(md); |
|---|
| 198 | + perf_mmap__read_done(&md->core); |
|---|
| 193 | 199 | } |
|---|
| 194 | 200 | |
|---|
| 195 | | - if (count != expect) { |
|---|
| 196 | | - pr_debug("BPF filter result incorrect, expected %d, got %d samples\n", expect, count); |
|---|
| 201 | + if (count != expect * evlist->core.nr_entries) { |
|---|
| 202 | + pr_debug("BPF filter result incorrect, expected %d, got %d samples\n", expect * evlist->core.nr_entries, count); |
|---|
| 197 | 203 | goto out_delete_evlist; |
|---|
| 198 | 204 | } |
|---|
| 199 | 205 | |
|---|
| 200 | 206 | ret = TEST_OK; |
|---|
| 201 | 207 | |
|---|
| 202 | 208 | out_delete_evlist: |
|---|
| 203 | | - perf_evlist__delete(evlist); |
|---|
| 209 | + evlist__delete(evlist); |
|---|
| 204 | 210 | return ret; |
|---|
| 205 | 211 | } |
|---|
| 206 | 212 | |
|---|