perf fixes/updates
Subsystems (5)
Linus,
Please pull the latest perf-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf-fixes-for-linus
It includes the v2.6.39 Oprofile bits, some late tools/perf infrastructure updates and fixes.
Thanks,
Ingo
------------------>
Anton Blanchard (1):
perf, powerpc: Handle events that raise an exception without overflowing
Arnaldo Carvalho de Melo (5):
perf top: Remove redundant perf_top->sym_counter
perf top: Remove redundant syme->origin field
perf symbols: Rename dso->origin to dso->symtab_type
perf symbol: Move sym_entry->skip to symbol->ignore
perf evlist: New command to list the names of events present in a perf.data fileDavid Ahern (6):
perf script: Change process_event prototype
perf tracing: Remove print_graph_cpu and print_graph_proc from trace-event-parse perf script: Move printing of 'common' data from print_event and rename perf script: Support custom field selection for output
perf script: Add support for dumping symbols
perf script: Add support for H/W and S/W events
David Rientjes (1):
trace, documentation: Fix branch profiling location in debugfs
Frederic Weisbecker (3):
perf stat: Provide support for filters
perf: Fix the software events state check
perf: Handle stopped state with tracepoints
Heinz Graalfs (4):
oprofile: Introduce new oprofile sample add function (oprofile_add_ext_hw_sample) oprofile, s390: Add support for hardware based sampling on System z processors oprofile, s390: Enhance OProfile to support System zs hardware sampling feature oprofile, s390: Remove hwsampler_files.c and merge it into init.c
Ingo Molnar (1):
trace, filters: Initialize the match variable in process_ops() properly
Josh Hunt (1):
perf tools: Version incorrect with some versions of grep
Lin Ming (2):
perf, x86: Clean up SandyBridge PEBS events
perf, x86: Use INTEL_*_CONSTRAINT() for all PEBS event constraints
Marcin Slusarz (1):
perf lock: Fix sorting by wait_min
Peter Zijlstra (1):
perf: Fix tear-down of inherited group events
Richard Kennedy (1):
perf: Reorder & optimize perf_event_context to remove alignment padding on 64 bit builds
Robert Richter (3):
oprofile, s390: Rework hwsampler implementation oprofile, s390: Fix section mismatch of function hws_cpu_callback() oprofile, s390: Cleanups
arch/powerpc/include/asm/reg.h | 1 + arch/powerpc/kernel/perf_event.c | 24 +- arch/s390/oprofile/Makefile | 2 +- arch/s390/oprofile/hwsampler.c | 1256 ++++++++++++++++++++ arch/s390/oprofile/hwsampler.h | 113 ++ arch/s390/oprofile/init.c | 165 +++- arch/x86/kernel/cpu/perf_event.c | 2 - arch/x86/kernel/cpu/perf_event_intel_ds.c | 112 +- drivers/oprofile/cpu_buffer.c | 24 +- drivers/oprofile/timer_int.c | 4 +- include/linux/oprofile.h | 7 + include/linux/perf_event.h | 2 +- kernel/perf_event.c | 17 +- kernel/trace/Kconfig | 4 +- kernel/trace/trace_events_filter.c | 2 +- tools/perf/Documentation/perf-evlist.txt | 26 + tools/perf/Documentation/perf-script.txt | 22 + tools/perf/Makefile | 1 + tools/perf/builtin-evlist.c | 54 + tools/perf/builtin-lock.c | 13 +- tools/perf/builtin-script.c | 300 +++++- tools/perf/builtin-stat.c | 8 + tools/perf/builtin-top.c | 20 +- tools/perf/builtin.h | 1 + tools/perf/command-list.txt | 1 + tools/perf/perf.c | 1 + tools/perf/util/PERF-VERSION-GEN | 8 +- tools/perf/util/annotate.c | 2 +- tools/perf/util/parse-events.c | 22 + tools/perf/util/parse-events.h | 1 + .../perf/util/scripting-engines/trace-event-perl.c | 11 +- .../util/scripting-engines/trace-event-python.c | 11 +- tools/perf/util/session.c | 61 + tools/perf/util/session.h | 4 + tools/perf/util/symbol.c | 64 +- tools/perf/util/symbol.h | 31 +- tools/perf/util/top.c | 6 +- tools/perf/util/top.h | 4 +- tools/perf/util/trace-event-parse.c | 110 +-- tools/perf/util/trace-event-scripting.c | 9 +- tools/perf/util/trace-event.h | 10 +- 41 files changed, 2240 insertions(+), 296 deletions(-) create mode 100644 arch/s390/oprofile/hwsampler.c create mode 100644 arch/s390/oprofile/hwsampler.h create mode 100644 tools/perf/Documentation/perf-evlist.txt create mode 100644 tools/perf/builtin-evlist.c
arch/powerpc/include/asm/reg.h +1 -0
@@ -880,6 +880,7 @@#define PV_970 0x0039#define PV_POWER5 0x003A#define PV_POWER5p 0x003B +#define PV_POWER7 0x003F#define PV_970FX 0x003C#define PV_630 0x0040#define PV_630p 0x0041
arch/powerpc/kernel/perf_event.c +23 -1
@@ -1269,6 +1269,28 @@ unsigned long perf_instruction_pointer(struct pt_regs *regs)return ip; } +static bool pmc_overflow (unsigned long val) +{ +if ((int )val <0 ) +return true; + +/* +* Events on POWER7 can roll back if a speculative event doesn't +* eventually complete. Unfortunately in some rare cases they will +* raise a performance monitor exception. We need to catch this to +* ensure we reset the PMC. In all cases the PMC will be 256 or less +* cycles from overflow. +* +* We only do this if the first pass fails to find any overflowing +* PMCs because a user might set a period of less than 256 and we +* don't want to mistakenly reset them. +*/ +if (__is_processor (PV_POWER7 ) && ((0x80000000 - val) <=256 )) +return true; + +return false; +} +/* * Performance monitor interrupt stuff */
@@ -1316,7 +1338,7 @@ static void perf_event_interrupt(struct pt_regs *regs)if (is_limited_pmc (i +1 ))continue ; val =read_pmc (i +1 ); -if ((int )val <0 ) +if (pmc_overflow (val))write_pmc (i +1 ,0 ); } }
arch/s390/oprofile/Makefile +1 -1
@@ -6,4 +6,4 @@ DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \ oprofilefs.o oprofile_stats.o \ timer_int.o ) -oprofile-y := $(DRIVER_OBJS) init.o backtrace.o +oprofile-y := $(DRIVER_OBJS) init.o backtrace.o hwsampler.o
arch/s390/oprofile/hwsampler.c new file +1256 -0
1,256 lines not on this page · raw message
arch/s390/oprofile/hwsampler.h new file +113 -0
113 lines not on this page · raw message
arch/s390/oprofile/init.c +162 -3
185 lines not on this page · raw message
arch/x86/kernel/cpu/perf_event.c +0 -2
@@ -178,8 +178,6 @@ struct cpu_hw_events {*/ #define INTEL_UEVENT_CONSTRAINT (c, n) \ EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK) -#define PEBS_EVENT_CONSTRAINT (c, n) \ - INTEL_UEVENT_CONSTRAINT(c, n)#define EVENT_CONSTRAINT_END \ EVENT_CONSTRAINT(0, 0, 0)
arch/x86/kernel/cpu/perf_event_intel_ds.c +47 -65
134 lines not on this page · raw message
drivers/oprofile/cpu_buffer.c +17 -7
@@ -258,8 +258,10 @@ op_add_sample(struct oprofile_cpu_buffer *cpu_buf,*/ static int log_sample (struct oprofile_cpu_buffer *cpu_buf,unsigned long pc, -unsigned long backtrace,int is_kernel,unsigned long event) +unsigned long backtrace,int is_kernel,unsigned long event, +struct task_struct *task) { +struct task_struct *tsk = task ? task : current; cpu_buf->sample_received++;if (pc ==ESCAPE_CODE ) {
@@ -267,7 +269,7 @@ log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc,return 0 ; } -if (op_add_code (cpu_buf, backtrace, is_kernel, current)) +if (op_add_code (cpu_buf, backtrace, is_kernel, tsk)) goto fail;if (op_add_sample (cpu_buf, pc, event))
@@ -292,7 +294,8 @@ static inline void oprofile_end_trace(struct oprofile_cpu_buffer *cpu_buf)static inline void __oprofile_add_ext_sample (unsigned long pc,struct pt_regs *const regs, -unsigned long event,int is_kernel) +unsigned long event,int is_kernel, +struct task_struct *task) {struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var (op_cpu_buffer);unsigned long backtrace = oprofile_backtrace_depth;
@@ -301,7 +304,7 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,* if log_sample() fail we can't backtrace since we lost the * source of this event */ -if (!log_sample (cpu_buf, pc, backtrace, is_kernel, event)) +if (!log_sample (cpu_buf, pc, backtrace, is_kernel, event, task))/* failed */ return ;
@@ -313,10 +316,17 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,oprofile_end_trace (cpu_buf); } +void oprofile_add_ext_hw_sample (unsigned long pc,struct pt_regs *const regs, +unsigned long event,int is_kernel, +struct task_struct *task) +{ +__oprofile_add_ext_sample (pc, regs, event, is_kernel, task); +} +void oprofile_add_ext_sample (unsigned long pc,struct pt_regs *const regs,unsigned long event,int is_kernel) { -__oprofile_add_ext_sample (pc, regs, event, is_kernel); +__oprofile_add_ext_sample (pc, regs, event, is_kernel,NULL ); }void oprofile_add_sample (struct pt_regs *const regs,unsigned long event)
@@ -332,7 +342,7 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) pc =ESCAPE_CODE ;/* as this causes an early return. */ } -__oprofile_add_ext_sample (pc, regs, event, is_kernel); +__oprofile_add_ext_sample (pc, regs, event, is_kernel,NULL ); }/*
@@ -403,7 +413,7 @@ int oprofile_write_commit(struct op_entry *entry)void oprofile_add_pc (unsigned long pc,int is_kernel,unsigned long event) {struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var (op_cpu_buffer); -log_sample (cpu_buf, pc,0 , is_kernel, event); +log_sample (cpu_buf, pc,0 , is_kernel, event,NULL ); }void oprofile_add_trace (unsigned long pc)
drivers/oprofile/timer_int.c +2 -2
@@ -97,7 +97,7 @@ static struct notifier_block __refdata oprofile_cpu_notifier = { .notifier_call = oprofile_cpu_notify, }; -int __init oprofile_timer_init (struct oprofile_operations *ops) +int oprofile_timer_init (struct oprofile_operations *ops) {int rc;
@@ -113,7 +113,7 @@ int __init oprofile_timer_init(struct oprofile_operations *ops)return 0 ; } -void __exit oprofile_timer_exit(void) +void oprofile_timer_exit (void ) {unregister_hotcpu_notifier (&oprofile_cpu_notifier); }
include/linux/oprofile.h +7 -0
@@ -106,6 +106,13 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event);void oprofile_add_ext_sample (unsigned long pc,struct pt_regs *const regs,unsigned long event,int is_kernel); +/** +* Add an hardware sample. +*/ +void oprofile_add_ext_hw_sample (unsigned long pc,struct pt_regs *const regs, +unsigned long event,int is_kernel, +struct task_struct *task); +/* Use this instead when the PC value is not from the regs. Doesn't * backtrace. */ void oprofile_add_pc (unsigned long pc,int is_kernel,unsigned long event);
include/linux/perf_event.h +1 -1
@@ -878,8 +878,8 @@ enum perf_event_context_type {* Used as a container for task events and CPU events as well: */ struct perf_event_context { -enum perf_event_context_type type;struct pmu *pmu; +enum perf_event_context_type type;/* * Protect the states of the events in the list, * nr_active, and the list:
kernel/perf_event.c +11 -6
@@ -5122,7 +5122,7 @@ static int perf_exclude_event(struct perf_event *event, struct pt_regs *regs) {if (event->hw.state &PERF_HES_STOPPED ) -return 0 ; +return 1 ;if (regs) {if (event->attr.exclude_user &&user_mode (regs))
@@ -5478,6 +5478,8 @@ static int perf_tp_event_match(struct perf_event *event, struct perf_sample_data *data, struct pt_regs *regs) { +if (event->hw.state &PERF_HES_STOPPED ) +return 0 ;/* * All tracepoints are from kernel-space. */
@@ -6720,17 +6722,20 @@ __perf_event_exit_task(struct perf_event *child_event, struct perf_event_context *child_ctx, struct task_struct *child) { - struct perf_event *parent_event; +if (child_event->parent) { +raw_spin_lock_irq (&child_ctx->lock); +perf_group_detach (child_event); +raw_spin_unlock_irq (&child_ctx->lock); + }perf_remove_from_context (child_event); - parent_event = child_event->parent;/* -* It can happen that parent exits first, and has events +* It can happen that the parent exits first, and has events * that are still around due to the child reference. These -* events need to be zapped - but otherwise linger. +* events need to be zapped. */ -if (parent_event) { +if (child_event->parent) {sync_child_event (child_event, child);free_event (child_event); }
kernel/trace/Kconfig +2 -2
@@ -275,7 +275,7 @@ config PROFILE_ANNOTATED_BRANCHES This tracer profiles all the the likely and unlikely macros in the kernel. It will display the results in: - /sys/kernel/debug/tracing/profile_annotated_branch + /sys/kernel/debug/tracing/trace_stat/branch_annotated Note: this will add a significant overhead; only turn this on if you need to profile the system's use of these macros.
@@ -288,7 +288,7 @@ config PROFILE_ALL_BRANCHES taken in the kernel is recorded whether it hit or miss. The results will be displayed in: - /sys/kernel/debug/tracing/profile_branch + /sys/kernel/debug/tracing/trace_stat/branch_all This option also enables the likely/unlikely profiler.
kernel/trace/trace_events_filter.c +1 -1
@@ -391,8 +391,8 @@ static int process_ops(struct filter_pred *preds, struct filter_pred *op, void *rec) { struct filter_pred *pred; +int match =0 ;int type; -int match;int i;/*
tools/perf/Documentation/perf-evlist.txt new file +26 -0
@@ -0,0 +1,26 @@ +perf-evlist(1) +============== + +NAME +---- +perf-evlist - List the event names in a perf.data file + +SYNOPSIS +-------- +[verse] +'perf evlist <options>' + +DESCRIPTION +----------- +This command displays the names of events sampled in a perf.data file. + +OPTIONS +------- +-i:: +--input=:: + Input file name. (default: perf.data) + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-list[1], +linkperf:perf-report[1]
tools/perf/Documentation/perf-script.txt +22 -0
@@ -112,6 +112,28 @@ OPTIONS --debug-mode:: Do various checks like samples ordering and lost events. +-f:: +--fields + Comma separated list of fields to print. Options are: + comm, tid, pid, time, cpu, event, trace, sym. Field + list must be prepended with the type, trace, sw or hw, + to indicate to which event type the field list applies. + e.g., -f sw:comm,tid,time,sym and -f trace:time,cpu,trace + +-k:: +--vmlinux=<file>:: + vmlinux pathname + +--kallsyms=<file>:: + kallsyms pathname + +--symfs=<directory>:: + Look for files with symbols relative to this directory. + +-G:: +--hide-call-graph:: + When printing symbols do not display call chain. + SEE ALSO -------- linkperf:perf-record[1], linkperf:perf-script-perl[1],
tools/perf/Makefile +1 -0
@@ -338,6 +338,7 @@ endif BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o BUILTIN_OBJS += $(OUTPUT)builtin-diff.o +BUILTIN_OBJS += $(OUTPUT)builtin-evlist.o BUILTIN_OBJS += $(OUTPUT)builtin-help.o BUILTIN_OBJS += $(OUTPUT)builtin-sched.o BUILTIN_OBJS += $(OUTPUT)builtin-buildid-list.o
tools/perf/builtin-evlist.c new file +54 -0
54 lines not on this page · raw message
tools/perf/builtin-lock.c +12 -1
@@ -202,9 +202,20 @@ static struct thread_stat *thread_stat_findnew_first(u32 tid)SINGLE_KEY (nr_acquired)SINGLE_KEY (nr_contended )SINGLE_KEY (wait_time_total) -SINGLE_KEY (wait_time_min)SINGLE_KEY (wait_time_max) +static int lock_stat_key_wait_time_min(struct lock_stat *one, + struct lock_stat *two) +{ +u64 s1 = one->wait_time_min; +u64 s2 = two->wait_time_min; +if (s1 ==ULLONG_MAX ) + s1 =0 ; +if (s2 ==ULLONG_MAX ) + s2 =0 ; +return s1 > s2; +} +struct lock_key {/* * name: the value for specify by user
tools/perf/builtin-script.c +277 -23
355 lines not on this page · raw message
tools/perf/builtin-stat.c +8 -0
@@ -333,6 +333,12 @@ static int run_perf_stat(int argc __used, const char **argv) } } +if (perf_evlist__set_filters (evsel_list)) { +error ("failed to set filter with %d (%s)\n" , errno, +strerror (errno)); +return -1 ; + } +/* * Enable counters and exec the command: */
@@ -634,6 +640,8 @@ static const struct option options[] = {OPT_CALLBACK ('e' ,"event" , &evsel_list,"event" ,"event selector. use 'perf list' to list available events" , parse_events), +OPT_CALLBACK (0 ,"filter" , &evsel_list,"filter" , +"event filter" , parse_filter),OPT_BOOLEAN ('i' ,"no-inherit" , &no_inherit,"child tasks do not inherit counters" ), OPT_INTEGER('p', "pid", &target_pid,
tools/perf/builtin-top.c +10 -10
@@ -152,7 +152,7 @@ static int parse_source(struct sym_entry *syme)/* * We can't annotate with just /proc/kallsyms */ -if (map->dso->origin ==DSO__ORIG_KERNEL ) { +if (map->dso->symtab_type ==SYMTAB__KALLSYMS ) {pr_err ("Can't annotate %s: No vmlinux file was found in the " "path\n" , sym->name);sleep (1 );
@@ -515,24 +515,25 @@ static void handle_keypress(struct perf_session *session, int c)break ;case 'E' :if (top.evlist->nr_entries >1 ) { +int counter;fprintf (stderr,"\nAvailable events:" );list_for_each_entry (top.sym_evsel, &top.evlist->entries, node)fprintf (stderr,"\n\t%d %s" , top.sym_evsel->idx,event_name (top.sym_evsel)); -prompt_integer (&top.sym_counter,"Enter details event counter" ); +prompt_integer (&counter,"Enter details event counter" ); -if (top.sym_counter >= top.evlist->nr_entries) { +if (counter >= top.evlist->nr_entries) { top.sym_evsel = list_entry(top.evlist->entries.next, struct perf_evsel, node); - top.sym_counter =0 ;fprintf (stderr,"Sorry, no such event, using %s.\n" ,event_name (top.sym_evsel));sleep (1 );break ; }list_for_each_entry (top.sym_evsel, &top.evlist->entries, node) -if (top.sym_evsel->idx == top.sym_counter) +if (top.sym_evsel->idx == counter)break ; - }else top.sym_counter =0 ; + }else + top.sym_evsel = list_entry(top.evlist->entries.next, struct perf_evsel, node);break ;case 'f' :prompt_integer (&top.count_filter,"Enter display event count filter" );
@@ -675,7 +676,7 @@ static int symbol_filter(struct map *map, struct symbol *sym)for (i =0 ; skip_symbols[i]; i++) {if (!strcmp (skip_symbols[i], name)) { - syme->skip =1 ; + sym->ignore = true;break ; } }
@@ -768,7 +769,7 @@ static void perf_event__process_sample(const union perf_event *event,struct symbol *sym =sym_entry__symbol (top.sym_filter_entry);pr_err ("Can't annotate %s" , sym->name); -if (top.sym_filter_entry->map->dso->origin ==DSO__ORIG_KERNEL ) { +if (top.sym_filter_entry->map->dso->symtab_type ==SYMTAB__KALLSYMS ) {pr_err (": No vmlinux file was found in the path:\n" );machine__fprintf_vmlinux_path (machine, stderr); }else
@@ -778,10 +779,9 @@ static void perf_event__process_sample(const union perf_event *event, } syme =symbol__priv (al.sym); -if (!syme->skip) { +if (!al.sym->ignore) {struct perf_evsel *evsel; - syme->origin = origin; evsel =perf_evlist__id2evsel (top.evlist, sample->id);assert (evsel !=NULL ); syme->count[evsel->idx]++;
tools/perf/builtin.h +1 -0
@@ -19,6 +19,7 @@ extern int cmd_bench(int argc, const char **argv, const char *prefix);extern int cmd_buildid_cache (int argc,const char **argv,const char *prefix);extern int cmd_buildid_list (int argc,const char **argv,const char *prefix);extern int cmd_diff (int argc,const char **argv,const char *prefix); +extern int cmd_evlist (int argc,const char **argv,const char *prefix);extern int cmd_help (int argc,const char **argv,const char *prefix);extern int cmd_sched (int argc,const char **argv,const char *prefix);extern int cmd_list (int argc,const char **argv,const char *prefix);
tools/perf/command-list.txt +1 -0
@@ -8,6 +8,7 @@ perf-bench mainporcelain common perf-buildid-cache mainporcelain common perf-buildid-list mainporcelain common perf-diff mainporcelain common +perf-evlist mainporcelain common perf-inject mainporcelain common perf-list mainporcelain common perf-sched mainporcelain common
tools/perf/perf.c +1 -0
@@ -313,6 +313,7 @@ static void handle_internal_command(int argc, const char **argv) { "buildid-cache", cmd_buildid_cache, 0 }, { "buildid-list", cmd_buildid_list, 0 }, { "diff", cmd_diff, 0 }, + { "evlist", cmd_evlist, 0 }, { "help", cmd_help, 0 }, { "list", cmd_list, 0 }, { "record", cmd_record, 0 },
tools/perf/util/PERF-VERSION-GEN +4 -4
@@ -23,10 +23,10 @@ if test -d ../../.git -o -f ../../.git && then VN=$(echo "$VN" | sed -e 's/-/./g'); else - eval `grep '^VERSION\s*=' ../../Makefile|tr -d ' '` - eval `grep '^PATCHLEVEL\s*=' ../../Makefile|tr -d ' '` - eval `grep '^SUBLEVEL\s*=' ../../Makefile|tr -d ' '` - eval `grep '^EXTRAVERSION\s*=' ../../Makefile|tr -d ' '` + eval $(grep '^VERSION[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^PATCHLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^SUBLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^EXTRAVERSION[[:space:]]*=' ../../Makefile|tr -d ' ') VN="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}" fi
tools/perf/util/annotate.c +1 -1
@@ -294,7 +294,7 @@ fallback: free_filename = false; } -if (dso->origin ==DSO__ORIG_KERNEL ) { +if (dso->symtab_type ==SYMTAB__KALLSYMS ) {char bf[BUILD_ID_SIZE *2 +16 ] =" with build id " ;char *build_id_msg =NULL ;
tools/perf/util/parse-events.c +22 -0
@@ -263,6 +263,28 @@ static char *event_cache_name(u8 cache_type, u8 cache_op, u8 cache_result)return name; } +const char *event_type (int type) +{ +switch (type) { +case PERF_TYPE_HARDWARE : +return "hardware" ; + +case PERF_TYPE_SOFTWARE : +return "software" ; + +case PERF_TYPE_TRACEPOINT : +return "tracepoint" ; + +case PERF_TYPE_HW_CACHE : +return "hardware-cache" ; + +default : +break ; + } + +return "unknown" ; +} +const char *event_name (struct perf_evsel *evsel) {u64 config = evsel->attr.config;
tools/perf/util/parse-events.h +1 -0
@@ -20,6 +20,7 @@ struct tracepoint_path {extern struct tracepoint_path *tracepoint_id_to_path (u64 config);extern bool have_tracepoints (struct list_head *evlist); +const char *event_type (int type);const char *event_name (struct perf_evsel *event);extern const char *__event_name (int type,u64 config);
tools/perf/util/scripting-engines/trace-event-perl.c +8 -3
@@ -245,9 +245,10 @@ static inline struct event *find_cache_event(int type)return event; } -static void perl_process_event (int cpu,void *data, - int size __unused, -unsigned long long nsecs,char *comm) +static void perl_process_event(union perf_event *pevent __unused, +struct perf_sample *sample, + struct perf_session *session __unused, +struct thread *thread) {struct format_field *field;static char handler[256 ];
@@ -256,6 +257,10 @@ static void perl_process_event(int cpu, void *data,struct event *event;int type;int pid; +int cpu = sample->cpu; +void *data = sample->raw_data; +unsigned long long nsecs = sample->time; +char *comm = thread->comm; dSP;
tools/perf/util/scripting-engines/trace-event-python.c +8 -3
@@ -204,9 +204,10 @@ static inline struct event *find_cache_event(int type)return event; } -static void python_process_event (int cpu,void *data, - int size __unused, -unsigned long long nsecs,char *comm) +static void python_process_event(union perf_event *pevent __unused, +struct perf_sample *sample, + struct perf_session *session __unused, +struct thread *thread) {PyObject *handler, *retval, *context, *t, *obj, *dict =NULL ;static char handler_name[256 ];
@@ -217,6 +218,10 @@ static void python_process_event(int cpu, void *data,unsigned n =0 ;int type;int pid; +int cpu = sample->cpu; +void *data = sample->raw_data; +unsigned long long nsecs = sample->time; +char *comm = thread->comm; t =PyTuple_New (MAX_FIELDS );if (!t)
tools/perf/util/session.c +61 -0
64 lines not on this page · raw message
tools/perf/util/session.h +4 -0
@@ -159,4 +159,8 @@ static inline int perf_session__parse_sample(struct perf_session *session, session->sample_id_all, sample); } +void perf_session__print_symbols (union perf_event *event, +struct perf_sample *sample, +struct perf_session *session); +#endif /* __PERF_SESSION_H */
tools/perf/util/symbol.c +32 -32
144 lines not on this page · raw message
tools/perf/util/symbol.h +18 -13
@@ -48,12 +48,17 @@ char *strxfrchar(char *s, char from, char to);#define BUILD_ID_SIZE 20 +/** struct symbol - symtab entry +* +* @ignore - resolvable but tools ignore it (e.g. idle routines) +*/ struct symbol {struct rb_node rb_node;u64 start;u64 end;u16 namelen;u8 binding; +bool ignore;char name[0 ]; };
@@ -137,7 +142,7 @@ struct dso { u8 annotate_warned:1; u8 sname_alloc:1; u8 lname_alloc:1; -unsigned char origin; +unsigned char symtab_type;u8 sorted_by_name;u8 loaded;u8 build_id[BUILD_ID_SIZE ];
@@ -188,18 +193,18 @@ size_t dso__fprintf_buildid(struct dso *self, FILE *fp);size_t dso__fprintf_symbols_by_name (struct dso *self,enum map_type type,FILE *fp);size_t dso__fprintf (struct dso *self,enum map_type type,FILE *fp); -enum dso_origin { -DSO__ORIG_KERNEL =0 , -DSO__ORIG_GUEST_KERNEL , -DSO__ORIG_JAVA_JIT , -DSO__ORIG_BUILD_ID_CACHE , -DSO__ORIG_FEDORA , -DSO__ORIG_UBUNTU , -DSO__ORIG_BUILDID , -DSO__ORIG_DSO , -DSO__ORIG_GUEST_KMODULE , -DSO__ORIG_KMODULE , -DSO__ORIG_NOT_FOUND , +enum symtab_type { +SYMTAB__KALLSYMS =0 , +SYMTAB__GUEST_KALLSYMS , +SYMTAB__JAVA_JIT , +SYMTAB__BUILD_ID_CACHE , +SYMTAB__FEDORA_DEBUGINFO , +SYMTAB__UBUNTU_DEBUGINFO , +SYMTAB__BUILDID_DEBUGINFO , +SYMTAB__SYSTEM_PATH_DSO , +SYMTAB__GUEST_KMODULE , +SYMTAB__SYSTEM_PATH_KMODULE , +SYMTAB__NOT_FOUND , };char dso__symtab_origin (const struct dso *self);
tools/perf/util/top.c +3 -3
@@ -171,7 +171,7 @@ float perf_top__decay_samples(struct perf_top *top, struct rb_root *root) {struct sym_entry *syme, *n;float sum_ksamples =0.0 ; -int snap = !top->display_weighted ? top->sym_counter :0 , j; +int snap = !top->display_weighted ? top->sym_evsel->idx :0 , j;/* Sort the active symbols */ pthread_mutex_lock (&top->active_symbols_lock);
@@ -184,9 +184,9 @@ float perf_top__decay_samples(struct perf_top *top, struct rb_root *root)if (syme->snap_count !=0 ) {if ((top->hide_user_symbols && - syme->origin ==PERF_RECORD_MISC_USER ) || + syme->map->dso->kernel ==DSO_TYPE_USER ) || (top->hide_kernel_symbols && - syme->origin ==PERF_RECORD_MISC_KERNEL )) { + syme->map->dso->kernel ==DSO_TYPE_KERNEL )) {perf_top__remove_active_sym (top, syme);continue ; }
tools/perf/util/top.h +1 -3
@@ -16,8 +16,6 @@ struct sym_entry {struct list_head node;unsigned long snap_count;double weight; -int skip; -u8 origin;struct map *map;unsigned long count[0 ]; };
@@ -41,7 +39,7 @@ struct perf_top {u64 exact_samples;u64 guest_us_samples, guest_kernel_samples;int print_entries, count_filter, delay_secs; -int display_weighted, freq, rb_entries, sym_counter; +int display_weighted, freq, rb_entries;pid_t target_pid, target_tid;bool hide_kernel_symbols, hide_user_symbols, zero;const char *cpu_list;
tools/perf/util/trace-event-parse.c +10 -100
76 lines not on this page · raw message
tools/perf/util/trace-event-scripting.c +4 -5
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.