lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d730cfe63cdd46c137630d27de32e3b9c0ab6268.camel@intel.com>
Date: Fri, 20 Dec 2024 20:30:11 +0000
From: "Falcon, Thomas" <thomas.falcon@...el.com>
To: "acme@...nel.org" <acme@...nel.org>
CC: "ravi.bangoria@....com" <ravi.bangoria@....com>,
	"alexander.shishkin@...ux.intel.com" <alexander.shishkin@...ux.intel.com>,
	"linux-perf-users@...r.kernel.org" <linux-perf-users@...r.kernel.org>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	"peterz@...radead.org" <peterz@...radead.org>, "mark.rutland@....com"
	<mark.rutland@....com>, "mingo@...hat.com" <mingo@...hat.com>, "Hunter,
 Adrian" <adrian.hunter@...el.com>, "namhyung@...nel.org"
	<namhyung@...nel.org>, "jolsa@...nel.org" <jolsa@...nel.org>,
	"kan.liang@...ux.intel.com" <kan.liang@...ux.intel.com>, "irogers@...gle.com"
	<irogers@...gle.com>
Subject: Re: [PATCH v3] perf script: Fix output type for dynamically allocated
 core PMU's

On Fri, 2024-12-20 at 16:16 -0300, Arnaldo Carvalho de Melo wrote:
> On Fri, Dec 13, 2024 at 03:54:21PM -0600, Thomas Falcon wrote:
> > perf script output may show different fields on different core
> > PMU's
> > that exist on heterogeneous platforms. For example,
> > 
> > perf record -e "{cpu_core/mem-loads-aux/,cpu_core/event=0xcd,\
> > umask=0x01,ldlat=3,name=MEM_UOPS_RETIRED.LOAD_LATENCY/}:upp"\
> > -c10000 -W -d -a -- sleep 1
> > 
> > perf script:
> > 
> > chromium-browse   46572 [002] 544966.882384:     
> > 10000 	cpu_core/MEM_UOPS_RETIRED.LOAD_LATENCY/: 7ffdf1391b0c     10268100142\
> >  |OP LOAD|LVL L1 hit|SNP None|TLB L1 or L2 hit|LCK No|BLK    N/A   
> > 5   7    0   7fad7c47425d [unknown] (/usr/lib64/libglib-
> > 2.0.so.0.8000.3)
> > 
> > perf record -e cpu_atom/event=0xd0,umask=0x05,ldlat=3,\
> > name=MEM_UOPS_RETIRED.LOAD_LATENCY/upp -c10000 -W -d -a -- sleep 1
> > 
> > perf script:
> > 
> > gnome-control-c  534224 [023] 544951.816227:      10000
> > cpu_atom/MEM_UOPS_RETIRED.LOAD_LATENCY/:   7f0aaaa0aae0  [unknown]
> > (/usr/lib64/libglib-2.0.so.0.8000.3)
> > 
> > Some fields, such as data_src, are not included by default.
> > 
> > The cause is that while one PMU may be assigned a type such as
> > PERF_TYPE_RAW, other core PMU's are dynamically allocated at boot
> > time.
> > If this value does not match an existing PERF_TYPE_X value,
> > output_type(perf_event_attr.type) will return OUTPUT_TYPE_OTHER.
> > 
> > Instead search for a core PMU with a matching perf_event_attr type
> > and, if one is found, return PERF_TYPE_RAW to match output of other
> > core PMU's.
> > 
> > Suggested-by: Kan Liang <kan.liang@...el.com>
> > Signed-off-by: Thomas Falcon <thomas.falcon@...el.com>
> > ---
> > v2: restrict pmu lookup to platforms with more than one core pmu
> > v3: only scan core pmu list
> > ---
> >  tools/perf/builtin-script.c | 16 ++++++++++++++++
> >  1 file changed, 16 insertions(+)
> > 
> > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-
> > script.c
> > index 9e47905f75a6..685232883f9c 100644
> > --- a/tools/perf/builtin-script.c
> > +++ b/tools/perf/builtin-script.c
> > @@ -384,6 +384,19 @@ static int evsel_script__fprintf(struct
> > evsel_script *es, FILE *fp)
> >  		       st.st_size / 1024.0 / 1024.0, es->filename,
> > es->samples);
> >  }
> >  
> > +static bool output_type_many_core_pmus(unsigned int type)
> > +{
> > +	struct perf_pmu *pmu = NULL;
> > +
> > +	if (perf_pmus__num_core_pmus() > 1) {
> > +		while ((pmu = perf_pmus__scan_core(pmu)) != NULL)
> > {
> > +			if (pmu->type == type)
> > +				return true;
> > +		}
> > +	}
> > +	return false;
> > +}
> > +
> >  static inline int output_type(unsigned int type)
> >  {
> >  	switch (type) {
> > @@ -394,6 +407,9 @@ static inline int output_type(unsigned int
> > type)
> >  			return type;
> >  	}
> >  
> > +	if (output_type_many_core_pmus(type))
> > +		return PERF_TYPE_RAW;
> > +
> >  	return OUTPUT_TYPE_OTHER;
> >  }
> 
> Can you please test the patch below so that we don't do this while
> loop
> in all calls to output_type when we have more than one core pmu?
> 
> I haven't tested this patch, so please see if your patch on top of it
> produces the desired result.

