xref: /openbmc/linux/tools/perf/util/mem-events.c (revision 166ebdd2)
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>
9877a7a11SArnaldo Carvalho de Melo #include <linux/kernel.h>
10acbe613eSJiri Olsa #include "mem-events.h"
11ce1e22b0SJiri Olsa #include "debug.h"
120c877d75SJiri Olsa #include "symbol.h"
13aadddd68SJiri Olsa #include "sort.h"
14acbe613eSJiri Olsa 
15b0d745b3SJiri Olsa unsigned int perf_mem_events__loads_ldlat = 30;
16b0d745b3SJiri Olsa 
1754fbad54SJiri Olsa #define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
18acbe613eSJiri Olsa 
19acbe613eSJiri Olsa struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
20b0d745b3SJiri Olsa 	E("ldlat-loads",	"cpu/mem-loads,ldlat=%u/P",	"mem-loads"),
2154fbad54SJiri Olsa 	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
22acbe613eSJiri Olsa };
2354fbad54SJiri Olsa #undef E
24acbe613eSJiri Olsa 
25acbe613eSJiri Olsa #undef E
26ce1e22b0SJiri Olsa 
27b0d745b3SJiri Olsa static char mem_loads_name[100];
28b0d745b3SJiri Olsa static bool mem_loads_name__init;
29b0d745b3SJiri Olsa 
302ba7ac58SJiri Olsa char *perf_mem_events__name(int i)
312ba7ac58SJiri Olsa {
32b0d745b3SJiri Olsa 	if (i == PERF_MEM_EVENTS__LOAD) {
33b0d745b3SJiri Olsa 		if (!mem_loads_name__init) {
34b0d745b3SJiri Olsa 			mem_loads_name__init = true;
35b0d745b3SJiri Olsa 			scnprintf(mem_loads_name, sizeof(mem_loads_name),
36b0d745b3SJiri Olsa 				  perf_mem_events[i].name,
37b0d745b3SJiri Olsa 				  perf_mem_events__loads_ldlat);
38b0d745b3SJiri Olsa 		}
39b0d745b3SJiri Olsa 		return mem_loads_name;
40b0d745b3SJiri Olsa 	}
41b0d745b3SJiri Olsa 
422ba7ac58SJiri Olsa 	return (char *)perf_mem_events[i].name;
432ba7ac58SJiri Olsa }
442ba7ac58SJiri Olsa 
45ce1e22b0SJiri Olsa int perf_mem_events__parse(const char *str)
46ce1e22b0SJiri Olsa {
47ce1e22b0SJiri Olsa 	char *tok, *saveptr = NULL;
48ce1e22b0SJiri Olsa 	bool found = false;
49ce1e22b0SJiri Olsa 	char *buf;
50ce1e22b0SJiri Olsa 	int j;
51ce1e22b0SJiri Olsa 
52ce1e22b0SJiri Olsa 	/* We need buffer that we know we can write to. */
53ce1e22b0SJiri Olsa 	buf = malloc(strlen(str) + 1);
54ce1e22b0SJiri Olsa 	if (!buf)
55ce1e22b0SJiri Olsa 		return -ENOMEM;
56ce1e22b0SJiri Olsa 
57ce1e22b0SJiri Olsa 	strcpy(buf, str);
58ce1e22b0SJiri Olsa 
59ce1e22b0SJiri Olsa 	tok = strtok_r((char *)buf, ",", &saveptr);
60ce1e22b0SJiri Olsa 
61ce1e22b0SJiri Olsa 	while (tok) {
62ce1e22b0SJiri Olsa 		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
63ce1e22b0SJiri Olsa 			struct perf_mem_event *e = &perf_mem_events[j];
64ce1e22b0SJiri Olsa 
65ce1e22b0SJiri Olsa 			if (strstr(e->tag, tok))
66ce1e22b0SJiri Olsa 				e->record = found = true;
67ce1e22b0SJiri Olsa 		}
68ce1e22b0SJiri Olsa 
69ce1e22b0SJiri Olsa 		tok = strtok_r(NULL, ",", &saveptr);
70ce1e22b0SJiri Olsa 	}
71ce1e22b0SJiri Olsa 
72ce1e22b0SJiri Olsa 	free(buf);
73ce1e22b0SJiri Olsa 
74ce1e22b0SJiri Olsa 	if (found)
75ce1e22b0SJiri Olsa 		return 0;
76ce1e22b0SJiri Olsa 
77ce1e22b0SJiri Olsa 	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
78ce1e22b0SJiri Olsa 	return -1;
79ce1e22b0SJiri Olsa }
8054fbad54SJiri Olsa 
8154fbad54SJiri Olsa int perf_mem_events__init(void)
8254fbad54SJiri Olsa {
8354fbad54SJiri Olsa 	const char *mnt = sysfs__mount();
8454fbad54SJiri Olsa 	bool found = false;
8554fbad54SJiri Olsa 	int j;
8654fbad54SJiri Olsa 
8754fbad54SJiri Olsa 	if (!mnt)
8854fbad54SJiri Olsa 		return -ENOENT;
8954fbad54SJiri Olsa 
9054fbad54SJiri Olsa 	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
9154fbad54SJiri Olsa 		char path[PATH_MAX];
9254fbad54SJiri Olsa 		struct perf_mem_event *e = &perf_mem_events[j];
9354fbad54SJiri Olsa 		struct stat st;
9454fbad54SJiri Olsa 
9554fbad54SJiri Olsa 		scnprintf(path, PATH_MAX, "%s/devices/cpu/events/%s",
9654fbad54SJiri Olsa 			  mnt, e->sysfs_name);
9754fbad54SJiri Olsa 
9854fbad54SJiri Olsa 		if (!stat(path, &st))
9954fbad54SJiri Olsa 			e->supported = found = true;
10054fbad54SJiri Olsa 	}
10154fbad54SJiri Olsa 
10254fbad54SJiri Olsa 	return found ? 0 : -ENOENT;
10354fbad54SJiri Olsa }
1040c877d75SJiri Olsa 
1050c877d75SJiri Olsa static const char * const tlb_access[] = {
1060c877d75SJiri Olsa 	"N/A",
1070c877d75SJiri Olsa 	"HIT",
1080c877d75SJiri Olsa 	"MISS",
1090c877d75SJiri Olsa 	"L1",
1100c877d75SJiri Olsa 	"L2",
1110c877d75SJiri Olsa 	"Walker",
1120c877d75SJiri Olsa 	"Fault",
1130c877d75SJiri Olsa };
1140c877d75SJiri Olsa 
115b1a5fbeaSJiri Olsa int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
1160c877d75SJiri Olsa {
1170c877d75SJiri Olsa 	size_t l = 0, i;
1180c877d75SJiri Olsa 	u64 m = PERF_MEM_TLB_NA;
1190c877d75SJiri Olsa 	u64 hit, miss;
1200c877d75SJiri Olsa 
1210c877d75SJiri Olsa 	sz -= 1; /* -1 for null termination */
1220c877d75SJiri Olsa 	out[0] = '\0';
1230c877d75SJiri Olsa 
1240c877d75SJiri Olsa 	if (mem_info)
1250c877d75SJiri Olsa 		m = mem_info->data_src.mem_dtlb;
1260c877d75SJiri Olsa 
1270c877d75SJiri Olsa 	hit = m & PERF_MEM_TLB_HIT;
1280c877d75SJiri Olsa 	miss = m & PERF_MEM_TLB_MISS;
1290c877d75SJiri Olsa 
1300c877d75SJiri Olsa 	/* already taken care of */
1310c877d75SJiri Olsa 	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
1320c877d75SJiri Olsa 
1330c877d75SJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
1340c877d75SJiri Olsa 		if (!(m & 0x1))
1350c877d75SJiri Olsa 			continue;
1360c877d75SJiri Olsa 		if (l) {
1370c877d75SJiri Olsa 			strcat(out, " or ");
1380c877d75SJiri Olsa 			l += 4;
1390c877d75SJiri Olsa 		}
140b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, tlb_access[i]);
1410c877d75SJiri Olsa 	}
1420c877d75SJiri Olsa 	if (*out == '\0')
143b1a5fbeaSJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
1440c877d75SJiri Olsa 	if (hit)
145b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, " hit");
1460c877d75SJiri Olsa 	if (miss)
147b1a5fbeaSJiri Olsa 		l += scnprintf(out + l, sz - l, " miss");
148b1a5fbeaSJiri Olsa 
149b1a5fbeaSJiri Olsa 	return l;
1500c877d75SJiri Olsa }
151071e9a1eSJiri Olsa 
152071e9a1eSJiri Olsa static const char * const mem_lvl[] = {
153071e9a1eSJiri Olsa 	"N/A",
154071e9a1eSJiri Olsa 	"HIT",
155071e9a1eSJiri Olsa 	"MISS",
156071e9a1eSJiri Olsa 	"L1",
157071e9a1eSJiri Olsa 	"LFB",
158071e9a1eSJiri Olsa 	"L2",
159071e9a1eSJiri Olsa 	"L3",
160071e9a1eSJiri Olsa 	"Local RAM",
161071e9a1eSJiri Olsa 	"Remote RAM (1 hop)",
162071e9a1eSJiri Olsa 	"Remote RAM (2 hops)",
163071e9a1eSJiri Olsa 	"Remote Cache (1 hop)",
164071e9a1eSJiri Olsa 	"Remote Cache (2 hops)",
165071e9a1eSJiri Olsa 	"I/O",
166071e9a1eSJiri Olsa 	"Uncached",
167071e9a1eSJiri Olsa };
168071e9a1eSJiri Olsa 
16996907563SJiri Olsa int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
170071e9a1eSJiri Olsa {
171071e9a1eSJiri Olsa 	size_t i, l = 0;
172071e9a1eSJiri Olsa 	u64 m =  PERF_MEM_LVL_NA;
173071e9a1eSJiri Olsa 	u64 hit, miss;
174071e9a1eSJiri Olsa 
175071e9a1eSJiri Olsa 	if (mem_info)
176071e9a1eSJiri Olsa 		m  = mem_info->data_src.mem_lvl;
177071e9a1eSJiri Olsa 
178071e9a1eSJiri Olsa 	sz -= 1; /* -1 for null termination */
179071e9a1eSJiri Olsa 	out[0] = '\0';
180071e9a1eSJiri Olsa 
181071e9a1eSJiri Olsa 	hit = m & PERF_MEM_LVL_HIT;
182071e9a1eSJiri Olsa 	miss = m & PERF_MEM_LVL_MISS;
183071e9a1eSJiri Olsa 
184071e9a1eSJiri Olsa 	/* already taken care of */
185071e9a1eSJiri Olsa 	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
186071e9a1eSJiri Olsa 
187071e9a1eSJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
188071e9a1eSJiri Olsa 		if (!(m & 0x1))
189071e9a1eSJiri Olsa 			continue;
190071e9a1eSJiri Olsa 		if (l) {
191071e9a1eSJiri Olsa 			strcat(out, " or ");
192071e9a1eSJiri Olsa 			l += 4;
193071e9a1eSJiri Olsa 		}
19496907563SJiri Olsa 		l += scnprintf(out + l, sz - l, mem_lvl[i]);
195071e9a1eSJiri Olsa 	}
196071e9a1eSJiri Olsa 	if (*out == '\0')
19796907563SJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
198071e9a1eSJiri Olsa 	if (hit)
19996907563SJiri Olsa 		l += scnprintf(out + l, sz - l, " hit");
200071e9a1eSJiri Olsa 	if (miss)
20196907563SJiri Olsa 		l += scnprintf(out + l, sz - l, " miss");
20296907563SJiri Olsa 
20396907563SJiri Olsa 	return l;
204071e9a1eSJiri Olsa }
2052c07af13SJiri Olsa 
2062c07af13SJiri Olsa static const char * const snoop_access[] = {
2072c07af13SJiri Olsa 	"N/A",
2082c07af13SJiri Olsa 	"None",
2092c07af13SJiri Olsa 	"Hit",
210166ebdd2SAndi Kleen 	"Miss",
2112c07af13SJiri Olsa 	"HitM",
2122c07af13SJiri Olsa };
2132c07af13SJiri Olsa 
214149d7507SJiri Olsa int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
2152c07af13SJiri Olsa {
2162c07af13SJiri Olsa 	size_t i, l = 0;
2172c07af13SJiri Olsa 	u64 m = PERF_MEM_SNOOP_NA;
2182c07af13SJiri Olsa 
2192c07af13SJiri Olsa 	sz -= 1; /* -1 for null termination */
2202c07af13SJiri Olsa 	out[0] = '\0';
2212c07af13SJiri Olsa 
2222c07af13SJiri Olsa 	if (mem_info)
2232c07af13SJiri Olsa 		m = mem_info->data_src.mem_snoop;
2242c07af13SJiri Olsa 
2252c07af13SJiri Olsa 	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
2262c07af13SJiri Olsa 		if (!(m & 0x1))
2272c07af13SJiri Olsa 			continue;
2282c07af13SJiri Olsa 		if (l) {
2292c07af13SJiri Olsa 			strcat(out, " or ");
2302c07af13SJiri Olsa 			l += 4;
2312c07af13SJiri Olsa 		}
232149d7507SJiri Olsa 		l += scnprintf(out + l, sz - l, snoop_access[i]);
2332c07af13SJiri Olsa 	}
2342c07af13SJiri Olsa 
2352c07af13SJiri Olsa 	if (*out == '\0')
236149d7507SJiri Olsa 		l += scnprintf(out, sz - l, "N/A");
237149d7507SJiri Olsa 
238149d7507SJiri Olsa 	return l;
2392c07af13SJiri Olsa }
24069a77275SJiri Olsa 
2418b0819c8SJiri Olsa int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
24269a77275SJiri Olsa {
24369a77275SJiri Olsa 	u64 mask = PERF_MEM_LOCK_NA;
2448b0819c8SJiri Olsa 	int l;
24569a77275SJiri Olsa 
24669a77275SJiri Olsa 	if (mem_info)
24769a77275SJiri Olsa 		mask = mem_info->data_src.mem_lock;
24869a77275SJiri Olsa 
24969a77275SJiri Olsa 	if (mask & PERF_MEM_LOCK_NA)
2508b0819c8SJiri Olsa 		l = scnprintf(out, sz, "N/A");
25169a77275SJiri Olsa 	else if (mask & PERF_MEM_LOCK_LOCKED)
2528b0819c8SJiri Olsa 		l = scnprintf(out, sz, "Yes");
25369a77275SJiri Olsa 	else
2548b0819c8SJiri Olsa 		l = scnprintf(out, sz, "No");
2558b0819c8SJiri Olsa 
2568b0819c8SJiri Olsa 	return l;
25769a77275SJiri Olsa }
258c19ac912SJiri Olsa 
259c19ac912SJiri Olsa int perf_script__meminfo_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
260c19ac912SJiri Olsa {
261c19ac912SJiri Olsa 	int i = 0;
262c19ac912SJiri Olsa 
263c19ac912SJiri Olsa 	i += perf_mem__lvl_scnprintf(out, sz, mem_info);
264c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|SNP ");
265c19ac912SJiri Olsa 	i += perf_mem__snp_scnprintf(out + i, sz - i, mem_info);
266c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|TLB ");
267c19ac912SJiri Olsa 	i += perf_mem__tlb_scnprintf(out + i, sz - i, mem_info);
268c19ac912SJiri Olsa 	i += scnprintf(out + i, sz - i, "|LCK ");
269c19ac912SJiri Olsa 	i += perf_mem__lck_scnprintf(out + i, sz - i, mem_info);
270c19ac912SJiri Olsa 
271c19ac912SJiri Olsa 	return i;
272c19ac912SJiri Olsa }
273aadddd68SJiri Olsa 
274aadddd68SJiri Olsa int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi)
275aadddd68SJiri Olsa {
276aadddd68SJiri Olsa 	union perf_mem_data_src *data_src = &mi->data_src;
277aadddd68SJiri Olsa 	u64 daddr  = mi->daddr.addr;
278aadddd68SJiri Olsa 	u64 op     = data_src->mem_op;
279aadddd68SJiri Olsa 	u64 lvl    = data_src->mem_lvl;
280aadddd68SJiri Olsa 	u64 snoop  = data_src->mem_snoop;
281aadddd68SJiri Olsa 	u64 lock   = data_src->mem_lock;
282aadddd68SJiri Olsa 	int err = 0;
283aadddd68SJiri Olsa 
284dba8ab93SJiri Olsa #define HITM_INC(__f)		\
285dba8ab93SJiri Olsa do {				\
286dba8ab93SJiri Olsa 	stats->__f++;		\
287dba8ab93SJiri Olsa 	stats->tot_hitm++;	\
288dba8ab93SJiri Olsa } while (0)
289dba8ab93SJiri Olsa 
290aadddd68SJiri Olsa #define P(a, b) PERF_MEM_##a##_##b
291aadddd68SJiri Olsa 
292aadddd68SJiri Olsa 	stats->nr_entries++;
293aadddd68SJiri Olsa 
294aadddd68SJiri Olsa 	if (lock & P(LOCK, LOCKED)) stats->locks++;
295aadddd68SJiri Olsa 
296aadddd68SJiri Olsa 	if (op & P(OP, LOAD)) {
297aadddd68SJiri Olsa 		/* load */
298aadddd68SJiri Olsa 		stats->load++;
299aadddd68SJiri Olsa 
300aadddd68SJiri Olsa 		if (!daddr) {
301aadddd68SJiri Olsa 			stats->ld_noadrs++;
302aadddd68SJiri Olsa 			return -1;
303aadddd68SJiri Olsa 		}
304aadddd68SJiri Olsa 
305aadddd68SJiri Olsa 		if (lvl & P(LVL, HIT)) {
306aadddd68SJiri Olsa 			if (lvl & P(LVL, UNC)) stats->ld_uncache++;
307aadddd68SJiri Olsa 			if (lvl & P(LVL, IO))  stats->ld_io++;
308aadddd68SJiri Olsa 			if (lvl & P(LVL, LFB)) stats->ld_fbhit++;
309aadddd68SJiri Olsa 			if (lvl & P(LVL, L1 )) stats->ld_l1hit++;
310aadddd68SJiri Olsa 			if (lvl & P(LVL, L2 )) stats->ld_l2hit++;
311aadddd68SJiri Olsa 			if (lvl & P(LVL, L3 )) {
312aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HITM))
313dba8ab93SJiri Olsa 					HITM_INC(lcl_hitm);
314aadddd68SJiri Olsa 				else
315aadddd68SJiri Olsa 					stats->ld_llchit++;
316aadddd68SJiri Olsa 			}
317aadddd68SJiri Olsa 
318aadddd68SJiri Olsa 			if (lvl & P(LVL, LOC_RAM)) {
319aadddd68SJiri Olsa 				stats->lcl_dram++;
320aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HIT))
321aadddd68SJiri Olsa 					stats->ld_shared++;
322aadddd68SJiri Olsa 				else
323aadddd68SJiri Olsa 					stats->ld_excl++;
324aadddd68SJiri Olsa 			}
325aadddd68SJiri Olsa 
326aadddd68SJiri Olsa 			if ((lvl & P(LVL, REM_RAM1)) ||
327aadddd68SJiri Olsa 			    (lvl & P(LVL, REM_RAM2))) {
328aadddd68SJiri Olsa 				stats->rmt_dram++;
329aadddd68SJiri Olsa 				if (snoop & P(SNOOP, HIT))
330aadddd68SJiri Olsa 					stats->ld_shared++;
331aadddd68SJiri Olsa 				else
332aadddd68SJiri Olsa 					stats->ld_excl++;
333aadddd68SJiri Olsa 			}
334aadddd68SJiri Olsa 		}
335aadddd68SJiri Olsa 
336aadddd68SJiri Olsa 		if ((lvl & P(LVL, REM_CCE1)) ||
337aadddd68SJiri Olsa 		    (lvl & P(LVL, REM_CCE2))) {
338aadddd68SJiri Olsa 			if (snoop & P(SNOOP, HIT))
339aadddd68SJiri Olsa 				stats->rmt_hit++;
340aadddd68SJiri Olsa 			else if (snoop & P(SNOOP, HITM))
341dba8ab93SJiri Olsa 				HITM_INC(rmt_hitm);
342aadddd68SJiri Olsa 		}
343aadddd68SJiri Olsa 
344aadddd68SJiri Olsa 		if ((lvl & P(LVL, MISS)))
345aadddd68SJiri Olsa 			stats->ld_miss++;
346aadddd68SJiri Olsa 
347aadddd68SJiri Olsa 	} else if (op & P(OP, STORE)) {
348aadddd68SJiri Olsa 		/* store */
349aadddd68SJiri Olsa 		stats->store++;
350aadddd68SJiri Olsa 
351aadddd68SJiri Olsa 		if (!daddr) {
352aadddd68SJiri Olsa 			stats->st_noadrs++;
353aadddd68SJiri Olsa 			return -1;
354aadddd68SJiri Olsa 		}
355aadddd68SJiri Olsa 
356aadddd68SJiri Olsa 		if (lvl & P(LVL, HIT)) {
357aadddd68SJiri Olsa 			if (lvl & P(LVL, UNC)) stats->st_uncache++;
358aadddd68SJiri Olsa 			if (lvl & P(LVL, L1 )) stats->st_l1hit++;
359aadddd68SJiri Olsa 		}
360aadddd68SJiri Olsa 		if (lvl & P(LVL, MISS))
361aadddd68SJiri Olsa 			if (lvl & P(LVL, L1)) stats->st_l1miss++;
362aadddd68SJiri Olsa 	} else {
363aadddd68SJiri Olsa 		/* unparsable data_src? */
364aadddd68SJiri Olsa 		stats->noparse++;
365aadddd68SJiri Olsa 		return -1;
366aadddd68SJiri Olsa 	}
367aadddd68SJiri Olsa 
368aadddd68SJiri Olsa 	if (!mi->daddr.map || !mi->iaddr.map) {
369aadddd68SJiri Olsa 		stats->nomap++;
370aadddd68SJiri Olsa 		return -1;
371aadddd68SJiri Olsa 	}
372aadddd68SJiri Olsa 
373aadddd68SJiri Olsa #undef P
374dba8ab93SJiri Olsa #undef HITM_INC
375aadddd68SJiri Olsa 	return err;
376aadddd68SJiri Olsa }
3770a9a24ccSJiri Olsa 
3780a9a24ccSJiri Olsa void c2c_add_stats(struct c2c_stats *stats, struct c2c_stats *add)
3790a9a24ccSJiri Olsa {
3800a9a24ccSJiri Olsa 	stats->nr_entries	+= add->nr_entries;
3810a9a24ccSJiri Olsa 
3820a9a24ccSJiri Olsa 	stats->locks		+= add->locks;
3830a9a24ccSJiri Olsa 	stats->store		+= add->store;
3840a9a24ccSJiri Olsa 	stats->st_uncache	+= add->st_uncache;
3850a9a24ccSJiri Olsa 	stats->st_noadrs	+= add->st_noadrs;
3860a9a24ccSJiri Olsa 	stats->st_l1hit		+= add->st_l1hit;
3870a9a24ccSJiri Olsa 	stats->st_l1miss	+= add->st_l1miss;
3880a9a24ccSJiri Olsa 	stats->load		+= add->load;
3890a9a24ccSJiri Olsa 	stats->ld_excl		+= add->ld_excl;
3900a9a24ccSJiri Olsa 	stats->ld_shared	+= add->ld_shared;
3910a9a24ccSJiri Olsa 	stats->ld_uncache	+= add->ld_uncache;
3920a9a24ccSJiri Olsa 	stats->ld_io		+= add->ld_io;
3930a9a24ccSJiri Olsa 	stats->ld_miss		+= add->ld_miss;
3940a9a24ccSJiri Olsa 	stats->ld_noadrs	+= add->ld_noadrs;
3950a9a24ccSJiri Olsa 	stats->ld_fbhit		+= add->ld_fbhit;
3960a9a24ccSJiri Olsa 	stats->ld_l1hit		+= add->ld_l1hit;
3970a9a24ccSJiri Olsa 	stats->ld_l2hit		+= add->ld_l2hit;
3980a9a24ccSJiri Olsa 	stats->ld_llchit	+= add->ld_llchit;
3990a9a24ccSJiri Olsa 	stats->lcl_hitm		+= add->lcl_hitm;
4000a9a24ccSJiri Olsa 	stats->rmt_hitm		+= add->rmt_hitm;
401dba8ab93SJiri Olsa 	stats->tot_hitm		+= add->tot_hitm;
4020a9a24ccSJiri Olsa 	stats->rmt_hit		+= add->rmt_hit;
4030a9a24ccSJiri Olsa 	stats->lcl_dram		+= add->lcl_dram;
4040a9a24ccSJiri Olsa 	stats->rmt_dram		+= add->rmt_dram;
4050a9a24ccSJiri Olsa 	stats->nomap		+= add->nomap;
4060a9a24ccSJiri Olsa 	stats->noparse		+= add->noparse;
4070a9a24ccSJiri Olsa }
408