mem-events.c (abe9544ea78a2e0c3cc92b4410a57a9c0732293f) mem-events.c (1eaf496ed386934f1c2439a120fe84a05194f91a)
1// SPDX-License-Identifier: GPL-2.0
2#include <stddef.h>
3#include <stdlib.h>
4#include <string.h>
5#include <errno.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8#include <unistd.h>
9#include <api/fs/fs.h>
10#include <linux/kernel.h>
11#include "map_symbol.h"
12#include "mem-events.h"
13#include "debug.h"
14#include "symbol.h"
15#include "pmu.h"
1// SPDX-License-Identifier: GPL-2.0
2#include <stddef.h>
3#include <stdlib.h>
4#include <string.h>
5#include <errno.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8#include <unistd.h>
9#include <api/fs/fs.h>
10#include <linux/kernel.h>
11#include "map_symbol.h"
12#include "mem-events.h"
13#include "debug.h"
14#include "symbol.h"
15#include "pmu.h"
16#include "pmus.h"
16
17unsigned int perf_mem_events__loads_ldlat = 30;
18
19#define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
20
21static struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
22 E("ldlat-loads", "cpu/mem-loads,ldlat=%u/P", "cpu/events/mem-loads"),
23 E("ldlat-stores", "cpu/mem-stores/P", "cpu/events/mem-stores"),

--- 99 unchanged lines hidden (view full) ---

123
124 /*
125 * If the event entry isn't valid, skip initialization
126 * and "e->supported" will keep false.
127 */
128 if (!e->tag)
129 continue;
130
17
18unsigned int perf_mem_events__loads_ldlat = 30;
19
20#define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
21
22static struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
23 E("ldlat-loads", "cpu/mem-loads,ldlat=%u/P", "cpu/events/mem-loads"),
24 E("ldlat-stores", "cpu/mem-stores/P", "cpu/events/mem-stores"),

--- 99 unchanged lines hidden (view full) ---

124
125 /*
126 * If the event entry isn't valid, skip initialization
127 * and "e->supported" will keep false.
128 */
129 if (!e->tag)
130 continue;
131
131 if (!perf_pmu__has_hybrid()) {
132 if (!perf_pmus__has_hybrid()) {
132 scnprintf(sysfs_name, sizeof(sysfs_name),
133 e->sysfs_name, "cpu");
134 e->supported = perf_mem_event__supported(mnt, sysfs_name);
135 } else {
136 struct perf_pmu *pmu = NULL;
137
133 scnprintf(sysfs_name, sizeof(sysfs_name),
134 e->sysfs_name, "cpu");
135 e->supported = perf_mem_event__supported(mnt, sysfs_name);
136 } else {
137 struct perf_pmu *pmu = NULL;
138
138 while ((pmu = perf_pmu__scan(pmu)) != NULL) {
139 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
139 if (!pmu->is_core)
140 continue;
141
142 scnprintf(sysfs_name, sizeof(sysfs_name),
143 e->sysfs_name, pmu->name);
144 e->supported |= perf_mem_event__supported(mnt, sysfs_name);
145 }
146 }

--- 23 unchanged lines hidden (view full) ---

170
171static void perf_mem_events__print_unsupport_hybrid(struct perf_mem_event *e,
172 int idx)
173{
174 const char *mnt = sysfs__mount();
175 char sysfs_name[100];
176 struct perf_pmu *pmu = NULL;
177
140 if (!pmu->is_core)
141 continue;
142
143 scnprintf(sysfs_name, sizeof(sysfs_name),
144 e->sysfs_name, pmu->name);
145 e->supported |= perf_mem_event__supported(mnt, sysfs_name);
146 }
147 }

--- 23 unchanged lines hidden (view full) ---

171
172static void perf_mem_events__print_unsupport_hybrid(struct perf_mem_event *e,
173 int idx)
174{
175 const char *mnt = sysfs__mount();
176 char sysfs_name[100];
177 struct perf_pmu *pmu = NULL;
178
178 while ((pmu = perf_pmu__scan(pmu)) != NULL) {
179 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
179 if (!pmu->is_core)
180 continue;
181
182 scnprintf(sysfs_name, sizeof(sysfs_name), e->sysfs_name,
183 pmu->name);
184 if (!perf_mem_event__supported(mnt, sysfs_name)) {
185 pr_err("failed: event '%s' not supported\n",
186 perf_mem_events__name(idx, pmu->name));

--- 9 unchanged lines hidden (view full) ---

196 struct perf_pmu *pmu;
197 char *s;
198
199 for (int j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
200 e = perf_mem_events__ptr(j);
201 if (!e->record)
202 continue;
203
180 if (!pmu->is_core)
181 continue;
182
183 scnprintf(sysfs_name, sizeof(sysfs_name), e->sysfs_name,
184 pmu->name);
185 if (!perf_mem_event__supported(mnt, sysfs_name)) {
186 pr_err("failed: event '%s' not supported\n",
187 perf_mem_events__name(idx, pmu->name));

--- 9 unchanged lines hidden (view full) ---

197 struct perf_pmu *pmu;
198 char *s;
199
200 for (int j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
201 e = perf_mem_events__ptr(j);
202 if (!e->record)
203 continue;
204
204 if (!perf_pmu__has_hybrid()) {
205 if (!perf_pmus__has_hybrid()) {
205 if (!e->supported) {
206 pr_err("failed: event '%s' not supported\n",
207 perf_mem_events__name(j, NULL));
208 return -1;
209 }
210
211 rec_argv[i++] = "-e";
212 rec_argv[i++] = perf_mem_events__name(j, NULL);
213 } else {
214 if (!e->supported) {
215 perf_mem_events__print_unsupport_hybrid(e, j);
216 return -1;
217 }
218
206 if (!e->supported) {
207 pr_err("failed: event '%s' not supported\n",
208 perf_mem_events__name(j, NULL));
209 return -1;
210 }
211
212 rec_argv[i++] = "-e";
213 rec_argv[i++] = perf_mem_events__name(j, NULL);
214 } else {
215 if (!e->supported) {
216 perf_mem_events__print_unsupport_hybrid(e, j);
217 return -1;
218 }
219
219 while ((pmu = perf_pmu__scan(pmu)) != NULL) {
220 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
220 if (!pmu->is_core)
221 continue;
222 rec_argv[i++] = "-e";
223 s = perf_mem_events__name(j, pmu->name);
224 if (s) {
225 s = strdup(s);
226 if (!s)
227 return -1;

--- 486 unchanged lines hidden ---
221 if (!pmu->is_core)
222 continue;
223 rec_argv[i++] = "-e";
224 s = perf_mem_events__name(j, pmu->name);
225 if (s) {
226 s = strdup(s);
227 if (!s)
228 return -1;

--- 486 unchanged lines hidden ---