Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf mem-info: Add reference count checking

Add reference count checking and switch 'struct mem_info' usage to use
accessor functions.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Li Dong <lidong@vivo.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Paran Lee <p4ranlee@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Sun Haiyong <sunhaiyong@loongson.cn>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Cc: Yicong Yang <yangyicong@hisilicon.com>
Link: https://lore.kernel.org/r/20240507183545.1236093-8-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
1a8c2e01 ad3003a6

+135 -88
+6 -6
tools/perf/builtin-c2c.c
··· 530 530 char buf[20]; 531 531 532 532 if (he->mem_info) 533 - addr = cl_address(he->mem_info->daddr.addr, chk_double_cl); 533 + addr = cl_address(mem_info__daddr(he->mem_info)->addr, chk_double_cl); 534 534 535 535 return scnprintf(hpp->buf, hpp->size, "%*s", width, HEX_STR(buf, addr)); 536 536 } ··· 568 568 char buf[20]; 569 569 570 570 if (he->mem_info) 571 - addr = cl_offset(he->mem_info->daddr.al_addr, chk_double_cl); 571 + addr = cl_offset(mem_info__daddr(he->mem_info)->al_addr, chk_double_cl); 572 572 573 573 return scnprintf(hpp->buf, hpp->size, "%*s", width, HEX_STR(buf, addr)); 574 574 } ··· 580 580 uint64_t l = 0, r = 0; 581 581 582 582 if (left->mem_info) 583 - l = cl_offset(left->mem_info->daddr.addr, chk_double_cl); 583 + l = cl_offset(mem_info__daddr(left->mem_info)->addr, chk_double_cl); 584 584 585 585 if (right->mem_info) 586 - r = cl_offset(right->mem_info->daddr.addr, chk_double_cl); 586 + r = cl_offset(mem_info__daddr(right->mem_info)->addr, chk_double_cl); 587 587 588 588 return (int64_t)(r - l); 589 589 } ··· 597 597 char buf[20]; 598 598 599 599 if (he->mem_info) 600 - addr = he->mem_info->iaddr.addr; 600 + addr = mem_info__iaddr(he->mem_info)->addr; 601 601 602 602 return scnprintf(hpp->buf, hpp->size, "%*s", width, HEX_STR(buf, addr)); 603 603 } ··· 2593 2593 he = cl_browser->he; 2594 2594 2595 2595 if (he->mem_info) 2596 - addr = cl_address(he->mem_info->daddr.addr, chk_double_cl); 2596 + addr = cl_address(mem_info__daddr(he->mem_info)->addr, chk_double_cl); 2597 2597 2598 2598 scnprintf(bf, size, "Cacheline 0x%lx", addr); 2599 2599 return 0;
+1 -1
tools/perf/builtin-report.c
··· 186 186 187 187 } else if (rep->mem_mode) { 188 188 mi = he->mem_info; 189 - err = addr_map_symbol__inc_samples(&mi->daddr, sample, evsel); 189 + err = addr_map_symbol__inc_samples(mem_info__daddr(mi), sample, evsel); 190 190 if (err) 191 191 goto out; 192 192
+8 -3
tools/perf/builtin-script.c
··· 2051 2051 2052 2052 static int data_src__fprintf(u64 data_src, FILE *fp) 2053 2053 { 2054 - struct mem_info mi = { .data_src.val = data_src }; 2054 + struct mem_info *mi = mem_info__new(); 2055 2055 char decode[100]; 2056 2056 char out[100]; 2057 2057 static int maxlen; 2058 2058 int len; 2059 2059 2060 - perf_script__meminfo_scnprintf(decode, 100, &mi); 2060 + if (!mi) 2061 + return -ENOMEM; 2062 + 2063 + mem_info__data_src(mi)->val = data_src; 2064 + perf_script__meminfo_scnprintf(decode, 100, mi); 2065 + mem_info__put(mi); 2061 2066 2062 2067 len = scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode); 2063 2068 if (maxlen < len) ··· 2503 2498 evsel = evlist__last(*pevlist); 2504 2499 2505 2500 if (!evsel->priv) { 2506 - if (scr->per_event_dump) { 2501 + if (scr->per_event_dump) { 2507 2502 evsel->priv = evsel_script__new(evsel, scr->session->data); 2508 2503 if (!evsel->priv) 2509 2504 return -ENOMEM;
+6 -4
tools/perf/tests/mem.c
··· 13 13 { 14 14 char out[100]; 15 15 char failure[100]; 16 - struct mem_info mi = { .data_src = data_src }; 17 - 16 + struct mem_info *mi = mem_info__new(); 18 17 int n; 19 18 20 - n = perf_mem__snp_scnprintf(out, sizeof out, &mi); 21 - n += perf_mem__lvl_scnprintf(out + n, sizeof out - n, &mi); 19 + TEST_ASSERT_VAL("Memory allocation failed", mi); 20 + *mem_info__data_src(mi) = data_src; 21 + n = perf_mem__snp_scnprintf(out, sizeof out, mi); 22 + n += perf_mem__lvl_scnprintf(out + n, sizeof out - n, mi); 23 + mem_info__put(mi); 22 24 scnprintf(failure, sizeof failure, "unexpected %s", out); 23 25 TEST_ASSERT_VAL(failure, !strcmp(string, out)); 24 26 return 0;
+14 -12
tools/perf/util/hist.c
··· 154 154 } 155 155 156 156 if (h->mem_info) { 157 - if (h->mem_info->daddr.ms.sym) { 158 - symlen = (int)h->mem_info->daddr.ms.sym->namelen + 4 157 + if (mem_info__daddr(h->mem_info)->ms.sym) { 158 + symlen = (int)mem_info__daddr(h->mem_info)->ms.sym->namelen + 4 159 159 + unresolved_col_width + 2; 160 160 hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, 161 161 symlen); ··· 169 169 symlen); 170 170 } 171 171 172 - if (h->mem_info->iaddr.ms.sym) { 173 - symlen = (int)h->mem_info->iaddr.ms.sym->namelen + 4 172 + if (mem_info__iaddr(h->mem_info)->ms.sym) { 173 + symlen = (int)mem_info__iaddr(h->mem_info)->ms.sym->namelen + 4 174 174 + unresolved_col_width + 2; 175 175 hists__new_col_len(hists, HISTC_MEM_IADDR_SYMBOL, 176 176 symlen); ··· 180 180 symlen); 181 181 } 182 182 183 - if (h->mem_info->daddr.ms.map) { 184 - symlen = dso__name_len(map__dso(h->mem_info->daddr.ms.map)); 183 + if (mem_info__daddr(h->mem_info)->ms.map) { 184 + symlen = dso__name_len(map__dso(mem_info__daddr(h->mem_info)->ms.map)); 185 185 hists__new_col_len(hists, HISTC_MEM_DADDR_DSO, 186 186 symlen); 187 187 } else { ··· 477 477 } 478 478 479 479 if (he->mem_info) { 480 - he->mem_info->iaddr.ms.map = map__get(he->mem_info->iaddr.ms.map); 481 - he->mem_info->daddr.ms.map = map__get(he->mem_info->daddr.ms.map); 480 + mem_info__iaddr(he->mem_info)->ms.map = 481 + map__get(mem_info__iaddr(he->mem_info)->ms.map); 482 + mem_info__daddr(he->mem_info)->ms.map = 483 + map__get(mem_info__daddr(he->mem_info)->ms.map); 482 484 } 483 485 484 486 if (hist_entry__has_callchains(he) && symbol_conf.use_callchain) ··· 528 526 zfree(&he->branch_info); 529 527 } 530 528 if (he->mem_info) { 531 - map_symbol__exit(&he->mem_info->iaddr.ms); 532 - map_symbol__exit(&he->mem_info->daddr.ms); 529 + map_symbol__exit(&mem_info__iaddr(he->mem_info)->ms); 530 + map_symbol__exit(&mem_info__daddr(he->mem_info)->ms); 533 531 } 534 532 err: 535 533 map_symbol__exit(&he->ms); ··· 1338 1336 } 1339 1337 1340 1338 if (he->mem_info) { 1341 - map_symbol__exit(&he->mem_info->iaddr.ms); 1342 - map_symbol__exit(&he->mem_info->daddr.ms); 1339 + map_symbol__exit(&mem_info__iaddr(he->mem_info)->ms); 1340 + map_symbol__exit(&mem_info__daddr(he->mem_info)->ms); 1343 1341 mem_info__zput(he->mem_info); 1344 1342 } 1345 1343
+3 -3
tools/perf/util/machine.c
··· 2013 2013 if (!mi) 2014 2014 return NULL; 2015 2015 2016 - ip__resolve_ams(al->thread, &mi->iaddr, sample->ip); 2017 - ip__resolve_data(al->thread, al->cpumode, &mi->daddr, 2016 + ip__resolve_ams(al->thread, mem_info__iaddr(mi), sample->ip); 2017 + ip__resolve_data(al->thread, al->cpumode, mem_info__daddr(mi), 2018 2018 sample->addr, sample->phys_addr, 2019 2019 sample->data_page_size); 2020 - mi->data_src.val = sample->data_src; 2020 + mem_info__data_src(mi)->val = sample->data_src; 2021 2021 2022 2022 return mi; 2023 2023 }
+10 -10
tools/perf/util/mem-events.c
··· 293 293 out[0] = '\0'; 294 294 295 295 if (mem_info) 296 - m = mem_info->data_src.mem_dtlb; 296 + m = mem_info__const_data_src(mem_info)->mem_dtlb; 297 297 298 298 hit = m & PERF_MEM_TLB_HIT; 299 299 miss = m & PERF_MEM_TLB_MISS; ··· 367 367 int l; 368 368 369 369 if (mem_info) 370 - op = mem_info->data_src.mem_op; 370 + op = mem_info__const_data_src(mem_info)->mem_op; 371 371 372 372 if (op & PERF_MEM_OP_NA) 373 373 l = scnprintf(out, sz, "N/A"); ··· 400 400 if (!mem_info) 401 401 goto na; 402 402 403 - data_src = mem_info->data_src; 403 + data_src = *mem_info__const_data_src(mem_info); 404 404 405 405 if (data_src.mem_lvl & PERF_MEM_LVL_HIT) 406 406 memcpy(hit_miss, "hit", 3); ··· 476 476 out[0] = '\0'; 477 477 478 478 if (mem_info) 479 - m = mem_info->data_src.mem_snoop; 479 + m = mem_info__const_data_src(mem_info)->mem_snoop; 480 480 481 481 for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) { 482 482 if (!(m & 0x1)) ··· 490 490 491 491 m = 0; 492 492 if (mem_info) 493 - m = mem_info->data_src.mem_snoopx; 493 + m = mem_info__const_data_src(mem_info)->mem_snoopx; 494 494 495 495 for (i = 0; m && i < ARRAY_SIZE(snoopx_access); i++, m >>= 1) { 496 496 if (!(m & 0x1)) ··· 515 515 int l; 516 516 517 517 if (mem_info) 518 - mask = mem_info->data_src.mem_lock; 518 + mask = mem_info__const_data_src(mem_info)->mem_lock; 519 519 520 520 if (mask & PERF_MEM_LOCK_NA) 521 521 l = scnprintf(out, sz, "N/A"); ··· 536 536 out[0] = '\0'; 537 537 538 538 if (mem_info) 539 - mask = mem_info->data_src.mem_blk; 539 + mask = mem_info__const_data_src(mem_info)->mem_blk; 540 540 541 541 if (!mask || (mask & PERF_MEM_BLK_NA)) { 542 542 l += scnprintf(out + l, sz - l, " N/A"); ··· 572 572 573 573 int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi) 574 574 { 575 - union perf_mem_data_src *data_src = &mi->data_src; 576 - u64 daddr = mi->daddr.addr; 575 + union perf_mem_data_src *data_src = mem_info__data_src(mi); 576 + u64 daddr = mem_info__daddr(mi)->addr; 577 577 u64 op = data_src->mem_op; 578 578 u64 lvl = data_src->mem_lvl; 579 579 u64 snoop = data_src->mem_snoop; ··· 700 700 return -1; 701 701 } 702 702 703 - if (!mi->daddr.ms.map || !mi->iaddr.ms.map) { 703 + if (!mem_info__daddr(mi)->ms.map || !mem_info__iaddr(mi)->ms.map) { 704 704 stats->nomap++; 705 705 return -1; 706 706 }
+18 -11
tools/perf/util/mem-info.c
··· 4 4 5 5 struct mem_info *mem_info__get(struct mem_info *mi) 6 6 { 7 - if (mi) 8 - refcount_inc(&mi->refcnt); 9 - return mi; 7 + struct mem_info *result; 8 + 9 + if (RC_CHK_GET(result, mi)) 10 + refcount_inc(mem_info__refcnt(mi)); 11 + 12 + return result; 10 13 } 11 14 12 15 void mem_info__put(struct mem_info *mi) 13 16 { 14 - if (mi && refcount_dec_and_test(&mi->refcnt)) { 15 - addr_map_symbol__exit(&mi->iaddr); 16 - addr_map_symbol__exit(&mi->daddr); 17 - free(mi); 17 + if (mi && refcount_dec_and_test(mem_info__refcnt(mi))) { 18 + addr_map_symbol__exit(mem_info__iaddr(mi)); 19 + addr_map_symbol__exit(mem_info__daddr(mi)); 20 + RC_CHK_FREE(mi); 21 + } else { 22 + RC_CHK_PUT(mi); 18 23 } 19 24 } 20 25 21 26 struct mem_info *mem_info__new(void) 22 27 { 23 - struct mem_info *mi = zalloc(sizeof(*mi)); 28 + struct mem_info *result = NULL; 29 + RC_STRUCT(mem_info) *mi = zalloc(sizeof(*mi)); 24 30 25 - if (mi) 26 - refcount_set(&mi->refcnt, 1); 27 - return mi; 31 + if (ADD_RC_CHK(result, mi)) 32 + refcount_set(mem_info__refcnt(result), 1); 33 + 34 + return result; 28 35 }
+27 -1
tools/perf/util/mem-info.h
··· 4 4 5 5 #include <linux/refcount.h> 6 6 #include <linux/perf_event.h> 7 + #include <internal/rc_check.h> 7 8 #include "map_symbol.h" 8 9 9 - struct mem_info { 10 + DECLARE_RC_STRUCT(mem_info) { 10 11 struct addr_map_symbol iaddr; 11 12 struct addr_map_symbol daddr; 12 13 union perf_mem_data_src data_src; ··· 25 24 } 26 25 27 26 #define mem_info__zput(mi) __mem_info__zput(&mi) 27 + 28 + static inline struct addr_map_symbol *mem_info__iaddr(struct mem_info *mi) 29 + { 30 + return &RC_CHK_ACCESS(mi)->iaddr; 31 + } 32 + 33 + static inline struct addr_map_symbol *mem_info__daddr(struct mem_info *mi) 34 + { 35 + return &RC_CHK_ACCESS(mi)->daddr; 36 + } 37 + 38 + static inline union perf_mem_data_src *mem_info__data_src(struct mem_info *mi) 39 + { 40 + return &RC_CHK_ACCESS(mi)->data_src; 41 + } 42 + 43 + static inline const union perf_mem_data_src *mem_info__const_data_src(const struct mem_info *mi) 44 + { 45 + return &RC_CHK_ACCESS(mi)->data_src; 46 + } 47 + 48 + static inline refcount_t *mem_info__refcnt(struct mem_info *mi) 49 + { 50 + return &RC_CHK_ACCESS(mi)->refcnt; 51 + } 28 52 29 53 #endif /* __PERF_MEM_INFO_H */
+8 -3
tools/perf/util/scripting-engines/trace-event-python.c
··· 721 721 } 722 722 723 723 static void set_sample_datasrc_in_dict(PyObject *dict, 724 - struct perf_sample *sample) 724 + struct perf_sample *sample) 725 725 { 726 - struct mem_info mi = { .data_src.val = sample->data_src }; 726 + struct mem_info *mi = mem_info__new(); 727 727 char decode[100]; 728 + 729 + if (!mi) 730 + Py_FatalError("couldn't create mem-info"); 728 731 729 732 pydict_set_item_string_decref(dict, "datasrc", 730 733 PyLong_FromUnsignedLongLong(sample->data_src)); 731 734 732 - perf_script__meminfo_scnprintf(decode, 100, &mi); 735 + mem_info__data_src(mi)->val = sample->data_src; 736 + perf_script__meminfo_scnprintf(decode, 100, mi); 737 + mem_info__put(mi); 733 738 734 739 pydict_set_item_string_decref(dict, "datasrc_decode", 735 740 _PyUnicode_FromString(decode));
+34 -34
tools/perf/util/sort.c
··· 1365 1365 uint64_t l = 0, r = 0; 1366 1366 1367 1367 if (left->mem_info) 1368 - l = left->mem_info->daddr.addr; 1368 + l = mem_info__daddr(left->mem_info)->addr; 1369 1369 if (right->mem_info) 1370 - r = right->mem_info->daddr.addr; 1370 + r = mem_info__daddr(right->mem_info)->addr; 1371 1371 1372 1372 return (int64_t)(r - l); 1373 1373 } ··· 1379 1379 struct map_symbol *ms = NULL; 1380 1380 1381 1381 if (he->mem_info) { 1382 - addr = he->mem_info->daddr.addr; 1383 - ms = &he->mem_info->daddr.ms; 1382 + addr = mem_info__daddr(he->mem_info)->addr; 1383 + ms = &mem_info__daddr(he->mem_info)->ms; 1384 1384 } 1385 1385 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); 1386 1386 } ··· 1391 1391 uint64_t l = 0, r = 0; 1392 1392 1393 1393 if (left->mem_info) 1394 - l = left->mem_info->iaddr.addr; 1394 + l = mem_info__iaddr(left->mem_info)->addr; 1395 1395 if (right->mem_info) 1396 - r = right->mem_info->iaddr.addr; 1396 + r = mem_info__iaddr(right->mem_info)->addr; 1397 1397 1398 1398 return (int64_t)(r - l); 1399 1399 } ··· 1405 1405 struct map_symbol *ms = NULL; 1406 1406 1407 1407 if (he->mem_info) { 1408 - addr = he->mem_info->iaddr.addr; 1409 - ms = &he->mem_info->iaddr.ms; 1408 + addr = mem_info__iaddr(he->mem_info)->addr; 1409 + ms = &mem_info__iaddr(he->mem_info)->ms; 1410 1410 } 1411 1411 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); 1412 1412 } ··· 1418 1418 struct map *map_r = NULL; 1419 1419 1420 1420 if (left->mem_info) 1421 - map_l = left->mem_info->daddr.ms.map; 1421 + map_l = mem_info__daddr(left->mem_info)->ms.map; 1422 1422 if (right->mem_info) 1423 - map_r = right->mem_info->daddr.ms.map; 1423 + map_r = mem_info__daddr(right->mem_info)->ms.map; 1424 1424 1425 1425 return _sort__dso_cmp(map_l, map_r); 1426 1426 } ··· 1431 1431 struct map *map = NULL; 1432 1432 1433 1433 if (he->mem_info) 1434 - map = he->mem_info->daddr.ms.map; 1434 + map = mem_info__daddr(he->mem_info)->ms.map; 1435 1435 1436 1436 return _hist_entry__dso_snprintf(map, bf, size, width); 1437 1437 } ··· 1443 1443 union perf_mem_data_src data_src_r; 1444 1444 1445 1445 if (left->mem_info) 1446 - data_src_l = left->mem_info->data_src; 1446 + data_src_l = *mem_info__data_src(left->mem_info); 1447 1447 else 1448 1448 data_src_l.mem_lock = PERF_MEM_LOCK_NA; 1449 1449 1450 1450 if (right->mem_info) 1451 - data_src_r = right->mem_info->data_src; 1451 + data_src_r = *mem_info__data_src(right->mem_info); 1452 1452 else 1453 1453 data_src_r.mem_lock = PERF_MEM_LOCK_NA; 1454 1454 ··· 1471 1471 union perf_mem_data_src data_src_r; 1472 1472 1473 1473 if (left->mem_info) 1474 - data_src_l = left->mem_info->data_src; 1474 + data_src_l = *mem_info__data_src(left->mem_info); 1475 1475 else 1476 1476 data_src_l.mem_dtlb = PERF_MEM_TLB_NA; 1477 1477 1478 1478 if (right->mem_info) 1479 - data_src_r = right->mem_info->data_src; 1479 + data_src_r = *mem_info__data_src(right->mem_info); 1480 1480 else 1481 1481 data_src_r.mem_dtlb = PERF_MEM_TLB_NA; 1482 1482 ··· 1499 1499 union perf_mem_data_src data_src_r; 1500 1500 1501 1501 if (left->mem_info) 1502 - data_src_l = left->mem_info->data_src; 1502 + data_src_l = *mem_info__data_src(left->mem_info); 1503 1503 else 1504 1504 data_src_l.mem_lvl = PERF_MEM_LVL_NA; 1505 1505 1506 1506 if (right->mem_info) 1507 - data_src_r = right->mem_info->data_src; 1507 + data_src_r = *mem_info__data_src(right->mem_info); 1508 1508 else 1509 1509 data_src_r.mem_lvl = PERF_MEM_LVL_NA; 1510 1510 ··· 1527 1527 union perf_mem_data_src data_src_r; 1528 1528 1529 1529 if (left->mem_info) 1530 - data_src_l = left->mem_info->data_src; 1530 + data_src_l = *mem_info__data_src(left->mem_info); 1531 1531 else 1532 1532 data_src_l.mem_snoop = PERF_MEM_SNOOP_NA; 1533 1533 1534 1534 if (right->mem_info) 1535 - data_src_r = right->mem_info->data_src; 1535 + data_src_r = *mem_info__data_src(right->mem_info); 1536 1536 else 1537 1537 data_src_r.mem_snoop = PERF_MEM_SNOOP_NA; 1538 1538 ··· 1563 1563 if (left->cpumode > right->cpumode) return -1; 1564 1564 if (left->cpumode < right->cpumode) return 1; 1565 1565 1566 - l_map = left->mem_info->daddr.ms.map; 1567 - r_map = right->mem_info->daddr.ms.map; 1566 + l_map = mem_info__daddr(left->mem_info)->ms.map; 1567 + r_map = mem_info__daddr(right->mem_info)->ms.map; 1568 1568 1569 1569 /* if both are NULL, jump to sort on al_addr instead */ 1570 1570 if (!l_map && !r_map) ··· 1599 1599 1600 1600 addr: 1601 1601 /* al_addr does all the right addr - start + offset calculations */ 1602 - l = cl_address(left->mem_info->daddr.al_addr, chk_double_cl); 1603 - r = cl_address(right->mem_info->daddr.al_addr, chk_double_cl); 1602 + l = cl_address(mem_info__daddr(left->mem_info)->al_addr, chk_double_cl); 1603 + r = cl_address(mem_info__daddr(right->mem_info)->al_addr, chk_double_cl); 1604 1604 1605 1605 if (l > r) return -1; 1606 1606 if (l < r) return 1; ··· 1617 1617 char level = he->level; 1618 1618 1619 1619 if (he->mem_info) { 1620 - struct map *map = he->mem_info->daddr.ms.map; 1620 + struct map *map = mem_info__daddr(he->mem_info)->ms.map; 1621 1621 struct dso *dso = map ? map__dso(map) : NULL; 1622 1622 1623 - addr = cl_address(he->mem_info->daddr.al_addr, chk_double_cl); 1624 - ms = &he->mem_info->daddr.ms; 1623 + addr = cl_address(mem_info__daddr(he->mem_info)->al_addr, chk_double_cl); 1624 + ms = &mem_info__daddr(he->mem_info)->ms; 1625 1625 1626 1626 /* print [s] for shared data mmaps */ 1627 1627 if ((he->cpumode != PERF_RECORD_MISC_KERNEL) && ··· 1806 1806 union perf_mem_data_src data_src_r; 1807 1807 1808 1808 if (left->mem_info) 1809 - data_src_l = left->mem_info->data_src; 1809 + data_src_l = *mem_info__data_src(left->mem_info); 1810 1810 else 1811 1811 data_src_l.mem_blk = PERF_MEM_BLK_NA; 1812 1812 1813 1813 if (right->mem_info) 1814 - data_src_r = right->mem_info->data_src; 1814 + data_src_r = *mem_info__data_src(right->mem_info); 1815 1815 else 1816 1816 data_src_r.mem_blk = PERF_MEM_BLK_NA; 1817 1817 ··· 1840 1840 uint64_t l = 0, r = 0; 1841 1841 1842 1842 if (left->mem_info) 1843 - l = left->mem_info->daddr.phys_addr; 1843 + l = mem_info__daddr(left->mem_info)->phys_addr; 1844 1844 if (right->mem_info) 1845 - r = right->mem_info->daddr.phys_addr; 1845 + r = mem_info__daddr(right->mem_info)->phys_addr; 1846 1846 1847 1847 return (int64_t)(r - l); 1848 1848 } ··· 1854 1854 size_t ret = 0; 1855 1855 size_t len = BITS_PER_LONG / 4; 1856 1856 1857 - addr = he->mem_info->daddr.phys_addr; 1857 + addr = mem_info__daddr(he->mem_info)->phys_addr; 1858 1858 1859 1859 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", he->level); 1860 1860 ··· 1881 1881 uint64_t l = 0, r = 0; 1882 1882 1883 1883 if (left->mem_info) 1884 - l = left->mem_info->daddr.data_page_size; 1884 + l = mem_info__daddr(left->mem_info)->data_page_size; 1885 1885 if (right->mem_info) 1886 - r = right->mem_info->daddr.data_page_size; 1886 + r = mem_info__daddr(right->mem_info)->data_page_size; 1887 1887 1888 1888 return (int64_t)(r - l); 1889 1889 } ··· 1894 1894 char str[PAGE_SIZE_NAME_LEN]; 1895 1895 1896 1896 return repsep_snprintf(bf, size, "%-*s", width, 1897 - get_page_size_name(he->mem_info->daddr.data_page_size, str)); 1897 + get_page_size_name(mem_info__daddr(he->mem_info)->data_page_size, str)); 1898 1898 } 1899 1899 1900 1900 struct sort_entry sort_mem_data_page_size = {