Skip to content

Commit 0f66dfe

Browse files
committed
perf annotate: Add comments in the data structures
Reviewed-by: Ian Rogers <irogers@google.com> Reviewed-by: Arnaldo Carvalho de Melo <acme@redhat.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240304230815.1440583-5-namhyung@kernel.org
1 parent f59e366 commit 0f66dfe

File tree

1 file changed

+62
-7
lines changed

1 file changed

+62
-7
lines changed

tools/perf/util/annotate.h

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,42 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool r
239239
size_t disasm__fprintf(struct list_head *head, FILE *fp);
240240
void symbol__calc_percent(struct symbol *sym, struct evsel *evsel);
241241

242+
/**
243+
* struct sym_hist - symbol histogram information for an event
244+
*
245+
* @nr_samples: Total number of samples.
246+
* @period: Sum of sample periods.
247+
*/
242248
struct sym_hist {
243249
u64 nr_samples;
244250
u64 period;
245251
};
246252

253+
/**
254+
* struct cyc_hist - (CPU) cycle histogram for a basic block
255+
*
256+
* @start: Start address of current block (if known).
257+
* @cycles: Sum of cycles for the longest basic block.
258+
* @cycles_aggr: Total cycles for this address.
259+
* @cycles_max: Max cycles for this address.
260+
* @cycles_min: Min cycles for this address.
261+
* @cycles_spark: History of cycles for the longest basic block.
262+
* @num: Number of samples for the longest basic block.
263+
* @num_aggr: Total number of samples for this address.
264+
* @have_start: Whether the current branch info has a start address.
265+
* @reset: Number of resets due to a different start address.
266+
*
267+
* If sample has branch_stack and cycles info, it can construct basic blocks
268+
* between two adjacent branches. It'd have start and end addresses but
269+
* sometimes the start address may not be available. So the cycles are
270+
* accounted at the end address. If multiple basic blocks end at the same
271+
* address, it will take the longest one.
272+
*
273+
* The @start, @cycles, @cycles_spark and @num fields are used for the longest
274+
* block only. Other fields are used for all cases.
275+
*
276+
* See __symbol__account_cycles().
277+
*/
247278
struct cyc_hist {
248279
u64 start;
249280
u64 cycles;
@@ -258,18 +289,24 @@ struct cyc_hist {
258289
u16 reset;
259290
};
260291

261-
/** struct annotated_source - symbols with hits have this attached as in sannotation
292+
/**
293+
* struct annotated_source - symbols with hits have this attached as in annotation
262294
*
263-
* @histograms: Array of addr hit histograms per event being monitored
264-
* nr_histograms: This may not be the same as evsel->evlist->core.nr_entries if
295+
* @source: List head for annotated_line (embeded in disasm_line).
296+
* @histograms: Array of symbol histograms per event to maintain the total number
297+
* of samples and period.
298+
* @nr_histograms: This may not be the same as evsel->evlist->core.nr_entries if
265299
* we have more than a group in a evlist, where we will want
266300
* to see each group separately, that is why symbol__annotate2()
267301
* sets src->nr_histograms to evsel->nr_members.
268-
* @lines: If 'print_lines' is specified, per source code line percentages
269-
* @source: source parsed from a disassembler like objdump -dS
270-
* @cyc_hist: Average cycles per basic block
302+
* @offsets: Array of annotation_line to be accessed by offset.
303+
* @samples: Hash map of sym_hist_entry. Keyed by event index and offset in symbol.
304+
* @nr_entries: Number of annotated_line in the source list.
305+
* @nr_asm_entries: Number of annotated_line with actual asm instruction in the
306+
* source list.
307+
* @max_line_len: Maximum length of objdump output in an annotated_line.
271308
*
272-
* lines is allocated, percentages calculated and all sorted by percentage
309+
* disasm_lines are allocated, percentages calculated and all sorted by percentage
273310
* when the annotation is about to be presented, so the percentages are for
274311
* one of the entries in the histogram array, i.e. for the event/counter being
275312
* presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
@@ -286,6 +323,24 @@ struct annotated_source {
286323
u16 max_line_len;
287324
};
288325

326+
/**
327+
* struct annotated_branch - basic block and IPC information for a symbol.
328+
*
329+
* @hit_cycles: Total executed cycles.
330+
* @hit_insn: Total number of instructions executed.
331+
* @total_insn: Number of instructions in the function.
332+
* @cover_insn: Number of distinct, actually executed instructions.
333+
* @cycles_hist: Array of cyc_hist for each instruction.
334+
* @max_coverage: Maximum number of covered basic block (used for block-range).
335+
*
336+
* This struct is used by two different codes when the sample has branch stack
337+
* and cycles information. annotation__compute_ipc() calculates average IPC
338+
* using @hit_insn / @hit_cycles. The actual coverage can be calculated using
339+
* @cover_insn / @total_insn. The @cycles_hist can give IPC for each (longest)
340+
* basic block ends at the given address.
341+
* process_basic_block() calculates coverage of instructions (or basic blocks)
342+
* in the function.
343+
*/
289344
struct annotated_branch {
290345
u64 hit_cycles;
291346
u64 hit_insn;

0 commit comments

Comments
 (0)