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