Hi Arnaldo, it looks good to me.

Thanks,
Tom

> 
> - Arnaldo
> 
> From d3c64550a0365455980aaa9c567c4a6b8c10473a Mon Sep 17 00:00:00
> 2001
> From: Arnaldo Carvalho de Melo <acme@...hat.com>
> Date: Fri, 20 Dec 2024 16:10:28 -0300
> Subject: [PATCH 1/1] perf script: Cache the output type
> 
> Right now every time we need to figure out the type of an evsel for
> output purposes we do a quick sequence of ifs, but there are new
> cases
> where there is a need to do more complex iterations over multiple
> data
> structures, sso allow for caching this operation on a hole of 'struct
> evsel'.
> 
> This should really be done on the evsel->priv area that 'perf script'
> sets up, but more work is needed to make sure that it is allocated
> when
> we need it, right now it is only used for conditionally, add some
> comments so that we move this to that 'perf script' specific area
> when
> the conditions are in place for that.
> 
> Cc: Adrian Hunter <adrian.hunter@...el.com>
> Cc: Ian Rogers <irogers@...gle.com>
> Cc: James Clark <james.clark@...aro.org>
> Cc: Jiri Olsa <jolsa@...nel.org>
> Cc: Kan Liang <kan.liang@...ux.intel.com>
> Cc: Namhyung Kim <namhyung@...nel.org>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@...hat.com>
> ---
>  tools/perf/builtin-script.c | 91 ++++++++++++++++++++---------------
> --
>  tools/perf/util/evsel.c     |  1 +
>  tools/perf/util/evsel.h     |  1 +
>  3 files changed, 51 insertions(+), 42 deletions(-)
> 
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-
> script.c
> index 6d5773539cfdf16e..33667b5346349268 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -221,6 +221,10 @@ enum {
>  	OUTPUT_TYPE_MAX
>  };
>  
> +// We need to refactor the evsel->priv use in in 'perf script' to
> allow for
> +// using that area, that is being used only in some cases.
> +#define OUTPUT_TYPE_UNSET -1
> +
>  /* default set to maintain compatibility with current format */
>  static struct {
>  	bool user_set;
> @@ -394,6 +398,14 @@ static inline int output_type(unsigned int type)
>  	return OUTPUT_TYPE_OTHER;
>  }
>  
> +static inline int evsel__output_type(struct evsel *evsel)
> +{
> +	if (evsel->script_output_type == OUTPUT_TYPE_UNSET)
> +		evsel->script_output_type = output_type(evsel-
> >core.attr.type);
> +
> +	return evsel->script_output_type;
> +}
> +
>  static bool output_set_by_user(void)
>  {
>  	int j;
> @@ -418,13 +430,13 @@ static const char *output_field2str(enum
> perf_output_field field)
>  	return str;
>  }
>  
> -#define PRINT_FIELD(x)  (output[output_type(attr->type)].fields &
> PERF_OUTPUT_##x)
> +#define PRINT_FIELD(x)  (output[evsel__output_type(evsel)].fields &
> PERF_OUTPUT_##x)
>  
>  static int evsel__do_check_stype(struct evsel *evsel, u64
> sample_type, const char *sample_msg,
>  				 enum perf_output_field field, bool
> allow_user_set)
>  {
>  	struct perf_event_attr *attr = &evsel->core.attr;
> -	int type = output_type(attr->type);
> +	int type = evsel__output_type(evsel);
>  	const char *evname;
>  
>  	if (attr->sample_type & sample_type)
> @@ -458,7 +470,6 @@ static int evsel__check_stype(struct evsel
> *evsel, u64 sample_type, const char *
>  
>  static int evsel__check_attr(struct evsel *evsel, struct
> perf_session *session)
>  {
> -	struct perf_event_attr *attr = &evsel->core.attr;
>  	bool allow_user_set;
>  
>  	if (evsel__is_dummy_event(evsel))
> @@ -575,9 +586,9 @@ static int evsel__check_attr(struct evsel *evsel,
> struct perf_session *session)
>  	return 0;
>  }
>  
> -static void set_print_ip_opts(struct perf_event_attr *attr)
> +static void evsel__set_print_ip_opts(struct evsel *evsel)
>  {
> -	unsigned int type = output_type(attr->type);
> +	unsigned int type = evsel__output_type(evsel);
>  
>  	output[type].print_ip_opts = 0;
>  	if (PRINT_FIELD(IP))
> @@ -607,7 +618,7 @@ static struct evsel
> *find_first_output_type(struct evlist *evlist,
>  	evlist__for_each_entry(evlist, evsel) {
>  		if (evsel__is_dummy_event(evsel))
>  			continue;
> -		if (output_type(evsel->core.attr.type) == (int)type)
> +		if (evsel__output_type(evsel) == (int)type)
>  			return evsel;
>  	}
>  	return NULL;
> @@ -649,7 +660,7 @@ static int perf_session__check_output_opt(struct
> perf_session *session)
>  		if (output[j].fields & PERF_OUTPUT_DSOFF)
>  			output[j].fields |= PERF_OUTPUT_DSO;
>  
> -		set_print_ip_opts(&evsel->core.attr);
> +		evsel__set_print_ip_opts(evsel);
>  		tod |= output[j].fields & PERF_OUTPUT_TOD;
>  	}
>  
> @@ -685,7 +696,7 @@ static int perf_session__check_output_opt(struct
> perf_session *session)
>  				output[j].fields |= PERF_OUTPUT_SYM;
>  				output[j].fields |=
> PERF_OUTPUT_SYMOFFSET;
>  				output[j].fields |= PERF_OUTPUT_DSO;
> -				set_print_ip_opts(&evsel-
> >core.attr);
> +				evsel__set_print_ip_opts(evsel);
>  				goto out;
>  			}
>  		}
> @@ -789,7 +800,6 @@ static int perf_sample__fprintf_start(struct
> perf_script *script,
>  				      struct evsel *evsel,
>  				      u32 type, FILE *fp)
>  {
> -	struct perf_event_attr *attr = &evsel->core.attr;
>  	unsigned long secs;
>  	unsigned long long nsecs;
>  	int printed = 0;
> @@ -941,7 +951,7 @@ static int print_bstack_flags(FILE *fp, struct
> branch_entry *br)
>  
>  static int perf_sample__fprintf_brstack(struct perf_sample *sample,
>  					struct thread *thread,
> -					struct perf_event_attr
> *attr, FILE *fp)
> +					struct evsel *evsel, FILE
> *fp)
>  {
>  	struct branch_stack *br = sample->branch_stack;
>  	struct branch_entry *entries =
> perf_sample__branch_entries(sample);
> @@ -980,7 +990,7 @@ static int perf_sample__fprintf_brstack(struct
> perf_sample *sample,
>  
>  static int perf_sample__fprintf_brstacksym(struct perf_sample
> *sample,
>  					   struct thread *thread,
> -					   struct perf_event_attr
> *attr, FILE *fp)
> +					   struct evsel *evsel, FILE
> *fp)
>  {
>  	struct branch_stack *br = sample->branch_stack;
>  	struct branch_entry *entries =
> perf_sample__branch_entries(sample);
> @@ -1018,7 +1028,7 @@ static int
> perf_sample__fprintf_brstacksym(struct perf_sample *sample,
>  
>  static int perf_sample__fprintf_brstackoff(struct perf_sample
> *sample,
>  					   struct thread *thread,
> -					   struct perf_event_attr
> *attr, FILE *fp)
> +					   struct evsel *evsel, FILE
> *fp)
>  {
>  	struct branch_stack *br = sample->branch_stack;
>  	struct branch_entry *entries =
> perf_sample__branch_entries(sample);
> @@ -1185,7 +1195,7 @@ static int print_srccode(struct thread *thread,
> u8 cpumode, uint64_t addr)
>  	return ret;
>  }
>  
> -static int any_dump_insn(struct perf_event_attr *attr
> __maybe_unused,
> +static int any_dump_insn(struct evsel *evsel __maybe_unused,
>  			 struct perf_insn *x, uint64_t ip,
>  			 u8 *inbuf, int inlen, int *lenp,
>  			 FILE *fp)
> @@ -1213,15 +1223,14 @@ static int add_padding(FILE *fp, int printed,
> int padding)
>  static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en,
>  			    struct perf_insn *x, u8 *inbuf, int len,
>  			    int insn, FILE *fp, int *total_cycles,
> -			    struct perf_event_attr *attr,
> -			    struct thread *thread,
>  			    struct evsel *evsel,
> +			    struct thread *thread,
>  			    u64 br_cntr)
>  {
>  	int ilen = 0;
>  	int printed = fprintf(fp, "\t%016" PRIx64 "\t", ip);
>  
> -	printed += add_padding(fp, any_dump_insn(attr, x, ip, inbuf,
> len, &ilen, fp), 30);
> +	printed += add_padding(fp, any_dump_insn(evsel, x, ip,
> inbuf, len, &ilen, fp), 30);
>  	printed += fprintf(fp, "\t");
>  
>  	if (PRINT_FIELD(BRSTACKINSNLEN))
> @@ -1277,7 +1286,7 @@ static int ip__fprintf_jump(uint64_t ip, struct
> branch_entry *en,
>  
>  static int ip__fprintf_sym(uint64_t addr, struct thread *thread,
>  			   u8 cpumode, int cpu, struct symbol
> **lastsym,
> -			   struct perf_event_attr *attr, FILE *fp)
> +			   struct evsel *evsel, FILE *fp)
>  {
>  	struct addr_location al;
>  	int off, printed = 0, ret = 0;
> @@ -1353,10 +1362,10 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  			machine, thread, &x.is64bit, &x.cpumode,
> false);
>  	if (len > 0) {
>  		printed += ip__fprintf_sym(entries[nr - 1].from,
> thread,
> -					   x.cpumode, x.cpu,
> &lastsym, attr, fp);
> +					   x.cpumode, x.cpu,
> &lastsym, evsel, fp);
>  		printed += ip__fprintf_jump(entries[nr - 1].from,
> &entries[nr - 1],
>  					    &x, buffer, len, 0, fp,
> &total_cycles,
> -					    attr, thread, evsel,
> br_cntr);
> +					    evsel, thread, br_cntr);
>  		if (PRINT_FIELD(SRCCODE))
>  			printed += print_srccode(thread, x.cpumode,
> entries[nr - 1].from);
>  	}
> @@ -1384,19 +1393,19 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  		for (off = 0; off < (unsigned)len; off += ilen) {
>  			uint64_t ip = start + off;
>  
> -			printed += ip__fprintf_sym(ip, thread,
> x.cpumode, x.cpu, &lastsym, attr, fp);
> +			printed += ip__fprintf_sym(ip, thread,
> x.cpumode, x.cpu, &lastsym, evsel, fp);
>  			if (ip == end) {
>  				if (PRINT_FIELD(BRCNTR) && sample-
> >branch_stack_cntr)
>  					br_cntr = sample-
> >branch_stack_cntr[i];
>  				printed += ip__fprintf_jump(ip,
> &entries[i], &x, buffer + off, len - off, ++insn, fp,
> -							   
> &total_cycles, attr, thread, evsel, br_cntr);
> +							   
> &total_cycles, evsel, thread, br_cntr);
>  				if (PRINT_FIELD(SRCCODE))
>  					printed +=
> print_srccode(thread, x.cpumode, ip);
>  				break;
>  			} else {
>  				ilen = 0;
>  				printed += fprintf(fp, "\t%016"
> PRIx64 "\t", ip);
> -				printed += any_dump_insn(attr, &x,
> ip, buffer + off, len - off, &ilen, fp);
> +				printed += any_dump_insn(evsel, &x,
> ip, buffer + off, len - off, &ilen, fp);
>  				if (PRINT_FIELD(BRSTACKINSNLEN))
>  					printed += fprintf(fp,
> "\tilen: %d", ilen);
>  				printed += fprintf(fp, "\n");
> @@ -1435,7 +1444,7 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  		end = start + 128;
>  	}
>  	len = grab_bb(buffer, start, end, machine, thread,
> &x.is64bit, &x.cpumode, true);
> -	printed += ip__fprintf_sym(start, thread, x.cpumode, x.cpu,
> &lastsym, attr, fp);
> +	printed += ip__fprintf_sym(start, thread, x.cpumode, x.cpu,
> &lastsym, evsel, fp);
>  	if (len <= 0) {
>  		/* Print at least last IP if basic block did not
> work */
>  		len = grab_bb(buffer, sample->ip, sample->ip,
> @@ -1444,7 +1453,7 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  			goto out;
>  		ilen = 0;
>  		printed += fprintf(fp, "\t%016" PRIx64 "\t", sample-
> >ip);
> -		printed += any_dump_insn(attr, &x, sample->ip,
> buffer, len, &ilen, fp);
> +		printed += any_dump_insn(evsel, &x, sample->ip,
> buffer, len, &ilen, fp);
>  		if (PRINT_FIELD(BRSTACKINSNLEN))
>  			printed += fprintf(fp, "\tilen: %d", ilen);
>  		printed += fprintf(fp, "\n");
> @@ -1455,7 +1464,7 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  	for (off = 0; off <= end - start; off += ilen) {
>  		ilen = 0;
>  		printed += fprintf(fp, "\t%016" PRIx64 "\t", start +
> off);
> -		printed += any_dump_insn(attr, &x, start + off,
> buffer + off, len - off, &ilen, fp);
> +		printed += any_dump_insn(evsel, &x, start + off,
> buffer + off, len - off, &ilen, fp);
>  		if (PRINT_FIELD(BRSTACKINSNLEN))
>  			printed += fprintf(fp, "\tilen: %d", ilen);
>  		printed += fprintf(fp, "\n");
> @@ -1479,13 +1488,13 @@ static int
> perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
>  
>  static int perf_sample__fprintf_addr(struct perf_sample *sample,
>  				     struct thread *thread,
> -				     struct perf_event_attr *attr,
> FILE *fp)
> +				     struct evsel *evsel, FILE *fp)
>  {
>  	struct addr_location al;
>  	int printed = fprintf(fp, "%16" PRIx64, sample->addr);
>  
>  	addr_location__init(&al);
> -	if (!sample_addr_correlates_sym(attr))
> +	if (!sample_addr_correlates_sym(&evsel->core.attr))
>  		goto out;
>  
>  	thread__resolve(thread, &al, sample);
> @@ -1512,11 +1521,10 @@ static const char *resolve_branch_sym(struct
> perf_sample *sample,
>  				      struct addr_location *addr_al,
>  				      u64 *ip)
>  {
> -	struct perf_event_attr *attr = &evsel->core.attr;
>  	const char *name = NULL;
>  
>  	if (sample->flags & (PERF_IP_FLAG_CALL |
> PERF_IP_FLAG_TRACE_BEGIN)) {
> -		if (sample_addr_correlates_sym(attr)) {
> +		if (sample_addr_correlates_sym(&evsel->core.attr)) {
>  			if (!addr_al->thread)
>  				thread__resolve(thread, addr_al,
> sample);
>  			if (addr_al->sym)
> @@ -1542,7 +1550,6 @@ static int
> perf_sample__fprintf_callindent(struct perf_sample *sample,
>  					   struct addr_location
> *addr_al,
>  					   FILE *fp)
>  {
> -	struct perf_event_attr *attr = &evsel->core.attr;
>  	size_t depth = thread_stack__depth(thread, sample->cpu);
>  	const char *name = NULL;
>  	static int spacing;
> @@ -1614,7 +1621,7 @@ static int perf_sample__fprintf_insn(struct
> perf_sample *sample,
>  }
>  
>  static int perf_sample__fprintf_ipc(struct perf_sample *sample,
> -				    struct perf_event_attr *attr,
> FILE *fp)
> +				    struct evsel *evsel, FILE *fp)
>  {
>  	unsigned int ipc;
>  
> @@ -1635,7 +1642,7 @@ static int perf_sample__fprintf_bts(struct
> perf_sample *sample,
>  				    struct machine *machine, FILE
> *fp)
>  {
>  	struct perf_event_attr *attr = &evsel->core.attr;
> -	unsigned int type = output_type(attr->type);
> +	unsigned int type = evsel__output_type(evsel);
>  	bool print_srcline_last = false;
>  	int printed = 0;
>  
> @@ -1672,10 +1679,10 @@ static int perf_sample__fprintf_bts(struct
> perf_sample *sample,
>  	    ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&
>  	     !output[type].user_set)) {
>  		printed += fprintf(fp, " => ");
> -		printed += perf_sample__fprintf_addr(sample, thread,
> attr, fp);
> +		printed += perf_sample__fprintf_addr(sample, thread,
> evsel, fp);
>  	}
>  
> -	printed += perf_sample__fprintf_ipc(sample, attr, fp);
> +	printed += perf_sample__fprintf_ipc(sample, evsel, fp);
>  
>  	if (print_srcline_last)
>  		printed += map__fprintf_srcline(al->map, al->addr,
> "\n  ", fp);
> @@ -2157,7 +2164,7 @@ static void process_event(struct perf_script
> *script,
>  {
>  	struct thread *thread = al->thread;
>  	struct perf_event_attr *attr = &evsel->core.attr;
> -	unsigned int type = output_type(attr->type);
> +	unsigned int type = evsel__output_type(evsel);
>  	struct evsel_script *es = evsel->priv;
>  	FILE *fp = es->fp;
>  	char str[PAGE_SIZE_NAME_LEN];
> @@ -2205,7 +2212,7 @@ static void process_event(struct perf_script
> *script,
>  		perf_sample__fprintf_synth(sample, evsel, fp);
>  
>  	if (PRINT_FIELD(ADDR))
> -		perf_sample__fprintf_addr(sample, thread, attr, fp);
> +		perf_sample__fprintf_addr(sample, thread, evsel,
> fp);
>  
>  	if (PRINT_FIELD(DATA_SRC))
>  		data_src__fprintf(sample->data_src, fp);
> @@ -2255,11 +2262,11 @@ static void process_event(struct perf_script
> *script,
>  		perf_sample__fprintf_uregs(sample, attr, arch, fp);
>  
>  	if (PRINT_FIELD(BRSTACK))
> -		perf_sample__fprintf_brstack(sample, thread, attr,
> fp);
> +		perf_sample__fprintf_brstack(sample, thread, evsel,
> fp);
>  	else if (PRINT_FIELD(BRSTACKSYM))
> -		perf_sample__fprintf_brstacksym(sample, thread,
> attr, fp);
> +		perf_sample__fprintf_brstacksym(sample, thread,
> evsel, fp);
>  	else if (PRINT_FIELD(BRSTACKOFF))
> -		perf_sample__fprintf_brstackoff(sample, thread,
> attr, fp);
> +		perf_sample__fprintf_brstackoff(sample, thread,
> evsel, fp);
>  
>  	if (evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
>  		perf_sample__fprintf_bpf_output(sample, fp);
> @@ -2274,7 +2281,7 @@ static void process_event(struct perf_script
> *script,
>  	if (PRINT_FIELD(CODE_PAGE_SIZE))
>  		fprintf(fp, " %s", get_page_size_name(sample-
> >code_page_size, str));
>  
> -	perf_sample__fprintf_ipc(sample, attr, fp);
> +	perf_sample__fprintf_ipc(sample, evsel, fp);
>  
>  	fprintf(fp, "\n");
>  
> @@ -2507,14 +2514,14 @@ static int process_attr(const struct
> perf_tool *tool, union perf_event *event,
>  	     sample_type & PERF_SAMPLE_BRANCH_STACK ||
>  	     (sample_type & PERF_SAMPLE_REGS_USER &&
>  	      sample_type & PERF_SAMPLE_STACK_USER))) {
> -		int type = output_type(evsel->core.attr.type);
> +		int type = evsel__output_type(evsel);
>  
>  		if (!(output[type].user_unset_fields &
> PERF_OUTPUT_IP))
>  			output[type].fields |= PERF_OUTPUT_IP;
>  		if (!(output[type].user_unset_fields &
> PERF_OUTPUT_SYM))
>  			output[type].fields |= PERF_OUTPUT_SYM;
>  	}
> -	set_print_ip_opts(&evsel->core.attr);
> +	evsel__set_print_ip_opts(evsel);
>  	return 0;
>  }
>  
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 6ae5d110994a0322..697428efa644aa36 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -395,6 +395,7 @@ void evsel__init(struct evsel *evsel,
>  	evsel->group_pmu_name = NULL;
>  	evsel->skippable     = false;
>  	evsel->alternate_hw_config = PERF_COUNT_HW_MAX;
> +	evsel->script_output_type = -1; // FIXME: OUTPUT_TYPE_UNSET,
> see builtin-script.c
>  }
>  
>  struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx)
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index 5ad352c94d00f7b2..5e789fa80590b6f4 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -121,6 +121,7 @@ struct evsel {
>  	bool			default_metricgroup; /* A member of
> the Default metricgroup */
>  	struct hashmap		*per_pkg_mask;
>  	int			err;
> +	int			script_output_type;
>  	struct {
>  		evsel__sb_cb_t	*cb;
>  		void		*data;

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