mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +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 "thread.h"
|
||||
#include "mem2node.h"
|
||||
#include "mem-info.h"
|
||||
#include "symbol.h"
|
||||
#include "ui/ui.h"
|
||||
#include "ui/progress.h"
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "util/evsel.h"
|
||||
#include "util/evswitch.h"
|
||||
#include "util/header.h"
|
||||
#include "util/mem-info.h"
|
||||
#include "util/session.h"
|
||||
#include "util/srcline.h"
|
||||
#include "util/tool.h"
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "util/time-utils.h"
|
||||
#include "util/path.h"
|
||||
#include "util/event.h"
|
||||
#include "util/mem-info.h"
|
||||
#include "ui/ui.h"
|
||||
#include "print_binary.h"
|
||||
#include "print_insn.h"
|
||||
|
@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "util/map_symbol.h"
|
||||
#include "util/mem-events.h"
|
||||
#include "util/mem-info.h"
|
||||
#include "util/symbol.h"
|
||||
#include "linux/perf_event.h"
|
||||
#include "util/debug.h"
|
||||
|
@ -141,6 +141,7 @@ perf-y += term.o
|
||||
perf-y += help-unknown-cmd.o
|
||||
perf-y += dlfilter.o
|
||||
perf-y += mem-events.o
|
||||
perf-y += mem-info.o
|
||||
perf-y += vsprintf.o
|
||||
perf-y += units.o
|
||||
perf-y += time-utils.o
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "map_symbol.h"
|
||||
#include "branch.h"
|
||||
#include "mem-events.h"
|
||||
#include "mem-info.h"
|
||||
#include "session.h"
|
||||
#include "namespaces.h"
|
||||
#include "cgroup.h"
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "map_symbol.h"
|
||||
#include "branch.h"
|
||||
#include "mem-events.h"
|
||||
#include "mem-info.h"
|
||||
#include "path.h"
|
||||
#include "srcline.h"
|
||||
#include "symbol.h"
|
||||
|
@ -10,7 +10,9 @@
|
||||
#include <linux/kernel.h>
|
||||
#include "map_symbol.h"
|
||||
#include "mem-events.h"
|
||||
#include "mem-info.h"
|
||||
#include "debug.h"
|
||||
#include "evsel.h"
|
||||
#include "symbol.h"
|
||||
#include "pmu.h"
|
||||
#include "pmus.h"
|
||||
@ -281,7 +283,7 @@ static const char * const tlb_access[] = {
|
||||
"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;
|
||||
u64 m = PERF_MEM_TLB_NA;
|
||||
@ -359,7 +361,7 @@ static const char * const mem_hops[] = {
|
||||
"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;
|
||||
int l;
|
||||
@ -383,7 +385,7 @@ static int perf_mem__op_scnprintf(char *out, size_t sz, struct mem_info *mem_inf
|
||||
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;
|
||||
int printed = 0;
|
||||
@ -465,7 +467,7 @@ static const char * const snoopx_access[] = {
|
||||
"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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
int l;
|
||||
@ -525,7 +527,7 @@ int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
|
@ -3,13 +3,7 @@
|
||||
#define __PERF_MEM_EVENTS_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include "stat.h"
|
||||
#include "evsel.h"
|
||||
|
||||
struct perf_mem_event {
|
||||
bool record;
|
||||
@ -21,13 +15,6 @@ struct perf_mem_event {
|
||||
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 {
|
||||
PERF_MEM_EVENTS__LOAD,
|
||||
PERF_MEM_EVENTS__STORE,
|
||||
@ -35,6 +22,10 @@ enum {
|
||||
PERF_MEM_EVENTS__MAX,
|
||||
};
|
||||
|
||||
struct evsel;
|
||||
struct mem_info;
|
||||
struct perf_pmu;
|
||||
|
||||
extern unsigned int perf_mem_events__loads_ldlat;
|
||||
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);
|
||||
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__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
||||
int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
||||
int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
|
||||
int perf_mem__blk_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, const 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, const 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 {
|
||||
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 "../comm.h"
|
||||
#include "../machine.h"
|
||||
#include "../mem-info.h"
|
||||
#include "../db-export.h"
|
||||
#include "../thread-stack.h"
|
||||
#include "../trace-event.h"
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "strlist.h"
|
||||
#include "strbuf.h"
|
||||
#include "mem-events.h"
|
||||
#include "mem-info.h"
|
||||
#include "annotate.h"
|
||||
#include "annotate-data.h"
|
||||
#include "event.h"
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "symbol.h"
|
||||
#include "map_symbol.h"
|
||||
#include "mem-events.h"
|
||||
#include "mem-info.h"
|
||||
#include "symsrc.h"
|
||||
#include "strlist.h"
|
||||
#include "intlist.h"
|
||||
@ -2570,31 +2571,6 @@ int symbol__config_symfs(const struct option *opt __maybe_unused,
|
||||
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
|
||||
* the default mechanism for accessing elf files fails silently. i.e. if
|
||||
|
@ -268,18 +268,6 @@ enum {
|
||||
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);
|
||||
|
||||
#endif /* __PERF_SYMBOL */
|
||||
|
Loading…
Reference in New Issue
Block a user