diff options
Diffstat (limited to 'tools/perf/builtin-script.c')
| -rw-r--r-- | tools/perf/builtin-script.c | 212 | 
1 files changed, 116 insertions, 96 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 0140ddb8dd0b..286fc70d7402 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -1,9 +1,9 @@  // SPDX-License-Identifier: GPL-2.0  #include "builtin.h" -#include "perf.h" -#include "util/cache.h" +#include "util/counts.h"  #include "util/debug.h" +#include "util/dso.h"  #include <subcmd/exec-cmd.h>  #include "util/header.h"  #include <subcmd/parse-options.h> @@ -11,11 +11,14 @@  #include "util/session.h"  #include "util/tool.h"  #include "util/map.h" +#include "util/srcline.h"  #include "util/symbol.h"  #include "util/thread.h"  #include "util/trace-event.h"  #include "util/evlist.h"  #include "util/evsel.h" +#include "util/evsel_fprintf.h" +#include "util/evswitch.h"  #include "util/sort.h"  #include "util/data.h"  #include "util/auxtrace.h" @@ -27,6 +30,7 @@  #include "util/thread-stack.h"  #include "util/time-utils.h"  #include "util/path.h" +#include "ui/ui.h"  #include "print_binary.h"  #include "archinsn.h"  #include <linux/bitmap.h> @@ -48,6 +52,11 @@  #include <fcntl.h>  #include <unistd.h>  #include <subcmd/pager.h> +#include <perf/evlist.h> +#include <linux/err.h> +#include "util/record.h" +#include "util/util.h" +#include "perf.h"  #include <linux/ctype.h> @@ -242,7 +251,7 @@ static struct {  	},  }; -struct perf_evsel_script { +struct evsel_script {         char *filename;         FILE *fp;         u64  samples; @@ -251,15 +260,15 @@ struct perf_evsel_script {         int  gnum;  }; -static inline struct perf_evsel_script *evsel_script(struct perf_evsel *evsel) +static inline struct evsel_script *evsel_script(struct evsel *evsel)  { -	return (struct perf_evsel_script *)evsel->priv; +	return (struct evsel_script *)evsel->priv;  } -static struct perf_evsel_script *perf_evsel_script__new(struct perf_evsel *evsel, +static struct evsel_script *perf_evsel_script__new(struct evsel *evsel,  							struct perf_data *data)  { -	struct perf_evsel_script *es = zalloc(sizeof(*es)); +	struct evsel_script *es = zalloc(sizeof(*es));  	if (es != NULL) {  		if (asprintf(&es->filename, "%s.%s.dump", data->file.path, perf_evsel__name(evsel)) < 0) @@ -277,7 +286,7 @@ out_free:  	return NULL;  } -static void perf_evsel_script__delete(struct perf_evsel_script *es) +static void perf_evsel_script__delete(struct evsel_script *es)  {  	zfree(&es->filename);  	fclose(es->fp); @@ -285,7 +294,7 @@ static void perf_evsel_script__delete(struct perf_evsel_script *es)  	free(es);  } -static int perf_evsel_script__fprintf(struct perf_evsel_script *es, FILE *fp) +static int perf_evsel_script__fprintf(struct evsel_script *es, FILE *fp)  {  	struct stat st; @@ -340,12 +349,12 @@ static const char *output_field2str(enum perf_output_field field)  #define PRINT_FIELD(x)  (output[output_type(attr->type)].fields & PERF_OUTPUT_##x) -static int perf_evsel__do_check_stype(struct perf_evsel *evsel, +static int perf_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->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	int type = output_type(attr->type);  	const char *evname; @@ -372,7 +381,7 @@ static int perf_evsel__do_check_stype(struct perf_evsel *evsel,  	return 0;  } -static int perf_evsel__check_stype(struct perf_evsel *evsel, +static int perf_evsel__check_stype(struct evsel *evsel,  				   u64 sample_type, const char *sample_msg,  				   enum perf_output_field field)  { @@ -380,10 +389,10 @@ static int perf_evsel__check_stype(struct perf_evsel *evsel,  					  false);  } -static int perf_evsel__check_attr(struct perf_evsel *evsel, +static int perf_evsel__check_attr(struct evsel *evsel,  				  struct perf_session *session)  { -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	bool allow_user_set;  	if (perf_header__has_feat(&session->header, HEADER_STAT)) @@ -418,7 +427,7 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,  		return -EINVAL;  	if (PRINT_FIELD(SYM) && -		!(evsel->attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { +		!(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {  		pr_err("Display of symbols requested but neither sample IP nor "  			   "sample address\navailable. Hence, no addresses to convert "  		       "to symbols.\n"); @@ -430,7 +439,7 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,  		return -EINVAL;  	}  	if (PRINT_FIELD(DSO) && -		!(evsel->attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { +		!(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {  		pr_err("Display of DSO requested but no address to convert.\n");  		return -EINVAL;  	} @@ -507,7 +516,7 @@ static void set_print_ip_opts(struct perf_event_attr *attr)  static int perf_session__check_output_opt(struct perf_session *session)  {  	unsigned int j; -	struct perf_evsel *evsel; +	struct evsel *evsel;  	for (j = 0; j < OUTPUT_TYPE_MAX; ++j) {  		evsel = perf_session__find_first_evtype(session, attr_type(j)); @@ -531,7 +540,7 @@ static int perf_session__check_output_opt(struct perf_session *session)  		if (evsel == NULL)  			continue; -		set_print_ip_opts(&evsel->attr); +		set_print_ip_opts(&evsel->core.attr);  	}  	if (!no_callchain) { @@ -558,7 +567,7 @@ static int perf_session__check_output_opt(struct perf_session *session)  		j = PERF_TYPE_TRACEPOINT;  		evlist__for_each_entry(session->evlist, evsel) { -			if (evsel->attr.type != j) +			if (evsel->core.attr.type != j)  				continue;  			if (evsel__has_callchain(evsel)) { @@ -566,7 +575,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->attr); +				set_print_ip_opts(&evsel->core.attr);  				goto out;  			}  		} @@ -614,10 +623,10 @@ static int perf_sample__fprintf_uregs(struct perf_sample *sample,  static int perf_sample__fprintf_start(struct perf_sample *sample,  				      struct thread *thread, -				      struct perf_evsel *evsel, +				      struct evsel *evsel,  				      u32 type, FILE *fp)  { -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	unsigned long secs;  	unsigned long long nsecs;  	int printed = 0; @@ -1162,13 +1171,13 @@ out:  }  static const char *resolve_branch_sym(struct perf_sample *sample, -				      struct perf_evsel *evsel, +				      struct evsel *evsel,  				      struct thread *thread,  				      struct addr_location *al,  				      u64 *ip)  {  	struct addr_location addr_al; -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	const char *name = NULL;  	if (sample->flags & (PERF_IP_FLAG_CALL | PERF_IP_FLAG_TRACE_BEGIN)) { @@ -1191,11 +1200,11 @@ static const char *resolve_branch_sym(struct perf_sample *sample,  }  static int perf_sample__fprintf_callindent(struct perf_sample *sample, -					   struct perf_evsel *evsel, +					   struct evsel *evsel,  					   struct thread *thread,  					   struct addr_location *al, FILE *fp)  { -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	size_t depth = thread_stack__depth(thread, sample->cpu);  	const char *name = NULL;  	static int spacing; @@ -1285,12 +1294,12 @@ static int perf_sample__fprintf_ipc(struct perf_sample *sample,  }  static int perf_sample__fprintf_bts(struct perf_sample *sample, -				    struct perf_evsel *evsel, +				    struct evsel *evsel,  				    struct thread *thread,  				    struct addr_location *al,  				    struct machine *machine, FILE *fp)  { -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	unsigned int type = output_type(attr->type);  	bool print_srcline_last = false;  	int printed = 0; @@ -1317,12 +1326,13 @@ static int perf_sample__fprintf_bts(struct perf_sample *sample,  		} else  			printed += fprintf(fp, "\n"); -		printed += sample__fprintf_sym(sample, al, 0, print_opts, cursor, fp); +		printed += sample__fprintf_sym(sample, al, 0, print_opts, cursor, +					       symbol_conf.bt_stop_list, fp);  	}  	/* print branch_to information */  	if (PRINT_FIELD(ADDR) || -	    ((evsel->attr.sample_type & PERF_SAMPLE_ADDR) && +	    ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&  	     !output[type].user_set)) {  		printed += fprintf(fp, " => ");  		printed += perf_sample__fprintf_addr(sample, thread, attr, fp); @@ -1593,9 +1603,9 @@ static int perf_sample__fprintf_synth_cbr(struct perf_sample *sample, FILE *fp)  }  static int perf_sample__fprintf_synth(struct perf_sample *sample, -				      struct perf_evsel *evsel, FILE *fp) +				      struct evsel *evsel, FILE *fp)  { -	switch (evsel->attr.config) { +	switch (evsel->core.attr.config) {  	case PERF_SYNTH_INTEL_PTWRITE:  		return perf_sample__fprintf_synth_ptwrite(sample, fp);  	case PERF_SYNTH_INTEL_MWAIT: @@ -1627,8 +1637,9 @@ struct perf_script {  	bool			show_bpf_events;  	bool			allocated;  	bool			per_event_dump; -	struct cpu_map		*cpus; -	struct thread_map	*threads; +	struct evswitch		evswitch; +	struct perf_cpu_map	*cpus; +	struct perf_thread_map *threads;  	int			name_width;  	const char              *time_str;  	struct perf_time_interval *ptime_range; @@ -1636,9 +1647,9 @@ struct perf_script {  	int			range_num;  }; -static int perf_evlist__max_name_len(struct perf_evlist *evlist) +static int perf_evlist__max_name_len(struct evlist *evlist)  { -	struct perf_evsel *evsel; +	struct evsel *evsel;  	int max = 0;  	evlist__for_each_entry(evlist, evsel) { @@ -1670,7 +1681,7 @@ static int data_src__fprintf(u64 data_src, FILE *fp)  struct metric_ctx {  	struct perf_sample	*sample;  	struct thread		*thread; -	struct perf_evsel	*evsel; +	struct evsel	*evsel;  	FILE 			*fp;  }; @@ -1705,7 +1716,7 @@ static void script_new_line(struct perf_stat_config *config __maybe_unused,  static void perf_sample__fprint_metric(struct perf_script *script,  				       struct thread *thread, -				       struct perf_evsel *evsel, +				       struct evsel *evsel,  				       struct perf_sample *sample,  				       FILE *fp)  { @@ -1720,7 +1731,7 @@ static void perf_sample__fprint_metric(struct perf_script *script,  			 },  		.force_header = false,  	}; -	struct perf_evsel *ev2; +	struct evsel *ev2;  	u64 val;  	if (!evsel->stats) @@ -1733,7 +1744,7 @@ static void perf_sample__fprint_metric(struct perf_script *script,  				       sample->cpu,  				       &rt_stat);  	evsel_script(evsel)->val = val; -	if (evsel_script(evsel->leader)->gnum == evsel->leader->nr_members) { +	if (evsel_script(evsel->leader)->gnum == evsel->leader->core.nr_members) {  		for_each_group_member (ev2, evsel->leader) {  			perf_stat__print_shadow_stats(&stat_config, ev2,  						      evsel_script(ev2)->val, @@ -1747,7 +1758,7 @@ static void perf_sample__fprint_metric(struct perf_script *script,  }  static bool show_event(struct perf_sample *sample, -		       struct perf_evsel *evsel, +		       struct evsel *evsel,  		       struct thread *thread,  		       struct addr_location *al)  { @@ -1788,14 +1799,14 @@ static bool show_event(struct perf_sample *sample,  }  static void process_event(struct perf_script *script, -			  struct perf_sample *sample, struct perf_evsel *evsel, +			  struct perf_sample *sample, struct evsel *evsel,  			  struct addr_location *al,  			  struct machine *machine)  {  	struct thread *thread = al->thread; -	struct perf_event_attr *attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->core.attr;  	unsigned int type = output_type(attr->type); -	struct perf_evsel_script *es = evsel->priv; +	struct evsel_script *es = evsel->priv;  	FILE *fp = es->fp;  	if (output[type].fields == 0) @@ -1804,6 +1815,9 @@ static void process_event(struct perf_script *script,  	if (!show_event(sample, evsel, thread, al))  		return; +	if (evswitch__discard(&script->evswitch, evsel)) +		return; +  	++es->samples;  	perf_sample__fprintf_start(sample, thread, evsel, @@ -1855,7 +1869,8 @@ static void process_event(struct perf_script *script,  			cursor = &callchain_cursor;  		fputc(cursor ? '\n' : ' ', fp); -		sample__fprintf_sym(sample, al, 0, output[type].print_ip_opts, cursor, fp); +		sample__fprintf_sym(sample, al, 0, output[type].print_ip_opts, cursor, +				    symbol_conf.bt_stop_list, fp);  	}  	if (PRINT_FIELD(IREGS)) @@ -1897,14 +1912,14 @@ static void process_event(struct perf_script *script,  static struct scripting_ops	*scripting_ops; -static void __process_stat(struct perf_evsel *counter, u64 tstamp) +static void __process_stat(struct evsel *counter, u64 tstamp)  { -	int nthreads = thread_map__nr(counter->threads); +	int nthreads = perf_thread_map__nr(counter->core.threads);  	int ncpus = perf_evsel__nr_cpus(counter);  	int cpu, thread;  	static int header_printed; -	if (counter->system_wide) +	if (counter->core.system_wide)  		nthreads = 1;  	if (!header_printed) { @@ -1920,8 +1935,8 @@ static void __process_stat(struct perf_evsel *counter, u64 tstamp)  			counts = perf_counts(counter->counts, cpu, thread);  			printf("%3d %8d %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %s\n", -				counter->cpus->map[cpu], -				thread_map__pid(counter->threads, thread), +				counter->core.cpus->map[cpu], +				perf_thread_map__pid(counter->core.threads, thread),  				counts->val,  				counts->ena,  				counts->run, @@ -1931,7 +1946,7 @@ static void __process_stat(struct perf_evsel *counter, u64 tstamp)  	}  } -static void process_stat(struct perf_evsel *counter, u64 tstamp) +static void process_stat(struct evsel *counter, u64 tstamp)  {  	if (scripting_ops && scripting_ops->process_stat)  		scripting_ops->process_stat(&stat_config, counter, tstamp); @@ -1973,7 +1988,7 @@ static bool filter_cpu(struct perf_sample *sample)  static int process_sample_event(struct perf_tool *tool,  				union perf_event *event,  				struct perf_sample *sample, -				struct perf_evsel *evsel, +				struct evsel *evsel,  				struct machine *machine)  {  	struct perf_script *scr = container_of(tool, struct perf_script, tool); @@ -2018,20 +2033,20 @@ out_put:  }  static int process_attr(struct perf_tool *tool, union perf_event *event, -			struct perf_evlist **pevlist) +			struct evlist **pevlist)  {  	struct perf_script *scr = container_of(tool, struct perf_script, tool); -	struct perf_evlist *evlist; -	struct perf_evsel *evsel, *pos; +	struct evlist *evlist; +	struct evsel *evsel, *pos;  	int err; -	static struct perf_evsel_script *es; +	static struct evsel_script *es;  	err = perf_event__process_attr(tool, event, pevlist);  	if (err)  		return err;  	evlist = *pevlist; -	evsel = perf_evlist__last(*pevlist); +	evsel = evlist__last(*pevlist);  	if (!evsel->priv) {  		if (scr->per_event_dump) { @@ -2046,18 +2061,18 @@ static int process_attr(struct perf_tool *tool, union perf_event *event,  		}  	} -	if (evsel->attr.type >= PERF_TYPE_MAX && -	    evsel->attr.type != PERF_TYPE_SYNTH) +	if (evsel->core.attr.type >= PERF_TYPE_MAX && +	    evsel->core.attr.type != PERF_TYPE_SYNTH)  		return 0;  	evlist__for_each_entry(evlist, pos) { -		if (pos->attr.type == evsel->attr.type && pos != evsel) +		if (pos->core.attr.type == evsel->core.attr.type && pos != evsel)  			return 0;  	} -	set_print_ip_opts(&evsel->attr); +	set_print_ip_opts(&evsel->core.attr); -	if (evsel->attr.sample_type) +	if (evsel->core.attr.sample_type)  		err = perf_evsel__check_attr(evsel, scr->session);  	return err; @@ -2071,7 +2086,7 @@ static int process_comm_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	int ret = -1;  	thread = machine__findnew_thread(machine, event->comm.pid, event->comm.tid); @@ -2083,7 +2098,7 @@ static int process_comm_event(struct perf_tool *tool,  	if (perf_event__process_comm(tool, event, sample, machine) < 0)  		goto out; -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = 0;  		sample->tid = event->comm.tid; @@ -2108,7 +2123,7 @@ static int process_namespaces_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	int ret = -1;  	thread = machine__findnew_thread(machine, event->namespaces.pid, @@ -2121,7 +2136,7 @@ static int process_namespaces_event(struct perf_tool *tool,  	if (perf_event__process_namespaces(tool, event, sample, machine) < 0)  		goto out; -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = 0;  		sample->tid = event->namespaces.tid; @@ -2146,7 +2161,7 @@ static int process_fork_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	if (perf_event__process_fork(tool, event, sample, machine) < 0)  		return -1; @@ -2157,7 +2172,7 @@ static int process_fork_event(struct perf_tool *tool,  		return -1;  	} -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = event->fork.time;  		sample->tid = event->fork.tid; @@ -2181,7 +2196,7 @@ static int process_exit_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	thread = machine__findnew_thread(machine, event->fork.pid, event->fork.tid);  	if (thread == NULL) { @@ -2189,7 +2204,7 @@ static int process_exit_event(struct perf_tool *tool,  		return -1;  	} -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = 0;  		sample->tid = event->fork.tid; @@ -2216,7 +2231,7 @@ static int process_mmap_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	if (perf_event__process_mmap(tool, event, sample, machine) < 0)  		return -1; @@ -2227,7 +2242,7 @@ static int process_mmap_event(struct perf_tool *tool,  		return -1;  	} -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = 0;  		sample->tid = event->mmap.tid; @@ -2250,7 +2265,7 @@ static int process_mmap2_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	if (perf_event__process_mmap2(tool, event, sample, machine) < 0)  		return -1; @@ -2261,7 +2276,7 @@ static int process_mmap2_event(struct perf_tool *tool,  		return -1;  	} -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		sample->cpu = 0;  		sample->time = 0;  		sample->tid = event->mmap2.tid; @@ -2284,7 +2299,7 @@ static int process_switch_event(struct perf_tool *tool,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	if (perf_event__process_switch(tool, event, sample, machine) < 0)  		return -1; @@ -2319,7 +2334,7 @@ process_lost_event(struct perf_tool *tool,  {  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	struct thread *thread;  	thread = machine__findnew_thread(machine, sample->pid, @@ -2355,12 +2370,12 @@ process_bpf_events(struct perf_tool *tool __maybe_unused,  	struct thread *thread;  	struct perf_script *script = container_of(tool, struct perf_script, tool);  	struct perf_session *session = script->session; -	struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id); +	struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);  	if (machine__process_ksymbol(machine, event, sample) < 0)  		return -1; -	if (!evsel->attr.sample_id_all) { +	if (!evsel->core.attr.sample_id_all) {  		perf_event__fprintf(event, stdout);  		return 0;  	} @@ -2388,8 +2403,8 @@ static void sig_handler(int sig __maybe_unused)  static void perf_script__fclose_per_event_dump(struct perf_script *script)  { -	struct perf_evlist *evlist = script->session->evlist; -	struct perf_evsel *evsel; +	struct evlist *evlist = script->session->evlist; +	struct evsel *evsel;  	evlist__for_each_entry(evlist, evsel) {  		if (!evsel->priv) @@ -2401,7 +2416,7 @@ static void perf_script__fclose_per_event_dump(struct perf_script *script)  static int perf_script__fopen_per_event_dump(struct perf_script *script)  { -	struct perf_evsel *evsel; +	struct evsel *evsel;  	evlist__for_each_entry(script->session->evlist, evsel) {  		/* @@ -2428,8 +2443,8 @@ out_err_fclose:  static int perf_script__setup_per_event_dump(struct perf_script *script)  { -	struct perf_evsel *evsel; -	static struct perf_evsel_script es_stdout; +	struct evsel *evsel; +	static struct evsel_script es_stdout;  	if (script->per_event_dump)  		return perf_script__fopen_per_event_dump(script); @@ -2444,10 +2459,10 @@ static int perf_script__setup_per_event_dump(struct perf_script *script)  static void perf_script__exit_per_event_dump_stats(struct perf_script *script)  { -	struct perf_evsel *evsel; +	struct evsel *evsel;  	evlist__for_each_entry(script->session->evlist, evsel) { -		struct perf_evsel_script *es = evsel->priv; +		struct evsel_script *es = evsel->priv;  		perf_evsel_script__fprintf(es, stdout);  		perf_evsel_script__delete(es); @@ -2484,8 +2499,8 @@ static int __cmd_script(struct perf_script *script)  		script->tool.finished_round = process_finished_round_event;  	}  	if (script->show_bpf_events) { -		script->tool.ksymbol   = process_bpf_events; -		script->tool.bpf_event = process_bpf_events; +		script->tool.ksymbol = process_bpf_events; +		script->tool.bpf     = process_bpf_events;  	}  	if (perf_script__setup_per_event_dump(script)) { @@ -3003,7 +3018,7 @@ static int check_ev_match(char *dir_name, char *scriptname,  {  	char filename[MAXPATHLEN], evname[128];  	char line[BUFSIZ], *p; -	struct perf_evsel *pos; +	struct evsel *pos;  	int match, len;  	FILE *fp; @@ -3072,8 +3087,8 @@ int find_scripts(char **scripts_array, char **scripts_path_array, int num,  	int i = 0;  	session = perf_session__new(&data, false, NULL); -	if (!session) -		return -1; +	if (IS_ERR(session)) +		return PTR_ERR(session);  	snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path()); @@ -3235,8 +3250,8 @@ static void script__setup_sample_type(struct perf_script *script)  static int process_stat_round_event(struct perf_session *session,  				    union perf_event *event)  { -	struct stat_round_event *round = &event->stat_round; -	struct perf_evsel *counter; +	struct perf_record_stat_round *round = &event->stat_round; +	struct evsel *counter;  	evlist__for_each_entry(session->evlist, counter) {  		perf_stat_process_counter(&stat_config, counter); @@ -3256,7 +3271,7 @@ static int process_stat_config_event(struct perf_session *session __maybe_unused  static int set_maps(struct perf_script *script)  { -	struct perf_evlist *evlist = script->session->evlist; +	struct evlist *evlist = script->session->evlist;  	if (!script->cpus || !script->threads)  		return 0; @@ -3264,7 +3279,7 @@ static int set_maps(struct perf_script *script)  	if (WARN_ONCE(script->allocated, "stats double allocation\n"))  		return -EINVAL; -	perf_evlist__set_maps(evlist, script->cpus, script->threads); +	perf_evlist__set_maps(&evlist->core, script->cpus, script->threads);  	if (perf_evlist__alloc_stats(evlist, true))  		return -ENOMEM; @@ -3537,6 +3552,7 @@ int cmd_script(int argc, const char **argv)  		   "file", "file saving guest os /proc/kallsyms"),  	OPT_STRING(0, "guestmodules", &symbol_conf.default_guest_modules,  		   "file", "file saving guest os /proc/modules"), +	OPTS_EVSWITCH(&script.evswitch),  	OPT_END()  	};  	const char * const script_subcommands[] = { "record", "report", NULL }; @@ -3742,8 +3758,8 @@ int cmd_script(int argc, const char **argv)  	}  	session = perf_session__new(&data, false, &script.tool); -	if (session == NULL) -		return -1; +	if (IS_ERR(session)) +		return PTR_ERR(session);  	if (header || header_only) {  		script.tool.show_feat_hdr = SHOW_FEAT_HEADER; @@ -3861,6 +3877,10 @@ int cmd_script(int argc, const char **argv)  						  script.range_num);  	} +	err = evswitch__init(&script.evswitch, session->evlist, stderr); +	if (err) +		goto out_delete; +  	err = __cmd_script(&script);  	flush_scripting();  |