2023-11-03 19:21:02

by Namhyung Kim

[permalink] [raw]
Subject: [PATCHSET 0/5] perf annotate: Reduce memory footprint (v2)

Hello,

This is a part of my work to improve perf annotate. At first, I'd
like reduce the size of struct annotation which will be allocated
together with struct symbol in some cases. In fact, it doesn't use
most of them so it needs to slim down and lazy-allocate used part.

* v2 changes)
- fix typo
- reorder struct annotated_source
- add Ian's Reviewed-by tags

With this applied, size of the struct goes down from 96 to 48.

The code is available at perf/annotate-diet-v2 branch in

git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git

Thanks,
Namhyung


Namhyung Kim (5):
perf annotate: Split struct cycles_info
perf annotate: Split struct annotated_branch
perf annotate: Move max_coverage to annotated_branch
perf annotate: Move some fields to annotated_source
perf annotate: Move offsets to annotated_source

tools/perf/builtin-annotate.c | 7 +-
tools/perf/ui/browsers/annotate.c | 18 ++--
tools/perf/util/annotate.c | 162 ++++++++++++++++--------------
tools/perf/util/annotate.h | 49 +++++----
tools/perf/util/block-info.c | 4 +-
tools/perf/util/block-range.c | 7 +-
tools/perf/util/sort.c | 14 +--
7 files changed, 147 insertions(+), 114 deletions(-)

--
2.42.0.869.gea05f2083d-goog


2023-11-03 19:23:36

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 3/5] perf annotate: Move max_coverage to annotated_branch

The max_coverage is only used when branch stack info is available so
it'd be natural to move to the annotated_branch.

Reviewed-by: Ian Rogers <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
tools/perf/builtin-annotate.c | 7 +++++--
tools/perf/util/annotate.c | 2 +-
tools/perf/util/annotate.h | 4 +++-
tools/perf/util/block-range.c | 7 ++++++-
4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index aeeb801f1ed7..a9129b51d511 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -94,6 +94,7 @@ static void process_basic_block(struct addr_map_symbol *start,
struct annotation *notes = sym ? symbol__annotation(sym) : NULL;
struct block_range_iter iter;
struct block_range *entry;
+ struct annotated_branch *branch;

/*
* Sanity; NULL isn't executable and the CPU cannot execute backwards
@@ -105,6 +106,8 @@ static void process_basic_block(struct addr_map_symbol *start,
if (!block_range_iter__valid(&iter))
return;

+ branch = annotation__get_branch(notes);
+
/*
* First block in range is a branch target.
*/
@@ -118,8 +121,8 @@ static void process_basic_block(struct addr_map_symbol *start,
entry->coverage++;
entry->sym = sym;

- if (notes)
- notes->max_coverage = max(notes->max_coverage, entry->coverage);
+ if (branch)
+ branch->max_coverage = max(branch->max_coverage, entry->coverage);

} while (block_range_iter__next(&iter));

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 2fa1ce3a0858..92a9adf9d5eb 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -946,7 +946,7 @@ static int __symbol__inc_addr_samples(struct map_symbol *ms,
return 0;
}

-static struct annotated_branch *annotation__get_branch(struct annotation *notes)
+struct annotated_branch *annotation__get_branch(struct annotation *notes)
{
if (notes == NULL)
return NULL;
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index 9c199629305d..d8a221591926 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -280,10 +280,10 @@ struct annotated_branch {
unsigned int total_insn;
unsigned int cover_insn;
struct cyc_hist *cycles_hist;
+ u64 max_coverage;
};

struct LOCKABLE annotation {
- u64 max_coverage;
u64 start;
struct annotation_options *options;
struct annotation_line **offsets;
@@ -356,6 +356,8 @@ static inline struct annotation *symbol__annotation(struct symbol *sym)
int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, struct perf_sample *sample,
struct evsel *evsel);

+struct annotated_branch *annotation__get_branch(struct annotation *notes);
+
int addr_map_symbol__account_cycles(struct addr_map_symbol *ams,
struct addr_map_symbol *start,
unsigned cycles);
diff --git a/tools/perf/util/block-range.c b/tools/perf/util/block-range.c
index 680e92774d0c..15c42196c24c 100644
--- a/tools/perf/util/block-range.c
+++ b/tools/perf/util/block-range.c
@@ -311,6 +311,7 @@ struct block_range_iter block_range__create(u64 start, u64 end)
double block_range__coverage(struct block_range *br)
{
struct symbol *sym;
+ struct annotated_branch *branch;

if (!br) {
if (block_ranges.blocks)
@@ -323,5 +324,9 @@ double block_range__coverage(struct block_range *br)
if (!sym)
return -1;

- return (double)br->coverage / symbol__annotation(sym)->max_coverage;
+ branch = symbol__annotation(sym)->branch;
+ if (!branch)
+ return -1;
+
+ return (double)br->coverage / branch->max_coverage;
}
--
2.42.0.869.gea05f2083d-goog