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