mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
perf mem-info: Move mem-info out of mem-events and symbol
Move mem-info to its own header rather than having it split between mem-events and symbol. 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-7-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
13ca628716
commit
ad3003a65a
@ -38,6 +38,7 @@
|
|||||||
#include "ui/browsers/hists.h"
|
#include "ui/browsers/hists.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "mem2node.h"
|
#include "mem2node.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "ui/progress.h"
|
#include "ui/progress.h"
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "util/evsel.h"
|
#include "util/evsel.h"
|
||||||
#include "util/evswitch.h"
|
#include "util/evswitch.h"
|
||||||
#include "util/header.h"
|
#include "util/header.h"
|
||||||
|
#include "util/mem-info.h"
|
||||||
#include "util/session.h"
|
#include "util/session.h"
|
||||||
#include "util/srcline.h"
|
#include "util/srcline.h"
|
||||||
#include "util/tool.h"
|
#include "util/tool.h"
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "util/time-utils.h"
|
#include "util/time-utils.h"
|
||||||
#include "util/path.h"
|
#include "util/path.h"
|
||||||
#include "util/event.h"
|
#include "util/event.h"
|
||||||
|
#include "util/mem-info.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "print_binary.h"
|
#include "print_binary.h"
|
||||||
#include "print_insn.h"
|
#include "print_insn.h"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include "util/map_symbol.h"
|
#include "util/map_symbol.h"
|
||||||
#include "util/mem-events.h"
|
#include "util/mem-events.h"
|
||||||
|
#include "util/mem-info.h"
|
||||||
#include "util/symbol.h"
|
#include "util/symbol.h"
|
||||||
#include "linux/perf_event.h"
|
#include "linux/perf_event.h"
|
||||||
#include "util/debug.h"
|
#include "util/debug.h"
|
||||||
|
@ -141,6 +141,7 @@ perf-y += term.o
|
|||||||
perf-y += help-unknown-cmd.o
|
perf-y += help-unknown-cmd.o
|
||||||
perf-y += dlfilter.o
|
perf-y += dlfilter.o
|
||||||
perf-y += mem-events.o
|
perf-y += mem-events.o
|
||||||
|
perf-y += mem-info.o
|
||||||
perf-y += vsprintf.o
|
perf-y += vsprintf.o
|
||||||
perf-y += units.o
|
perf-y += units.o
|
||||||
perf-y += time-utils.o
|
perf-y += time-utils.o
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "map_symbol.h"
|
#include "map_symbol.h"
|
||||||
#include "branch.h"
|
#include "branch.h"
|
||||||
#include "mem-events.h"
|
#include "mem-events.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
#include "namespaces.h"
|
#include "namespaces.h"
|
||||||
#include "cgroup.h"
|
#include "cgroup.h"
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "map_symbol.h"
|
#include "map_symbol.h"
|
||||||
#include "branch.h"
|
#include "branch.h"
|
||||||
#include "mem-events.h"
|
#include "mem-events.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "srcline.h"
|
#include "srcline.h"
|
||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
|
@ -10,7 +10,9 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include "map_symbol.h"
|
#include "map_symbol.h"
|
||||||
#include "mem-events.h"
|
#include "mem-events.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "evsel.h"
|
||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#include "pmus.h"
|
#include "pmus.h"
|
||||||
@ -281,7 +283,7 @@ static const char * const tlb_access[] = {
|
|||||||
"Fault",
|
"Fault",
|
||||||
};
|
};
|
||||||
|
|
||||||
int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_mem__tlb_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
size_t l = 0, i;
|
size_t l = 0, i;
|
||||||
u64 m = PERF_MEM_TLB_NA;
|
u64 m = PERF_MEM_TLB_NA;
|
||||||
@ -359,7 +361,7 @@ static const char * const mem_hops[] = {
|
|||||||
"board",
|
"board",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int perf_mem__op_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
static int perf_mem__op_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
u64 op = PERF_MEM_LOCK_NA;
|
u64 op = PERF_MEM_LOCK_NA;
|
||||||
int l;
|
int l;
|
||||||
@ -383,7 +385,7 @@ static int perf_mem__op_scnprintf(char *out, size_t sz, struct mem_info *mem_inf
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_mem__lvl_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
union perf_mem_data_src data_src;
|
union perf_mem_data_src data_src;
|
||||||
int printed = 0;
|
int printed = 0;
|
||||||
@ -465,7 +467,7 @@ static const char * const snoopx_access[] = {
|
|||||||
"Peer",
|
"Peer",
|
||||||
};
|
};
|
||||||
|
|
||||||
int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_mem__snp_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
size_t i, l = 0;
|
size_t i, l = 0;
|
||||||
u64 m = PERF_MEM_SNOOP_NA;
|
u64 m = PERF_MEM_SNOOP_NA;
|
||||||
@ -507,7 +509,7 @@ int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_mem__lck_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
u64 mask = PERF_MEM_LOCK_NA;
|
u64 mask = PERF_MEM_LOCK_NA;
|
||||||
int l;
|
int l;
|
||||||
@ -525,7 +527,7 @@ int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_mem__blk_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_mem__blk_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
size_t l = 0;
|
size_t l = 0;
|
||||||
u64 mask = PERF_MEM_BLK_NA;
|
u64 mask = PERF_MEM_BLK_NA;
|
||||||
@ -548,7 +550,7 @@ int perf_mem__blk_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_script__meminfo_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
int perf_script__meminfo_scnprintf(char *out, size_t sz, const struct mem_info *mem_info)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
@ -3,13 +3,7 @@
|
|||||||
#define __PERF_MEM_EVENTS_H
|
#define __PERF_MEM_EVENTS_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/refcount.h>
|
|
||||||
#include <linux/perf_event.h>
|
|
||||||
#include "stat.h"
|
|
||||||
#include "evsel.h"
|
|
||||||
|
|
||||||
struct perf_mem_event {
|
struct perf_mem_event {
|
||||||
bool record;
|
bool record;
|
||||||
@ -21,13 +15,6 @@ struct perf_mem_event {
|
|||||||
const char *event_name;
|
const char *event_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mem_info {
|
|
||||||
struct addr_map_symbol iaddr;
|
|
||||||
struct addr_map_symbol daddr;
|
|
||||||
union perf_mem_data_src data_src;
|
|
||||||
refcount_t refcnt;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PERF_MEM_EVENTS__LOAD,
|
PERF_MEM_EVENTS__LOAD,
|
||||||
PERF_MEM_EVENTS__STORE,
|
PERF_MEM_EVENTS__STORE,
|
||||||
@ -35,6 +22,10 @@ enum {
|
|||||||
PERF_MEM_EVENTS__MAX,
|
PERF_MEM_EVENTS__MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct evsel;
|
||||||
|
struct mem_info;
|
||||||
|
struct perf_pmu;
|
||||||
|
|
||||||
extern unsigned int perf_mem_events__loads_ldlat;
|
extern unsigned int perf_mem_events__loads_ldlat;
|
||||||
extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
|
extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
|
||||||
|
|
||||||
@ -49,13 +40,13 @@ bool is_mem_loads_aux_event(struct evsel *leader);
|
|||||||
void perf_pmu__mem_events_list(struct perf_pmu *pmu);
|
void perf_pmu__mem_events_list(struct perf_pmu *pmu);
|
||||||
int perf_mem_events__record_args(const char **rec_argv, int *argv_nr);
|
int perf_mem_events__record_args(const char **rec_argv, int *argv_nr);
|
||||||
|
|
||||||
int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
int perf_mem__tlb_scnprintf(char *out, size_t sz, const struct mem_info *mem_info);
|
||||||
int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
int perf_mem__lvl_scnprintf(char *out, size_t sz, const struct mem_info *mem_info);
|
||||||
int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
int perf_mem__snp_scnprintf(char *out, size_t sz, const struct mem_info *mem_info);
|
||||||
int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
int perf_mem__lck_scnprintf(char *out, size_t sz, const struct mem_info *mem_info);
|
||||||
int perf_mem__blk_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
int perf_mem__blk_scnprintf(char *out, size_t sz, const struct mem_info *mem_info);
|
||||||
|
|
||||||
int perf_script__meminfo_scnprintf(char *bf, size_t size, struct mem_info *mem_info);
|
int perf_script__meminfo_scnprintf(char *bf, size_t size, const struct mem_info *mem_info);
|
||||||
|
|
||||||
struct c2c_stats {
|
struct c2c_stats {
|
||||||
u32 nr_entries;
|
u32 nr_entries;
|
||||||
|
28
tools/perf/util/mem-info.c
Normal file
28
tools/perf/util/mem-info.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include <linux/zalloc.h>
|
||||||
|
#include "mem-info.h"
|
||||||
|
|
||||||
|
struct mem_info *mem_info__get(struct mem_info *mi)
|
||||||
|
{
|
||||||
|
if (mi)
|
||||||
|
refcount_inc(&mi->refcnt);
|
||||||
|
return mi;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_info__put(struct mem_info *mi)
|
||||||
|
{
|
||||||
|
if (mi && refcount_dec_and_test(&mi->refcnt)) {
|
||||||
|
addr_map_symbol__exit(&mi->iaddr);
|
||||||
|
addr_map_symbol__exit(&mi->daddr);
|
||||||
|
free(mi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct mem_info *mem_info__new(void)
|
||||||
|
{
|
||||||
|
struct mem_info *mi = zalloc(sizeof(*mi));
|
||||||
|
|
||||||
|
if (mi)
|
||||||
|
refcount_set(&mi->refcnt, 1);
|
||||||
|
return mi;
|
||||||
|
}
|
28
tools/perf/util/mem-info.h
Normal file
28
tools/perf/util/mem-info.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef __PERF_MEM_INFO_H
|
||||||
|
#define __PERF_MEM_INFO_H
|
||||||
|
|
||||||
|
#include <linux/refcount.h>
|
||||||
|
#include <linux/perf_event.h>
|
||||||
|
#include "map_symbol.h"
|
||||||
|
|
||||||
|
struct mem_info {
|
||||||
|
struct addr_map_symbol iaddr;
|
||||||
|
struct addr_map_symbol daddr;
|
||||||
|
union perf_mem_data_src data_src;
|
||||||
|
refcount_t refcnt;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mem_info *mem_info__new(void);
|
||||||
|
struct mem_info *mem_info__get(struct mem_info *mi);
|
||||||
|
void mem_info__put(struct mem_info *mi);
|
||||||
|
|
||||||
|
static inline void __mem_info__zput(struct mem_info **mi)
|
||||||
|
{
|
||||||
|
mem_info__put(*mi);
|
||||||
|
*mi = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define mem_info__zput(mi) __mem_info__zput(&mi)
|
||||||
|
|
||||||
|
#endif /* __PERF_MEM_INFO_H */
|
@ -45,6 +45,7 @@
|
|||||||
#include "../thread.h"
|
#include "../thread.h"
|
||||||
#include "../comm.h"
|
#include "../comm.h"
|
||||||
#include "../machine.h"
|
#include "../machine.h"
|
||||||
|
#include "../mem-info.h"
|
||||||
#include "../db-export.h"
|
#include "../db-export.h"
|
||||||
#include "../thread-stack.h"
|
#include "../thread-stack.h"
|
||||||
#include "../trace-event.h"
|
#include "../trace-event.h"
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "strlist.h"
|
#include "strlist.h"
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "mem-events.h"
|
#include "mem-events.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "annotate.h"
|
#include "annotate.h"
|
||||||
#include "annotate-data.h"
|
#include "annotate-data.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
#include "map_symbol.h"
|
#include "map_symbol.h"
|
||||||
#include "mem-events.h"
|
#include "mem-events.h"
|
||||||
|
#include "mem-info.h"
|
||||||
#include "symsrc.h"
|
#include "symsrc.h"
|
||||||
#include "strlist.h"
|
#include "strlist.h"
|
||||||
#include "intlist.h"
|
#include "intlist.h"
|
||||||
@ -2570,31 +2571,6 @@ int symbol__config_symfs(const struct option *opt __maybe_unused,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mem_info *mem_info__get(struct mem_info *mi)
|
|
||||||
{
|
|
||||||
if (mi)
|
|
||||||
refcount_inc(&mi->refcnt);
|
|
||||||
return mi;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mem_info__put(struct mem_info *mi)
|
|
||||||
{
|
|
||||||
if (mi && refcount_dec_and_test(&mi->refcnt)) {
|
|
||||||
addr_map_symbol__exit(&mi->iaddr);
|
|
||||||
addr_map_symbol__exit(&mi->daddr);
|
|
||||||
free(mi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mem_info *mem_info__new(void)
|
|
||||||
{
|
|
||||||
struct mem_info *mi = zalloc(sizeof(*mi));
|
|
||||||
|
|
||||||
if (mi)
|
|
||||||
refcount_set(&mi->refcnt, 1);
|
|
||||||
return mi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checks that user supplied symbol kernel files are accessible because
|
* Checks that user supplied symbol kernel files are accessible because
|
||||||
* the default mechanism for accessing elf files fails silently. i.e. if
|
* the default mechanism for accessing elf files fails silently. i.e. if
|
||||||
|
@ -268,18 +268,6 @@ enum {
|
|||||||
SDT_NOTE_IDX_REFCTR,
|
SDT_NOTE_IDX_REFCTR,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mem_info *mem_info__new(void);
|
|
||||||
struct mem_info *mem_info__get(struct mem_info *mi);
|
|
||||||
void mem_info__put(struct mem_info *mi);
|
|
||||||
|
|
||||||
static inline void __mem_info__zput(struct mem_info **mi)
|
|
||||||
{
|
|
||||||
mem_info__put(*mi);
|
|
||||||
*mi = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define mem_info__zput(mi) __mem_info__zput(&mi)
|
|
||||||
|
|
||||||
int symbol__validate_sym_arguments(void);
|
int symbol__validate_sym_arguments(void);
|
||||||
|
|
||||||
#endif /* __PERF_SYMBOL */
|
#endif /* __PERF_SYMBOL */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user