xref: /openbmc/linux/tools/perf/util/mem-events.c (revision 0a9a24cc)
1ce1e22b0SJiri Olsa #include <stddef.h>
2ce1e22b0SJiri Olsa #include <stdlib.h>
3ce1e22b0SJiri Olsa #include <string.h>
4ce1e22b0SJiri Olsa #include <errno.h>
554fbad54SJiri Olsa #include <sys/types.h>
654fbad54SJiri Olsa #include <sys/stat.h>
754fbad54SJiri Olsa #include <unistd.h>
854fbad54SJiri Olsa #include <api/fs/fs.h>
9acbe613eSJiri Olsa #include "mem-events.h"
10ce1e22b0SJiri Olsa #include "debug.h"
110c877d75SJiri Olsa #include "symbol.h"
12aadddd68SJiri Olsa #include "sort.h"
13acbe613eSJiri Olsa 
14b0d745b3SJiri Olsa unsigned int perf_mem_events__loads_ldlat = 30;
15b0d745b3SJiri Olsa 
1654fbad54SJiri Olsa #define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
17acbe613eSJiri Olsa 
18acbe613eSJiri Olsa struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
19b0d745b3SJiri Olsa 	E("ldlat-loads",	"cpu/mem-loads,ldlat=%u/P",	"mem-loads"),
2054fbad54SJiri Olsa 	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
21acbe613eSJiri Olsa };
2254fbad54SJiri Olsa #undef E
23acbe613eSJiri Olsa 
24acbe613eSJiri Olsa #undef E
25ce1e22b0SJiri Olsa 
26b0d745b3SJiri Olsa static char mem_loads_name[100];
27b0d745b3SJiri Olsa static bool mem_loads_name__init;
28b0d745b3SJiri Olsa 
292ba7ac58SJiri Olsa char *perf_mem_events__name(int i)
302ba7ac58SJiri Olsa {
31b0d745b3SJiri Olsa 	if (i == PERF_MEM_EVENTS__LOAD) {
32b0d745b3SJiri Olsa 		if (!mem_loads_name__init) {
33b0d745b3SJiri Olsa 			mem_loads_name__init = true;
34b0d745b3SJiri Olsa 			scnprintf(mem_loads_name, sizeof(mem_loads_name),
35b0d745b3SJiri Olsa 				  perf_mem_events[i].name,
36b0d745b3SJiri Olsa 				  perf_mem_events__loads_ldlat);
37b0d745b3SJiri Olsa 		}
38b0d745b3SJiri Olsa 		return mem_loads_name;
39b0d745b3SJiri Olsa 	}
40b0d745b3SJiri Olsa 
412ba7ac58SJiri Olsa 	return (char *)perf_mem_events[i].name;
422ba7ac58SJiri Olsa }
432ba7ac58SJiri Olsa 
44ce1e22b0SJiri Olsa int perf_mem_events__parse(const char *str)
45ce1e22b0SJiri Olsa {
46ce1e22b0SJiri Olsa 	char *tok, *saveptr = NULL;
47ce1e22b0SJiri Olsa 	bool found = false;
48ce1e22b0SJiri Olsa 	char *buf;
49ce1e22b0SJiri Olsa 	int j;
50ce1e22b0SJiri Olsa 
51ce1e22b0SJiri Olsa 	/* We need buffer that we know we can write to. */
52ce1e22b0SJiri Olsa 	buf = malloc(strlen(str) + 1);
53ce1e22b0SJiri Olsa 	if (!buf)
54ce1e22b0SJiri Olsa 		return -ENOMEM;
55ce1e22b0SJiri Olsa 
56ce1e22b0SJiri Olsa 	strcpy(buf, str);
57ce1e22b0SJiri Olsa 
58ce1e22b0SJiri Olsa 	tok = strtok_r((char *)buf, ",", &saveptr);
59ce1e22b0SJiri Olsa 
60ce1e22b0SJiri Olsa 	while (tok) {
61ce1e22b0SJiri Olsa 		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
62ce1e22b0SJiri Olsa 			struct perf_mem_event *e = &perf_mem_events[j];
63ce1e22b0SJiri Olsa 
64ce1e22b0SJiri Olsa 			if (strstr(e->tag, tok))
65ce1e22b0SJiri Olsa 				e->record = found = true;
66ce1e22b0SJiri Olsa 		}
67ce1e22b0SJiri Olsa 
68ce1e22b0SJiri Olsa 		tok = strtok_r(NULL, ",", &saveptr);
69ce1e22b0SJiri Olsa 	}
70ce1e22b0SJiri Olsa 
71ce1e22b0SJiri Olsa 	free(buf);
72ce1e22b0SJiri Olsa 
73ce1e22b0SJiri Olsa 	if (found)
74ce1e22b0SJiri Olsa 		return 0;
75ce1e22b0SJiri Olsa 
76ce1e22b0SJiri Olsa 	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
77ce1e22b0SJiri Olsa 	return -1;
78ce1e22b0SJiri Olsa }
7954fbad54SJiri Olsa 
8054fbad54SJiri Olsa int perf_mem_events__init(void)
8154fbad54SJiri Olsa {
8254fbad54SJiri Olsa 	const char *mnt = sysfs__mount();
8354fbad54SJiri Olsa 	bool found = false;
8454fbad54SJiri Olsa 	int j;
8554fbad54SJiri Olsa 
8654fbad54SJiri Olsa 	if (!mnt)
8754fbad54SJiri Olsa 		return -ENOENT;
8854fbad54SJiri Olsa 
8954fbad54SJiri Olsa 	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
9054fbad54SJiri Olsa 		char path[PATH_MAX];
9154fbad54SJiri Olsa 		struct perf_mem_event *e = &perf_mem_events[j];
9254fbad54SJiri Olsa 		struct stat st;
9354fbad54SJiri Olsa 
9454fbad54SJiri Olsa 		scnprintf(path, PATH_MAX, "%s/devices/cpu/events/%s",
9554fbad54SJiri Olsa 			  mnt, e->sysfs_name);
9654fbad54SJiri Olsa 
9754fbad54SJiri Olsa 		if (!stat(path, &st))
9854fbad54SJiri Olsa 			e->supported = found = true;
9954fbad54SJiri Olsa 	}
10054fbad54SJiri Olsa 
10154fbad54SJiri Olsa 	return found ? 0 : -ENOENT;
10254fbad54SJiri Olsa }
1030c877d75SJiri Olsa 
1040c877d75SJiri Olsa static const char * const tlb_access[] = {
1050c877d75SJiri Olsa 	"N/A",
1060c877d75SJiri Olsa 	"HIT",
1070c877d75SJiri Olsa 	"MISS",
1080c877d75SJiri Olsa 	"L1",
1090c877d75SJiri Olsa 	"L2",
1100c877d75SJiri Olsa 	"Walker",
1110c877d75SJiri Olsa 	"Fault",
1120c877d75SJiri Olsa };
1130c877d75SJiri Olsa 
114b1a5fbeaSJiri Olsa int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
1150c877d75SJiri Olsa {
1160c877d75SJiri Olsa 	size_t l = 0, i;
1170c877d75SJiri Olsa 	u64 m = PERF_MEM_TLB_NA;
1180c877d75SJiri Olsa 	u64 hit, miss;
1190c877d75SJiri Olsa 
1200c877d75SJiri Olsa 	sz -= 1; /* -1 for null termination */
1210c877d75SJiri Olsa 	out[0] = '\0';
1220c877d75SJiri Olsa 
1230c877d75SJiri Olsa 	if (mem_info)
1240c877d75SJiri Olsa 		m = mem_info->data_src.mem_dtlb;
1250c877d75SJiri Olsa 
1260c877d75SJiri Olsa 	hit = m & PERF_MEM_TLB_HIT;
1270c877d75SJiri Olsa 	miss = m & PERF_MEM_TLB_MISS;
1280c877d75SJiri Olsa 
1290c877d75SJiri Olsa 	/* already taken care of */
1300c877d75SJiri Olsa 	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
1310c877d75SJiri Olsa 
1320c877d75SJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
1330c877d75SJiri Olsa 		if (!(m & 0x1))
1340c877d75SJiri Olsa 			continue;
1350c877d75SJiri Olsa 		if (l) {
1360c877d75SJiri Olsa 			strcat(out, " or ");
1370c877d75SJiri Olsa 			l += 4;
1380c877d75SJiri Olsa 		}
139b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, tlb_access[i]);
1400c877d75SJiri Olsa 	}
1410c877d75SJiri Olsa 	if (*out == '\0')
142b1a5fbeaSJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
1430c877d75SJiri Olsa 	if (hit)
144b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, " hit");
1450c877d75SJiri Olsa 	if (miss)
146b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, " miss");
147b1a5fbeaSJiri Olsa 
148b1a5fbeaSJiri Olsa 	return l;
1490c877d75SJiri Olsa }
150071e9a1eSJiri Olsa 
151071e9a1eSJiri Olsa static const char * const mem_lvl[] = {
152071e9a1eSJiri Olsa 	"N/A",
153071e9a1eSJiri Olsa 	"HIT",
154071e9a1eSJiri Olsa 	"MISS",
155071e9a1eSJiri Olsa 	"L1",
156071e9a1eSJiri Olsa 	"LFB",
157071e9a1eSJiri Olsa 	"L2",
158071e9a1eSJiri Olsa 	"L3",
159071e9a1eSJiri Olsa 	"Local RAM",
160071e9a1eSJiri Olsa 	"Remote RAM (1 hop)",
161071e9a1eSJiri Olsa 	"Remote RAM (2 hops)",
162071e9a1eSJiri Olsa 	"Remote Cache (1 hop)",
163071e9a1eSJiri Olsa 	"Remote Cache (2 hops)",
164071e9a1eSJiri Olsa 	"I/O",
165071e9a1eSJiri Olsa 	"Uncached",
166071e9a1eSJiri Olsa };
167071e9a1eSJiri Olsa 
16896907563SJiri Olsa int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
169071e9a1eSJiri Olsa {
170071e9a1eSJiri Olsa 	size_t i, l = 0;
171071e9a1eSJiri Olsa 	u64 m =  PERF_MEM_LVL_NA;
172071e9a1eSJiri Olsa 	u64 hit, miss;
173071e9a1eSJiri Olsa 
174071e9a1eSJiri Olsa 	if (mem_info)
175071e9a1eSJiri Olsa 		m  = mem_info->data_src.mem_lvl;
176071e9a1eSJiri Olsa 
177071e9a1eSJiri Olsa 	sz -= 1; /* -1 for null termination */
178071e9a1eSJiri Olsa 	out[0] = '\0';
179071e9a1eSJiri Olsa 
180071e9a1eSJiri Olsa 	hit = m & PERF_MEM_LVL_HIT;
181071e9a1eSJiri Olsa 	miss = m & PERF_MEM_LVL_MISS;
182071e9a1eSJiri Olsa 
183071e9a1eSJiri Olsa 	/* already taken care of */
184071e9a1eSJiri Olsa 	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
185071e9a1eSJiri Olsa 
186071e9a1eSJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
187071e9a1eSJiri Olsa 		if (!(m & 0x1))
188071e9a1eSJiri Olsa 			continue;
189071e9a1eSJiri Olsa 		if (l) {
190071e9a1eSJiri Olsa 			strcat(out, " or ");
191071e9a1eSJiri Olsa 			l += 4;
192071e9a1eSJiri Olsa 		}
19396907563SJiri Olsa 		l += scnprintf(out + l, sz - l, mem_lvl[i]);
194071e9a1eSJiri Olsa 	}
195071e9a1eSJiri Olsa 	if (*out == '\0')
19696907563SJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
197071e9a1eSJiri Olsa 	if (hit)
19896907563SJiri Olsa 		l += scnprintf(out + l, sz - l, " hit");
199071e9a1eSJiri Olsa 	if (miss)
20096907563SJiri Olsa 		l += scnprintf(out + l, sz - l, " miss");
20196907563SJiri Olsa 
20296907563SJiri Olsa 	return l;
203071e9a1eSJiri Olsa }
2042c07af13SJiri Olsa 
2052c07af13SJiri Olsa static const char * const snoop_access[] = {
2062c07af13SJiri Olsa 	"N/A",
2072c07af13SJiri Olsa 	"None",
2082c07af13SJiri Olsa 	"Miss",
2092c07af13SJiri Olsa 	"Hit",
2102c07af13SJiri Olsa 	"HitM",
2112c07af13SJiri Olsa };
2122c07af13SJiri Olsa 
213149d7507SJiri Olsa int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
2142c07af13SJiri Olsa {
2152c07af13SJiri Olsa 	size_t i, l = 0;
2162c07af13SJiri Olsa 	u64 m = PERF_MEM_SNOOP_NA;
2172c07af13SJiri Olsa 
2182c07af13SJiri Olsa 	sz -= 1; /* -1 for null termination */
2192c07af13SJiri Olsa 	out[0] = '\0';
2202c07af13SJiri Olsa 
2212c07af13SJiri Olsa 	if (mem_info)
2222c07af13SJiri Olsa 		m = mem_info->data_src.mem_snoop;
2232c07af13SJiri Olsa 
2242c07af13SJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
2252c07af13SJiri Olsa 		if (!(m & 0x1))
2262c07af13SJiri Olsa 			continue;
2272c07af13SJiri Olsa 		if (l) {
2282c07af13SJiri Olsa 			strcat(out, " or ");
2292c07af13SJiri Olsa 			l += 4;
2302c07af13SJiri Olsa 		}
231149d7507SJiri Olsa 		l += scnprintf(out + l, sz - l, snoop_access[i]);
2322c07af13SJiri Olsa 	}
2332c07af13SJiri Olsa 
2342c07af13SJiri Olsa 	if (*out == '\0')
235149d7507SJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
236149d7507SJiri Olsa 
237149d7507SJiri Olsa 	return l;
2382c07af13SJiri Olsa }
23969a77275SJiri Olsa 
2408b0819c8SJiri Olsa int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
24169a77275SJiri Olsa {
24269a77275SJiri Olsa 	u64 mask = PERF_MEM_LOCK_NA;
2438b0819c8SJiri Olsa 	int l;
24469a77275SJiri Olsa 
24569a77275SJiri Olsa 	if (mem_info)
24669a77275SJiri Olsa 		mask = mem_info->data_src.mem_lock;
24769a77275SJiri Olsa 
24869a77275SJiri Olsa 	if (mask & PERF_MEM_LOCK_NA)
2498b0819c8SJiri Olsa 		l = scnprintf(out, sz, "N/A");
25069a77275SJiri Olsa 	else if (mask & PERF_MEM_LOCK_LOCKED)
2518b0819c8SJiri Olsa 		l = scnprintf(out, sz, "Yes");
25269a77275SJiri Olsa 	else
2538b0819c8SJiri Olsa 		l = scnprintf(out, sz, "No");
2548b0819c8SJiri Olsa 
2558b0819c8SJiri Olsa 	return l;
25669a77275SJiri Olsa }
257c19ac912SJiri Olsa 
258c19ac912SJiri Olsa int perf_script__meminfo_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
259c19ac912SJiri Olsa {
260c19ac912SJiri Olsa 	int i = 0;
261c19ac912SJiri Olsa 
262c19ac912SJiri Olsa 	i += perf_mem__lvl_scnprintf(out, sz, mem_info);
263c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|SNP ");
264c19ac912SJiri Olsa 	i += perf_mem__snp_scnprintf(out + i, sz - i, mem_info);
265c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|TLB ");
266c19ac912SJiri Olsa 	i += perf_mem__tlb_scnprintf(out + i, sz - i, mem_info);
267c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|LCK ");
268c19ac912SJiri Olsa 	i += perf_mem__lck_scnprintf(out + i, sz - i, mem_info);
269c19ac912SJiri Olsa 
270c19ac912SJiri Olsa 	return i;
271c19ac912SJiri Olsa }
272aadddd68SJiri Olsa 
273aadddd68SJiri Olsa int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi)
274aadddd68SJiri Olsa {
275aadddd68SJiri Olsa 	union perf_mem_data_src *data_src = &mi->data_src;
276aadddd68SJiri Olsa 	u64 daddr  = mi->daddr.addr;
277aadddd68SJiri Olsa 	u64 op     = data_src->mem_op;
278aadddd68SJiri Olsa 	u64 lvl    = data_src->mem_lvl;
279aadddd68SJiri Olsa 	u64 snoop  = data_src->mem_snoop;
280aadddd68SJiri Olsa 	u64 lock   = data_src->mem_lock;
281aadddd68SJiri Olsa 	int err = 0;
282aadddd68SJiri Olsa 
283aadddd68SJiri Olsa #define P(a, b) PERF_MEM_##a##_##b
284aadddd68SJiri Olsa 
285aadddd68SJiri Olsa 	stats->nr_entries++;
286aadddd68SJiri Olsa 
287aadddd68SJiri Olsa 	if (lock & P(LOCK, LOCKED)) stats->locks++;
288aadddd68SJiri Olsa 
289aadddd68SJiri Olsa 	if (op & P(OP, LOAD)) {
290aadddd68SJiri Olsa 		/* load */
291aadddd68SJiri Olsa 		stats->load++;
292aadddd68SJiri Olsa 
293aadddd68SJiri Olsa 		if (!daddr) {
294aadddd68SJiri Olsa 			stats->ld_noadrs++;
295aadddd68SJiri Olsa 			return -1;
296aadddd68SJiri Olsa 		}
297aadddd68SJiri Olsa 
298aadddd68SJiri Olsa 		if (lvl & P(LVL, HIT)) {
299aadddd68SJiri Olsa 			if (lvl & P(LVL, UNC)) stats->ld_uncache++;
300aadddd68SJiri Olsa 			if (lvl & P(LVL, IO))  stats->ld_io++;
301aadddd68SJiri Olsa 			if (lvl & P(LVL, LFB)) stats->ld_fbhit++;
302aadddd68SJiri Olsa 			if (lvl & P(LVL, L1 )) stats->ld_l1hit++;
303aadddd68SJiri Olsa 			if (lvl & P(LVL, L2 )) stats->ld_l2hit++;
304aadddd68SJiri Olsa 			if (lvl & P(LVL, L3 )) {
305aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HITM))
306aadddd68SJiri Olsa 					stats->lcl_hitm++;
307aadddd68SJiri Olsa 				else
308aadddd68SJiri Olsa 					stats->ld_llchit++;
309aadddd68SJiri Olsa 			}
310aadddd68SJiri Olsa 
311aadddd68SJiri Olsa 			if (lvl & P(LVL, LOC_RAM)) {
312aadddd68SJiri Olsa 				stats->lcl_dram++;
313aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HIT))
314aadddd68SJiri Olsa 					stats->ld_shared++;
315aadddd68SJiri Olsa 				else
316aadddd68SJiri Olsa 					stats->ld_excl++;
317aadddd68SJiri Olsa 			}
318aadddd68SJiri Olsa 
319aadddd68SJiri Olsa 			if ((lvl & P(LVL, REM_RAM1)) ||
320aadddd68SJiri Olsa 			    (lvl & P(LVL, REM_RAM2))) {
321aadddd68SJiri Olsa 				stats->rmt_dram++;
322aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HIT))
323aadddd68SJiri Olsa 					stats->ld_shared++;
324aadddd68SJiri Olsa 				else
325aadddd68SJiri Olsa 					stats->ld_excl++;
326aadddd68SJiri Olsa 			}
327aadddd68SJiri Olsa 		}
328aadddd68SJiri Olsa 
329aadddd68SJiri Olsa 		if ((lvl & P(LVL, REM_CCE1)) ||
330aadddd68SJiri Olsa 		    (lvl & P(LVL, REM_CCE2))) {
331aadddd68SJiri Olsa 			if (snoop & P(SNOOP, HIT))
332aadddd68SJiri Olsa 				stats->rmt_hit++;
333aadddd68SJiri Olsa 			else if (snoop & P(SNOOP, HITM))
334aadddd68SJiri Olsa 				stats->rmt_hitm++;
335aadddd68SJiri Olsa 		}
336aadddd68SJiri Olsa 
337aadddd68SJiri Olsa 		if ((lvl & P(LVL, MISS)))
338aadddd68SJiri Olsa 			stats->ld_miss++;
339aadddd68SJiri Olsa 
340aadddd68SJiri Olsa 	} else if (op & P(OP, STORE)) {
341aadddd68SJiri Olsa 		/* store */
342aadddd68SJiri Olsa 		stats->store++;
343aadddd68SJiri Olsa 
344aadddd68SJiri Olsa 		if (!daddr) {
345aadddd68SJiri Olsa 			stats->st_noadrs++;
346aadddd68SJiri Olsa 			return -1;
347aadddd68SJiri Olsa 		}
348aadddd68SJiri Olsa 
349aadddd68SJiri Olsa 		if (lvl & P(LVL, HIT)) {
350aadddd68SJiri Olsa 			if (lvl & P(LVL, UNC)) stats->st_uncache++;
351aadddd68SJiri Olsa 			if (lvl & P(LVL, L1 )) stats->st_l1hit++;
352aadddd68SJiri Olsa 		}
353aadddd68SJiri Olsa 		if (lvl & P(LVL, MISS))
354aadddd68SJiri Olsa 			if (lvl & P(LVL, L1)) stats->st_l1miss++;
355aadddd68SJiri Olsa 	} else {
356aadddd68SJiri Olsa 		/* unparsable data_src? */
357aadddd68SJiri Olsa 		stats->noparse++;
358aadddd68SJiri Olsa 		return -1;
359aadddd68SJiri Olsa 	}
360aadddd68SJiri Olsa 
361aadddd68SJiri Olsa 	if (!mi->daddr.map || !mi->iaddr.map) {
362aadddd68SJiri Olsa 		stats->nomap++;
363aadddd68SJiri Olsa 		return -1;
364aadddd68SJiri Olsa 	}
365aadddd68SJiri Olsa 
366aadddd68SJiri Olsa #undef P
367aadddd68SJiri Olsa 	return err;
368aadddd68SJiri Olsa }
3690a9a24ccSJiri Olsa 
3700a9a24ccSJiri Olsa void c2c_add_stats(struct c2c_stats *stats, struct c2c_stats *add)
3710a9a24ccSJiri Olsa {
3720a9a24ccSJiri Olsa 	stats->nr_entries	+= add->nr_entries;
3730a9a24ccSJiri Olsa 
3740a9a24ccSJiri Olsa 	stats->locks		+= add->locks;
3750a9a24ccSJiri Olsa 	stats->store		+= add->store;
3760a9a24ccSJiri Olsa 	stats->st_uncache	+= add->st_uncache;
3770a9a24ccSJiri Olsa 	stats->st_noadrs	+= add->st_noadrs;
3780a9a24ccSJiri Olsa 	stats->st_l1hit		+= add->st_l1hit;
3790a9a24ccSJiri Olsa 	stats->st_l1miss	+= add->st_l1miss;
3800a9a24ccSJiri Olsa 	stats->load		+= add->load;
3810a9a24ccSJiri Olsa 	stats->ld_excl		+= add->ld_excl;
3820a9a24ccSJiri Olsa 	stats->ld_shared	+= add->ld_shared;
3830a9a24ccSJiri Olsa 	stats->ld_uncache	+= add->ld_uncache;
3840a9a24ccSJiri Olsa 	stats->ld_io		+= add->ld_io;
3850a9a24ccSJiri Olsa 	stats->ld_miss		+= add->ld_miss;
3860a9a24ccSJiri Olsa 	stats->ld_noadrs	+= add->ld_noadrs;
3870a9a24ccSJiri Olsa 	stats->ld_fbhit		+= add->ld_fbhit;
3880a9a24ccSJiri Olsa 	stats->ld_l1hit		+= add->ld_l1hit;
3890a9a24ccSJiri Olsa 	stats->ld_l2hit		+= add->ld_l2hit;
3900a9a24ccSJiri Olsa 	stats->ld_llchit	+= add->ld_llchit;
3910a9a24ccSJiri Olsa 	stats->lcl_hitm		+= add->lcl_hitm;
3920a9a24ccSJiri Olsa 	stats->rmt_hitm		+= add->rmt_hitm;
3930a9a24ccSJiri Olsa 	stats->rmt_hit		+= add->rmt_hit;
3940a9a24ccSJiri Olsa 	stats->lcl_dram		+= add->lcl_dram;
3950a9a24ccSJiri Olsa 	stats->rmt_dram		+= add->rmt_dram;
3960a9a24ccSJiri Olsa 	stats->nomap		+= add->nomap;
3970a9a24ccSJiri Olsa 	stats->noparse		+= add->noparse;
3980a9a24ccSJiri Olsa }
399