perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers

Some places were including event.h just to get 'struct perf_sample',
move it to a separate place so that we speed up a bit the build.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2022-10-26 17:24:27 -03:00
parent 0804333016
commit 9823147da6
31 changed files with 147 additions and 118 deletions

View File

@ -2,7 +2,7 @@
#include <elfutils/libdwfl.h>
#include "../../../util/unwind-libdw.h"
#include "../../../util/perf_regs.h"
#include "../../../util/event.h"
#include "../../../util/sample.h"
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{

View File

@ -7,6 +7,7 @@
#include "symbol.h"
#include "callchain.h"
#include "record.h"
#include "util/perf_regs.h"
void arch__add_leaf_frame_record_opts(struct record_opts *opts)
{

View File

@ -2,7 +2,7 @@
#include <elfutils/libdwfl.h>
#include "../../../util/unwind-libdw.h"
#include "../../../util/perf_regs.h"
#include "../../../util/event.h"
#include "../../../util/sample.h"
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{

View File

@ -9,6 +9,7 @@
#include "../../../util/tool.h"
#include "../../../util/map.h"
#include "../../../util/debug.h"
#include "../../../util/sample.h"
void arch_perf_parse_sample_weight(struct perf_sample *data,
const __u64 *array, u64 type)

View File

@ -3,7 +3,7 @@
#include <linux/kernel.h>
#include "../../../util/unwind-libdw.h"
#include "../../../util/perf_regs.h"
#include "../../../util/event.h"
#include "../../../util/sample.h"
/* See backends/ppc_initreg.c and backends/ppc_regs.c in elfutils. */
static const int special_regs[3][2] = {

View File

@ -3,6 +3,7 @@
#include "../../util/unwind-libdw.h"
#include "../../util/perf_regs.h"
#include "../../util/event.h"
#include "../../util/sample.h"
#include "dwarf-regs-table.h"

View File

@ -10,6 +10,7 @@
#include "event.h"
#include "evsel.h"
#include "debug.h"
#include "util/sample.h"
#include "util/synthetic-events.h"
#include "tests/tests.h"

View File

@ -10,6 +10,7 @@
#include "../../../util/tool.h"
#include "../../../util/map.h"
#include "../../../util/debug.h"
#include "util/sample.h"
#if defined(__x86_64__)

View File

@ -2,7 +2,7 @@
#include <elfutils/libdwfl.h>
#include "../../../util/unwind-libdw.h"
#include "../../../util/perf_regs.h"
#include "../../../util/event.h"
#include "util/sample.h"
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{

View File

@ -19,10 +19,10 @@
#include "util/data.h"
#include "util/stat.h"
#include "util/debug.h"
#include "util/event.h"
#include "util/symbol.h"
#include "util/session.h"
#include "util/build-id.h"
#include "util/sample.h"
#include "util/synthetic-events.h"
#define MMAP_DEV_MAJOR 8

View File

@ -20,6 +20,7 @@
#include "util/symbol.h"
#include "util/pmu.h"
#include "util/pmu-hybrid.h"
#include "util/sample.h"
#include "util/string2.h"
#include <linux/err.h>

View File

@ -33,6 +33,7 @@
#include "archinsn.h"
#include "dlfilter.h"
#include "tests.h"
#include "util/sample.h"
#define MAP_START 0x400000

View File

@ -10,6 +10,7 @@
#include "thread_map.h"
#include "tests.h"
#include "util/mmap.h"
#include "util/sample.h"
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/string.h>

View File

@ -14,6 +14,7 @@
#include "util/mmap.h"
#include <errno.h>
#include <perf/mmap.h>
#include "util/sample.h"
#ifndef O_DIRECTORY
#define O_DIRECTORY 00200000

View File

@ -8,6 +8,7 @@
#include "evlist.h"
#include "header.h"
#include "debug.h"
#include "util/sample.h"
static int process_event(struct evlist **pevlist, union perf_event *event)
{

View File

@ -11,6 +11,7 @@
#include "record.h"
#include "tests.h"
#include "util/mmap.h"
#include "util/sample.h"
static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp)
{

View File

@ -20,6 +20,7 @@
#include "tsc.h"
#include "mmap.h"
#include "tests.h"
#include "util/sample.h"
/*
* Except x86_64/i386 and Arm64, other archs don't support TSC in perf. Just

View File

@ -13,6 +13,7 @@
#include "util/evlist.h"
#include "util/cpumap.h"
#include "util/mmap.h"
#include "util/sample.h"
#include "util/thread_map.h"
#include <perf/evlist.h>
#include <perf/mmap.h>

View File

@ -19,6 +19,7 @@
#include "record.h"
#include "tests.h"
#include "util/mmap.h"
#include "util/sample.h"
#include "pmu.h"
static int spin_sleep(void)

View File

@ -16,6 +16,7 @@
#include "evlist.h"
#include "sample-raw.h"
#include "pmu-events/pmu-events.h"
#include "util/sample.h"
static u32 cpu_family, cpu_model, ibs_fetch_type, ibs_op_type;
static bool zen4_ibs_extensions;

View File

@ -59,6 +59,7 @@
#include <linux/ctype.h>
#include "symbol/kallsyms.h"
#include <internal/lib.h>
#include "util/sample.h"
/*
* Make a group from 'leader' to 'last', requiring that the events were not

View File

@ -10,7 +10,7 @@
#include <linux/perf_event.h>
#include <linux/types.h>
#include "util/map_symbol.h"
#include "event.h"
#include "util/sample.h"
struct branch_flags {
union {

View File

@ -34,6 +34,7 @@
#include <linux/time64.h>
#include "util.h"
#include "clockid.h"
#include "util/sample.h"
#define pr_N(n, fmt, ...) \
eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)

View File

@ -15,6 +15,7 @@
struct dso;
struct machine;
struct perf_event_attr;
struct perf_sample;
#ifdef __LP64__
/*
@ -42,61 +43,6 @@ struct perf_event_attr;
/* perf sample has 16 bits size limit */
#define PERF_SAMPLE_MAX_SIZE (1 << 16)
/* number of register is bound by the number of bits in regs_dump::mask (64) */
#define PERF_SAMPLE_REGS_CACHE_SIZE (8 * sizeof(u64))
struct regs_dump {
u64 abi;
u64 mask;
u64 *regs;
/* Cached values/mask filled by first register access. */
u64 cache_regs[PERF_SAMPLE_REGS_CACHE_SIZE];
u64 cache_mask;
};
struct stack_dump {
u16 offset;
u64 size;
char *data;
};
struct sample_read_value {
u64 value;
u64 id; /* only if PERF_FORMAT_ID */
u64 lost; /* only if PERF_FORMAT_LOST */
};
struct sample_read {
u64 time_enabled;
u64 time_running;
union {
struct {
u64 nr;
struct sample_read_value *values;
} group;
struct sample_read_value one;
};
};
static inline size_t sample_read_value_size(u64 read_format)
{
/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
if (read_format & PERF_FORMAT_LOST)
return sizeof(struct sample_read_value);
else
return offsetof(struct sample_read_value, lost);
}
static inline struct sample_read_value *
next_sample_read_value(struct sample_read_value *v, u64 read_format)
{
return (void *)v + sample_read_value_size(read_format);
}
#define sample_read_group__for_each(v, nr, rf) \
for (int __i = 0; __i < (int)nr; v = next_sample_read_value(v, rf), __i++)
struct ip_callchain {
u64 nr;
u64 ips[];
@ -138,52 +84,6 @@ enum {
PERF_IP_FLAG_VMENTRY |\
PERF_IP_FLAG_VMEXIT)
#define MAX_INSN 16
struct aux_sample {
u64 size;
void *data;
};
struct perf_sample {
u64 ip;
u32 pid, tid;
u64 time;
u64 addr;
u64 id;
u64 stream_id;
u64 period;
u64 weight;
u64 transaction;
u64 insn_cnt;
u64 cyc_cnt;
u32 cpu;
u32 raw_size;
u64 data_src;
u64 phys_addr;
u64 data_page_size;
u64 code_page_size;
u64 cgroup;
u32 flags;
u32 machine_pid;
u32 vcpu;
u16 insn_len;
u8 cpumode;
u16 misc;
u16 ins_lat;
u16 p_stage_cyc;
bool no_hw_idx; /* No hw_idx collected in branch_stack */
char insn[MAX_INSN];
void *raw_data;
struct ip_callchain *callchain;
struct branch_stack *branch_stack;
struct regs_dump user_regs;
struct regs_dump intr_regs;
struct stack_dump user_stack;
struct sample_read read;
struct aux_sample aux_sample;
};
#define PERF_MEM_DATA_SRC_NONE \
(PERF_MEM_S(OP, NA) |\
PERF_MEM_S(LVL, NA) |\
@ -342,15 +242,6 @@ struct perf_synth_intel_iflag_chg {
u64 branch_ip; /* If via_branch */
};
/*
* raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get
* 8-byte alignment.
*/
static inline void *perf_sample__synth_ptr(struct perf_sample *sample)
{
return sample->raw_data - 4;
}
static inline void *perf_synth__raw_data(void *p)
{
return p + 4;

View File

@ -29,6 +29,7 @@
#include "util/evsel_fprintf.h"
#include "util/evlist-hybrid.h"
#include "util/pmu.h"
#include "util/sample.h"
#include <signal.h>
#include <unistd.h>
#include <sched.h>

View File

@ -18,6 +18,7 @@
#include "intel-pt-insn-decoder.h"
#include "dump-insn.h"
#include "util/sample.h"
#if INTEL_PT_INSN_BUF_SZ < MAX_INSN_SIZE || INTEL_PT_INSN_BUF_SZ > MAX_INSN
#error Instruction buffer size too small

View File

@ -2,7 +2,7 @@
#include <errno.h>
#include <string.h>
#include "perf_regs.h"
#include "event.h"
#include "util/sample.h"
int __weak arch_sdt_arg_parse_op(char *old_op __maybe_unused,
char **new_op __maybe_unused)

View File

@ -163,6 +163,7 @@
#include "s390-cpumsf-kernel.h"
#include "s390-cpumcf-kernel.h"
#include "config.h"
#include "util/sample.h"
struct s390_cpumsf {
struct auxtrace auxtrace;

View File

@ -28,6 +28,7 @@
#include "sample-raw.h"
#include "s390-cpumcf-kernel.h"
#include "pmu-events/pmu-events.h"
#include "util/sample.h"
static size_t ctrset_size(struct cf_ctrset_entry *set)
{

117
tools/perf/util/sample.h Normal file
View File

@ -0,0 +1,117 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __PERF_SAMPLE_H
#define __PERF_SAMPLE_H
#include <linux/perf_event.h>
#include <linux/types.h>
/* number of register is bound by the number of bits in regs_dump::mask (64) */
#define PERF_SAMPLE_REGS_CACHE_SIZE (8 * sizeof(u64))
struct regs_dump {
u64 abi;
u64 mask;
u64 *regs;
/* Cached values/mask filled by first register access. */
u64 cache_regs[PERF_SAMPLE_REGS_CACHE_SIZE];
u64 cache_mask;
};
struct stack_dump {
u16 offset;
u64 size;
char *data;
};
struct sample_read_value {
u64 value;
u64 id; /* only if PERF_FORMAT_ID */
u64 lost; /* only if PERF_FORMAT_LOST */
};
struct sample_read {
u64 time_enabled;
u64 time_running;
union {
struct {
u64 nr;
struct sample_read_value *values;
} group;
struct sample_read_value one;
};
};
static inline size_t sample_read_value_size(u64 read_format)
{
/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
if (read_format & PERF_FORMAT_LOST)
return sizeof(struct sample_read_value);
else
return offsetof(struct sample_read_value, lost);
}
static inline struct sample_read_value *next_sample_read_value(struct sample_read_value *v, u64 read_format)
{
return (void *)v + sample_read_value_size(read_format);
}
#define sample_read_group__for_each(v, nr, rf) \
for (int __i = 0; __i < (int)nr; v = next_sample_read_value(v, rf), __i++)
#define MAX_INSN 16
struct aux_sample {
u64 size;
void *data;
};
struct perf_sample {
u64 ip;
u32 pid, tid;
u64 time;
u64 addr;
u64 id;
u64 stream_id;
u64 period;
u64 weight;
u64 transaction;
u64 insn_cnt;
u64 cyc_cnt;
u32 cpu;
u32 raw_size;
u64 data_src;
u64 phys_addr;
u64 data_page_size;
u64 code_page_size;
u64 cgroup;
u32 flags;
u32 machine_pid;
u32 vcpu;
u16 insn_len;
u8 cpumode;
u16 misc;
u16 ins_lat;
u16 p_stage_cyc;
bool no_hw_idx; /* No hw_idx collected in branch_stack */
char insn[MAX_INSN];
void *raw_data;
struct ip_callchain *callchain;
struct branch_stack *branch_stack;
struct regs_dump user_regs;
struct regs_dump intr_regs;
struct stack_dump user_stack;
struct sample_read read;
struct aux_sample aux_sample;
};
/*
* raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get
* 8-byte alignment.
*/
static inline void *perf_sample__synth_ptr(struct perf_sample *sample)
{
return sample->raw_data - 4;
}
#endif /* __PERF_SAMPLE_H */

View File

@ -12,9 +12,9 @@
#include "debug.h"
#include "trace-event.h"
#include "event.h"
#include "evsel.h"
#include <linux/zalloc.h>
#include "util/sample.h"
struct scripting_context *scripting_context;