 ee29be625b
			
		
	
	
	ee29be625b
	
	
	
		
			
			Since we already ask for PERF_SAMPLE_ID and use it to quickly find the
associated evsel, add handler func + data to struct perf_evsel to avoid
using chains of if(strcmp(event_name)) and also to avoid all the linear
list searches via trace_event_find.
To demonstrate the technique convert 'perf sched' to it:
 # perf sched record sleep 5m
And then:
 Performance counter stats for '/tmp/oldperf sched lat':
        646.929438 task-clock                #    0.999 CPUs utilized
                 9 context-switches          #    0.000 M/sec
                 0 CPU-migrations            #    0.000 M/sec
            20,901 page-faults               #    0.032 M/sec
     1,290,144,450 cycles                    #    1.994 GHz
   <not supported> stalled-cycles-frontend
   <not supported> stalled-cycles-backend
     1,606,158,439 instructions              #    1.24  insns per cycle
       339,088,395 branches                  #  524.151 M/sec
         4,550,735 branch-misses             #    1.34% of all branches
       0.647524759 seconds time elapsed
Versus:
 Performance counter stats for 'perf sched lat':
        473.564691 task-clock                #    0.999 CPUs utilized
                 9 context-switches          #    0.000 M/sec
                 0 CPU-migrations            #    0.000 M/sec
            20,903 page-faults               #    0.044 M/sec
       944,367,984 cycles                    #    1.994 GHz
   <not supported> stalled-cycles-frontend
   <not supported> stalled-cycles-backend
     1,442,385,571 instructions              #    1.53  insns per cycle
       308,383,106 branches                  #  651.195 M/sec
         4,481,784 branch-misses             #    1.45% of all branches
       0.474215751 seconds time elapsed
[root@emilia ~]#
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-1kbzpl74lwi6lavpqke2u2p3@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
	
			
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __PERF_TOOL_H
 | |
| #define __PERF_TOOL_H
 | |
| 
 | |
| #include <stdbool.h>
 | |
| 
 | |
| struct perf_session;
 | |
| union perf_event;
 | |
| struct perf_evlist;
 | |
| struct perf_evsel;
 | |
| struct perf_sample;
 | |
| struct perf_tool;
 | |
| struct machine;
 | |
| 
 | |
| typedef int (*event_sample)(struct perf_tool *tool, union perf_event *event,
 | |
| 			    struct perf_sample *sample,
 | |
| 			    struct perf_evsel *evsel, struct machine *machine);
 | |
| 
 | |
| typedef int (*event_op)(struct perf_tool *tool, union perf_event *event,
 | |
| 			struct perf_sample *sample, struct machine *machine);
 | |
| 
 | |
| typedef int (*event_attr_op)(union perf_event *event,
 | |
| 			     struct perf_evlist **pevlist);
 | |
| typedef int (*event_simple_op)(struct perf_tool *tool, union perf_event *event);
 | |
| 
 | |
| typedef int (*event_synth_op)(union perf_event *event,
 | |
| 			      struct perf_session *session);
 | |
| 
 | |
| typedef int (*event_op2)(struct perf_tool *tool, union perf_event *event,
 | |
| 			 struct perf_session *session);
 | |
| 
 | |
| struct perf_tool {
 | |
| 	event_sample	sample,
 | |
| 			read;
 | |
| 	event_op	mmap,
 | |
| 			comm,
 | |
| 			fork,
 | |
| 			exit,
 | |
| 			lost,
 | |
| 			throttle,
 | |
| 			unthrottle;
 | |
| 	event_attr_op	attr;
 | |
| 	event_synth_op	tracing_data;
 | |
| 	event_simple_op	event_type;
 | |
| 	event_op2	finished_round,
 | |
| 			build_id;
 | |
| 	bool		ordered_samples;
 | |
| 	bool		ordering_requires_timestamps;
 | |
| };
 | |
| 
 | |
| #endif /* __PERF_TOOL_H */
 |