perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling, I guess the changes are minor of affect just some
non-core feature, so it is you call if you prefer to pull it into perf/urgent instead.
Best Regards,
- Arnaldo
The following changes since commit ec4212d88a77eb6caec10777ddd629b702a5ebbd:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent (2014-10-15 11:54:14 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo
for you to fetch changes up to 673d659f5c5918b7ddbafebf1f129c9eb82973b4:
perf kvm stat live: Enable events copying (2014-10-15 17:39:03 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
* Add a visual cue for toggle zeroing of samples in 'perf top' (Taeung Song)
* Fix for double free in 'perf stat' when using some specific invalid command line combo (Yasser Shalabi)
Infrastructure:
* Add option to copy events when queuing for sorting across cpu buffers and enable it for 'perf kvm stat live', to avoid having events left in the queue pointing to the ring buffer be rewritten in high volume sessions. (Alexander Yarygin, improving work done by David Ahern):
* Document sysfs events/ interfaces (Cody P Schafer)
* Add support to new style format of kernel PMU event. (Kan Liang)
* Fix typos in perf/Documentation (Masanari Iida)
* Improve callchains when using libunwind (Namhyung Kim)
Lines starting with '#' will be ignored.
----------------------------------------------------------------
Alexander Yarygin (2):
perf session: Add option to copy events when queueing perf kvm stat live: Enable events copying
Cody P Schafer (2):
perf Documentation: sysfs events/ interfaces
perf Documentation: Remove Ruplicated docs for powerpc cpu specific events
Kan Liang (4):
Revert "perf tools: Default to cpu// for events v5" perf tools: Parse the pmu event prefix and suffix perf tools: Add support to new style format of kernel PMU event perf test: Add test case for pmu event new style format
Masanari Iida (1):
perf Documentation: Fix typos in perf/Documentation
Namhyung Kim (4):
perf report: Set callchain_param.record_mode for future use perf callchain: Create an address space per thread perf kvm: Use thread_{,_set}_priv helpers
perf trace: Use thread_{,_set}_priv helpers
Taeung Song (1):
perf top: Add a visual cue for toggle zeroing of samples
Yasser Shalabi (1):
perf evlist: Fix for double free in tools/perf stat
.../testing/sysfs-bus-event_source-devices-events | 611 ++------------------- tools/perf/Documentation/perf-diff.txt | 6 +- tools/perf/Documentation/perf-kvm.txt | 4 +- tools/perf/Documentation/perf-list.txt | 2 +- tools/perf/Documentation/perf-record.txt | 2 +- tools/perf/Documentation/perf-script-perl.txt | 4 +- tools/perf/Documentation/perf-script-python.txt | 6 +- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/Documentation/perf-test.txt | 2 +- tools/perf/Documentation/perf-trace.txt | 2 +- tools/perf/builtin-kvm.c | 7 +- tools/perf/builtin-report.c | 7 + tools/perf/builtin-trace.c | 16 +- tools/perf/tests/dwarf-unwind.c | 3 + tools/perf/tests/parse-events.c | 36 ++ tools/perf/ui/browsers/hists.c | 32 +- tools/perf/util/evlist.c | 1 + tools/perf/util/include/linux/string.h | 1 - tools/perf/util/ordered-events.c | 49 +- tools/perf/util/ordered-events.h | 10 +- tools/perf/util/parse-events.c | 133 ++++- tools/perf/util/parse-events.h | 14 + tools/perf/util/parse-events.l | 30 +- tools/perf/util/parse-events.y | 40 ++ tools/perf/util/pmu.c | 10 - tools/perf/util/pmu.h | 10 + tools/perf/util/session.c | 5 +- tools/perf/util/string.c | 24 - tools/perf/util/thread.c | 6 + tools/perf/util/unwind-libunwind.c | 37 +- tools/perf/util/unwind.h | 17 + 31 files changed, 460 insertions(+), 669 deletions(-)
Arnaldo Carvalho de Melo
maintainerPATCH 1/15 perf top: Add a visual cue for toggle zeroing of samples
From: Taeung Song <[email protected]>
When 'perf top' is run, one can't easily find a difference between -z option and normal output.
So I added a visual cue to know whether it is the zeroing or not.
Output is as below.
Before:
$ perf top
Samples: 61K of event 'cycles', Event count (approx.): 3908136933
Overhead Shared Object Symbol
1.42% firefox [.] 0x0000000000011e76
1.32% libpthread-2.17.so [.] pthread_mutex_lockIf you press key 'z' or run with zero option like '$ perf top --zero', it is as below.
After:
Samples: 61K of event 'cycles', Event count (approx.): 3908136933 [z]
Overhead Shared Object Symbol
1.42% firefox [.] 0x0000000000011e76
1.32% libpthread-2.17.so [.] pthread_mutex_lock--- tools/perf/ui/browsers/hists.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)
tools/perf/ui/browsers/hists.c +22 -10
@@ -35,7 +35,9 @@ struct hist_browser {extern void hist_browser__init_hpp (void ); -static int hists__browser_title (struct hists *hists,char *bf,size_t size); +static int hists__browser_title (struct hists *hists, +struct hist_browser_timer *hbt, +char *bf,size_t size);static void hist_browser__update_nr_entries (struct hist_browser *hb); static struct rb_node *hists__filter_entries(struct rb_node *nd,
@@ -390,7 +392,7 @@ static int hist_browser__run(struct hist_browser *browser, browser->b.entries = &browser->hists->entries; browser->b.nr_entries =hist_browser__nr_entries (browser); -hists__browser_title (browser->hists, title,sizeof (title)); +hists__browser_title (browser->hists, hbt, title,sizeof (title));if (ui_browser__show (&browser->b, title,"Press '?' for help on key bindings" ) <0 )
@@ -417,7 +419,8 @@ static int hist_browser__run(struct hist_browser *browser,ui_browser__warn_lost_events (&browser->b); } -hists__browser_title (browser->hists, title,sizeof (title)); +hists__browser_title (browser->hists, + hbt, title,sizeof (title));ui_browser__show_title (&browser->b, title);continue ; }
@@ -1204,7 +1207,15 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *browserreturn browser->he_selection->thread; } -static int hists__browser_title (struct hists *hists,char *bf,size_t size) +/* Check whether the browser is for 'top' or 'report' */ +static inline bool is_report_browser (void *timer) +{ +return timer ==NULL ; +} + +static int hists__browser_title (struct hists *hists, +struct hist_browser_timer *hbt, +char *bf,size_t size) {char unit;int printed;
@@ -1258,6 +1269,13 @@ static int hists__browser_title(struct hists *hists, char *bf, size_t size)if (dso) printed +=scnprintf (bf + printed, size - printed,", DSO: %s" , dso->short_name); +if (!is_report_browser (hbt)) { +struct perf_top *top = hbt->arg; + +if (top->zero) + printed +=scnprintf (bf + printed, size - printed," [z]" ); + } +return printed; }
@@ -1269,12 +1287,6 @@ static inline void free_popup_options(char **options, int n)zfree (&options[i]); } -/* Check whether the browser is for 'top' or 'report' */ -static inline bool is_report_browser (void *timer) -{ -return timer ==NULL ; -} -/* * Only runtime switching of perf data file will make "input_name" point * to a malloced buffer. So add "is_input_name_malloced" flag to decide
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/15 perf Documentation: sysfs events/ interfaces
In reply to Arnaldo Carvalho de MeloFrom: Cody P Schafer <[email protected]>
Add documentation for the <event>, <event>.scale, and <event>.unit files in sysfs.
<event>.scale and <event>.unit were undocumented.
<event> was previously documented only for specific powerpc pmu events.
--- .../testing/sysfs-bus-event_source-devices-events | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+)
Documentation/ABI/testing/sysfs-bus-event_source-devices-events +60 -0
@@ -599,3 +599,63 @@ Description: POWER-systems specific performance monitoring events Further, multiple terms like 'event=0xNNNN' can be specified and separated with comma. All available terms are defined in the /sys/bus/event_source/devices/<dev>/format file. + +What: /sys/bus/event_source/devices/<pmu>/events/<event> +Date: 2014/02/24 +Contact: Linux kernel mailing list <[email protected]> +Description: Per-pmu performance monitoring events specific to the running system + + Each file (except for some of those with a '.' in them, '.unit' + and '.scale') in the 'events' directory describes a single + performance monitoring event supported by the <pmu>. The name + of the file is the name of the event. + + File contents: + + <term>[=<value>][,<term>[=<value>]]... + + Where <term> is one of the terms listed under + /sys/bus/event_source/devices/<pmu>/format/ and <value> is + a number is base-16 format with a '0x' prefix (lowercase only). + If a <term> is specified alone (without an assigned value), it + is implied that 0x1 is assigned to that <term>. + + Examples (each of these lines would be in a seperate file): + + event=0x2abc + event=0x423,inv,cmask=0x3 + domain=0x1,offset=0x8,starting_index=0xffff + + Each of the assignments indicates a value to be assigned to a + particular set of bits (as defined by the format file + corresponding to the <term>) in the perf_event structure passed + to the perf_open syscall. + +What: /sys/bus/event_source/devices/<pmu>/events/<event>.unit +Date: 2014/02/24 +Contact: Linux kernel mailing list <[email protected]> +Description: Perf event units + + A string specifying the English plural numerical unit that <event> + (once multiplied by <event>.scale) represents. + + Example: + + Joules + +What: /sys/bus/event_source/devices/<pmu>/events/<event>.scale +Date: 2014/02/24 +Contact: Linux kernel mailing list <[email protected]> +Description: Perf event scaling factors + + A string representing a floating point value expressed in + scientific notation to be multiplied by the event count + recieved from the kernel to match the unit specified in the + <event>.unit file. + + Example: + + 2.3283064365386962890625e-10 + + This is provided to avoid performing floating point arithmetic + in the kernel.
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/15 perf Documentation: Remove Ruplicated docs for powerpc cpu specific events
In reply to Arnaldo Carvalho de MeloFrom: Cody P Schafer <[email protected]>
Listing specific events doesn't actually help us at all here because:
- these events actually vary between different ppc processors, they aren't garunteed to be present.
- the documentation of the (generic) file contents is now superceded by the docs for arbitrary event file contents.
--- .../testing/sysfs-bus-event_source-devices-events | 573 --------------------- 1 file changed, 573 deletions(-)
Documentation/ABI/testing/sysfs-bus-event_source-devices-events +0 -573
@@ -27,579 +27,6 @@ Description: Generic performance monitoring events "basename". -What: /sys/devices/cpu/events/PM_1PLUS_PPC_CMPL - /sys/devices/cpu/events/PM_BRU_FIN - /sys/devices/cpu/events/PM_BR_MPRED - /sys/devices/cpu/events/PM_CMPLU_STALL - /sys/devices/cpu/events/PM_CMPLU_STALL_BRU - /sys/devices/cpu/events/PM_CMPLU_STALL_DCACHE_MISS - /sys/devices/cpu/events/PM_CMPLU_STALL_DFU - /sys/devices/cpu/events/PM_CMPLU_STALL_DIV - /sys/devices/cpu/events/PM_CMPLU_STALL_ERAT_MISS - /sys/devices/cpu/events/PM_CMPLU_STALL_FXU - /sys/devices/cpu/events/PM_CMPLU_STALL_IFU - /sys/devices/cpu/events/PM_CMPLU_STALL_LSU - /sys/devices/cpu/events/PM_CMPLU_STALL_REJECT - /sys/devices/cpu/events/PM_CMPLU_STALL_SCALAR - /sys/devices/cpu/events/PM_CMPLU_STALL_SCALAR_LONG - /sys/devices/cpu/events/PM_CMPLU_STALL_STORE - /sys/devices/cpu/events/PM_CMPLU_STALL_THRD - /sys/devices/cpu/events/PM_CMPLU_STALL_VECTOR - /sys/devices/cpu/events/PM_CMPLU_STALL_VECTOR_LONG - /sys/devices/cpu/events/PM_CYC - /sys/devices/cpu/events/PM_GCT_NOSLOT_BR_MPRED - /sys/devices/cpu/events/PM_GCT_NOSLOT_BR_MPRED_IC_MISS - /sys/devices/cpu/events/PM_GCT_NOSLOT_CYC - /sys/devices/cpu/events/PM_GCT_NOSLOT_IC_MISS - /sys/devices/cpu/events/PM_GRP_CMPL - /sys/devices/cpu/events/PM_INST_CMPL - /sys/devices/cpu/events/PM_LD_MISS_L1 - /sys/devices/cpu/events/PM_LD_REF_L1 - /sys/devices/cpu/events/PM_RUN_CYC - /sys/devices/cpu/events/PM_RUN_INST_CMPL - /sys/devices/cpu/events/PM_IC_DEMAND_L2_BR_ALL - /sys/devices/cpu/events/PM_GCT_UTIL_7_TO_10_SLOTS - /sys/devices/cpu/events/PM_PMC2_SAVED - /sys/devices/cpu/events/PM_VSU0_16FLOP - /sys/devices/cpu/events/PM_MRK_LSU_DERAT_MISS - /sys/devices/cpu/events/PM_MRK_ST_CMPL - /sys/devices/cpu/events/PM_NEST_PAIR3_ADD - /sys/devices/cpu/events/PM_L2_ST_DISP - /sys/devices/cpu/events/PM_L2_CASTOUT_MOD - /sys/devices/cpu/events/PM_ISEG - /sys/devices/cpu/events/PM_MRK_INST_TIMEO - /sys/devices/cpu/events/PM_L2_RCST_DISP_FAIL_ADDR - /sys/devices/cpu/events/PM_LSU1_DC_PREF_STREAM_CONFIRM - /sys/devices/cpu/events/PM_IERAT_WR_64K - /sys/devices/cpu/events/PM_MRK_DTLB_MISS_16M - /sys/devices/cpu/events/PM_IERAT_MISS - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_LMEM - /sys/devices/cpu/events/PM_FLOP - /sys/devices/cpu/events/PM_THRD_PRIO_4_5_CYC - /sys/devices/cpu/events/PM_BR_PRED_TA - /sys/devices/cpu/events/PM_EXT_INT - /sys/devices/cpu/events/PM_VSU_FSQRT_FDIV - /sys/devices/cpu/events/PM_MRK_LD_MISS_EXPOSED_CYC - /sys/devices/cpu/events/PM_LSU1_LDF - /sys/devices/cpu/events/PM_IC_WRITE_ALL - /sys/devices/cpu/events/PM_LSU0_SRQ_STFWD - /sys/devices/cpu/events/PM_PTEG_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L31_SHR - /sys/devices/cpu/events/PM_DATA_FROM_L21_MOD - /sys/devices/cpu/events/PM_VSU1_SCAL_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_VSU0_8FLOP - /sys/devices/cpu/events/PM_POWER_EVENT1 - /sys/devices/cpu/events/PM_DISP_CLB_HELD_BAL - /sys/devices/cpu/events/PM_VSU1_2FLOP - /sys/devices/cpu/events/PM_LWSYNC_HELD - /sys/devices/cpu/events/PM_PTEG_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_INST_FROM_L21_MOD - /sys/devices/cpu/events/PM_IERAT_XLATE_WR_16MPLUS - /sys/devices/cpu/events/PM_IC_REQ_ALL - /sys/devices/cpu/events/PM_DSLB_MISS - /sys/devices/cpu/events/PM_L3_MISS - /sys/devices/cpu/events/PM_LSU0_L1_PREF - /sys/devices/cpu/events/PM_VSU_SCALAR_SINGLE_ISSUED - /sys/devices/cpu/events/PM_LSU1_DC_PREF_STREAM_CONFIRM_STRIDE - /sys/devices/cpu/events/PM_L2_INST - /sys/devices/cpu/events/PM_VSU0_FRSP - /sys/devices/cpu/events/PM_FLUSH_DISP - /sys/devices/cpu/events/PM_PTEG_FROM_L2MISS - /sys/devices/cpu/events/PM_VSU1_DQ_ISSUED - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DMEM - /sys/devices/cpu/events/PM_LSU_FLUSH_ULD - /sys/devices/cpu/events/PM_PTEG_FROM_LMEM - /sys/devices/cpu/events/PM_MRK_DERAT_MISS_16M - /sys/devices/cpu/events/PM_THRD_ALL_RUN_CYC - /sys/devices/cpu/events/PM_MEM0_PREFETCH_DISP - /sys/devices/cpu/events/PM_MRK_STALL_CMPLU_CYC_COUNT - /sys/devices/cpu/events/PM_DATA_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_VSU_FRSP - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L21_MOD - /sys/devices/cpu/events/PM_PMC1_OVERFLOW - /sys/devices/cpu/events/PM_VSU0_SINGLE - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L3MISS - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L31_SHR - /sys/devices/cpu/events/PM_VSU0_VECTOR_SP_ISSUED - /sys/devices/cpu/events/PM_VSU1_FEST - /sys/devices/cpu/events/PM_MRK_INST_DISP - /sys/devices/cpu/events/PM_VSU0_COMPLEX_ISSUED - /sys/devices/cpu/events/PM_LSU1_FLUSH_UST - /sys/devices/cpu/events/PM_FXU_IDLE - /sys/devices/cpu/events/PM_LSU0_FLUSH_ULD - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_LSU_LMQ_SRQ_EMPTY_ALL_CYC - /sys/devices/cpu/events/PM_LSU1_REJECT_LMQ_FULL - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L21_MOD - /sys/devices/cpu/events/PM_INST_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_SHL_CREATED - /sys/devices/cpu/events/PM_L2_ST_HIT - /sys/devices/cpu/events/PM_DATA_FROM_DMEM - /sys/devices/cpu/events/PM_L3_LD_MISS - /sys/devices/cpu/events/PM_FXU1_BUSY_FXU0_IDLE - /sys/devices/cpu/events/PM_DISP_CLB_HELD_RES - /sys/devices/cpu/events/PM_L2_SN_SX_I_DONE - /sys/devices/cpu/events/PM_STCX_CMPL - /sys/devices/cpu/events/PM_VSU0_2FLOP - /sys/devices/cpu/events/PM_L3_PREF_MISS - /sys/devices/cpu/events/PM_LSU_SRQ_SYNC_CYC - /sys/devices/cpu/events/PM_LSU_REJECT_ERAT_MISS - /sys/devices/cpu/events/PM_L1_ICACHE_MISS - /sys/devices/cpu/events/PM_LSU1_FLUSH_SRQ - /sys/devices/cpu/events/PM_LD_REF_L1_LSU0 - /sys/devices/cpu/events/PM_VSU0_FEST - /sys/devices/cpu/events/PM_VSU_VECTOR_SINGLE_ISSUED - /sys/devices/cpu/events/PM_FREQ_UP - /sys/devices/cpu/events/PM_DATA_FROM_LMEM - /sys/devices/cpu/events/PM_LSU1_LDX - /sys/devices/cpu/events/PM_PMC3_OVERFLOW - /sys/devices/cpu/events/PM_MRK_BR_MPRED - /sys/devices/cpu/events/PM_SHL_MATCH - /sys/devices/cpu/events/PM_MRK_BR_TAKEN - /sys/devices/cpu/events/PM_ISLB_MISS - /sys/devices/cpu/events/PM_DISP_HELD_THERMAL - /sys/devices/cpu/events/PM_INST_PTEG_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_LSU1_SRQ_STFWD - /sys/devices/cpu/events/PM_PTEG_FROM_DMEM - /sys/devices/cpu/events/PM_VSU_2FLOP - /sys/devices/cpu/events/PM_GCT_FULL_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L3_CYC - /sys/devices/cpu/events/PM_LSU_SRQ_S0_ALLOC - /sys/devices/cpu/events/PM_MRK_DERAT_MISS_4K - /sys/devices/cpu/events/PM_BR_MPRED_TA - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L2MISS - /sys/devices/cpu/events/PM_DPU_HELD_POWER - /sys/devices/cpu/events/PM_MRK_VSU_FIN - /sys/devices/cpu/events/PM_LSU_SRQ_S0_VALID - /sys/devices/cpu/events/PM_GCT_EMPTY_CYC - /sys/devices/cpu/events/PM_IOPS_DISP - /sys/devices/cpu/events/PM_RUN_SPURR - /sys/devices/cpu/events/PM_PTEG_FROM_L21_MOD - /sys/devices/cpu/events/PM_VSU0_1FLOP - /sys/devices/cpu/events/PM_SNOOP_TLBIE - /sys/devices/cpu/events/PM_DATA_FROM_L3MISS - /sys/devices/cpu/events/PM_VSU_SINGLE - /sys/devices/cpu/events/PM_DTLB_MISS_16G - /sys/devices/cpu/events/PM_FLUSH - /sys/devices/cpu/events/PM_L2_LD_HIT - /sys/devices/cpu/events/PM_NEST_PAIR2_AND - /sys/devices/cpu/events/PM_VSU1_1FLOP - /sys/devices/cpu/events/PM_IC_PREF_REQ - /sys/devices/cpu/events/PM_L3_LD_HIT - /sys/devices/cpu/events/PM_DISP_HELD - /sys/devices/cpu/events/PM_L2_LD - /sys/devices/cpu/events/PM_LSU_FLUSH_SRQ - /sys/devices/cpu/events/PM_BC_PLUS_8_CONV - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L31_MOD_CYC - /sys/devices/cpu/events/PM_L2_RCST_BUSY_RC_FULL - /sys/devices/cpu/events/PM_TB_BIT_TRANS - /sys/devices/cpu/events/PM_THERMAL_MAX - /sys/devices/cpu/events/PM_LSU1_FLUSH_ULD - /sys/devices/cpu/events/PM_LSU1_REJECT_LHS - /sys/devices/cpu/events/PM_LSU_LRQ_S0_ALLOC - /sys/devices/cpu/events/PM_L3_CO_L31 - /sys/devices/cpu/events/PM_POWER_EVENT4 - /sys/devices/cpu/events/PM_DATA_FROM_L31_SHR - /sys/devices/cpu/events/PM_BR_UNCOND - /sys/devices/cpu/events/PM_LSU1_DC_PREF_STREAM_ALLOC - /sys/devices/cpu/events/PM_PMC4_REWIND - /sys/devices/cpu/events/PM_L2_RCLD_DISP - /sys/devices/cpu/events/PM_THRD_PRIO_2_3_CYC - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L2MISS - /sys/devices/cpu/events/PM_IC_DEMAND_L2_BHT_REDIRECT - /sys/devices/cpu/events/PM_DATA_FROM_L31_SHR - /sys/devices/cpu/events/PM_IC_PREF_CANCEL_L2 - /sys/devices/cpu/events/PM_MRK_FIN_STALL_CYC_COUNT - /sys/devices/cpu/events/PM_BR_PRED_CCACHE - /sys/devices/cpu/events/PM_GCT_UTIL_1_TO_2_SLOTS - /sys/devices/cpu/events/PM_MRK_ST_CMPL_INT - /sys/devices/cpu/events/PM_LSU_TWO_TABLEWALK_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L3MISS - /sys/devices/cpu/events/PM_LSU_SET_MPRED - /sys/devices/cpu/events/PM_FLUSH_DISP_TLBIE - /sys/devices/cpu/events/PM_VSU1_FCONV - /sys/devices/cpu/events/PM_DERAT_MISS_16G - /sys/devices/cpu/events/PM_INST_FROM_LMEM - /sys/devices/cpu/events/PM_IC_DEMAND_L2_BR_REDIRECT - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L2 - /sys/devices/cpu/events/PM_PTEG_FROM_L2 - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L21_SHR_CYC - /sys/devices/cpu/events/PM_MRK_DTLB_MISS_4K - /sys/devices/cpu/events/PM_VSU0_FPSCR - /sys/devices/cpu/events/PM_VSU1_VECT_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_MEM0_RQ_DISP - /sys/devices/cpu/events/PM_L2_LD_MISS - /sys/devices/cpu/events/PM_VMX_RESULT_SAT_1 - /sys/devices/cpu/events/PM_L1_PREF - /sys/devices/cpu/events/PM_MRK_DATA_FROM_LMEM_CYC - /sys/devices/cpu/events/PM_GRP_IC_MISS_NONSPEC - /sys/devices/cpu/events/PM_PB_NODE_PUMP - /sys/devices/cpu/events/PM_SHL_MERGED - /sys/devices/cpu/events/PM_NEST_PAIR1_ADD - /sys/devices/cpu/events/PM_DATA_FROM_L3 - /sys/devices/cpu/events/PM_LSU_FLUSH - /sys/devices/cpu/events/PM_LSU_SRQ_SYNC_COUNT - /sys/devices/cpu/events/PM_PMC2_OVERFLOW - /sys/devices/cpu/events/PM_LSU_LDF - /sys/devices/cpu/events/PM_POWER_EVENT3 - /sys/devices/cpu/events/PM_DISP_WT - /sys/devices/cpu/events/PM_IC_BANK_CONFLICT - /sys/devices/cpu/events/PM_BR_MPRED_CR_TA - /sys/devices/cpu/events/PM_L2_INST_MISS - /sys/devices/cpu/events/PM_NEST_PAIR2_ADD - /sys/devices/cpu/events/PM_MRK_LSU_FLUSH - /sys/devices/cpu/events/PM_L2_LDST - /sys/devices/cpu/events/PM_INST_FROM_L31_SHR - /sys/devices/cpu/events/PM_VSU0_FIN - /sys/devices/cpu/events/PM_VSU1_FCONV - /sys/devices/cpu/events/PM_INST_FROM_RMEM - /sys/devices/cpu/events/PM_DISP_CLB_HELD_TLBIE - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DMEM_CYC - /sys/devices/cpu/events/PM_BR_PRED_CR - /sys/devices/cpu/events/PM_LSU_REJECT - /sys/devices/cpu/events/PM_GCT_UTIL_3_TO_6_SLOTS - /sys/devices/cpu/events/PM_CMPLU_STALL_END_GCT_NOSLOT - /sys/devices/cpu/events/PM_LSU0_REJECT_LMQ_FULL - /sys/devices/cpu/events/PM_VSU_FEST - /sys/devices/cpu/events/PM_NEST_PAIR0_AND - /sys/devices/cpu/events/PM_PTEG_FROM_L3 - /sys/devices/cpu/events/PM_POWER_EVENT2 - /sys/devices/cpu/events/PM_IC_PREF_CANCEL_PAGE - /sys/devices/cpu/events/PM_VSU0_FSQRT_FDIV - /sys/devices/cpu/events/PM_MRK_GRP_CMPL - /sys/devices/cpu/events/PM_VSU0_SCAL_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_GRP_DISP - /sys/devices/cpu/events/PM_LSU0_LDX - /sys/devices/cpu/events/PM_DATA_FROM_L2 - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_VSU0_VECT_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_VSU1_2FLOP_DOUBLE - /sys/devices/cpu/events/PM_THRD_PRIO_6_7_CYC - /sys/devices/cpu/events/PM_BC_PLUS_8_RSLV_TAKEN - /sys/devices/cpu/events/PM_BR_MPRED_CR - /sys/devices/cpu/events/PM_L3_CO_MEM - /sys/devices/cpu/events/PM_DATA_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_LSU_SRQ_FULL_CYC - /sys/devices/cpu/events/PM_TABLEWALK_CYC - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_RMEM - /sys/devices/cpu/events/PM_LSU_SRQ_STFWD - /sys/devices/cpu/events/PM_INST_PTEG_FROM_RMEM - /sys/devices/cpu/events/PM_FXU0_FIN - /sys/devices/cpu/events/PM_LSU1_L1_SW_PREF - /sys/devices/cpu/events/PM_PTEG_FROM_L31_MOD - /sys/devices/cpu/events/PM_PMC5_OVERFLOW - /sys/devices/cpu/events/PM_LD_REF_L1_LSU1 - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L21_SHR - /sys/devices/cpu/events/PM_DATA_FROM_RMEM - /sys/devices/cpu/events/PM_VSU0_SCAL_SINGLE_ISSUED - /sys/devices/cpu/events/PM_BR_MPRED_LSTACK - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RL2L3_MOD_CYC - /sys/devices/cpu/events/PM_LSU0_FLUSH_UST - /sys/devices/cpu/events/PM_LSU_NCST - /sys/devices/cpu/events/PM_BR_TAKEN - /sys/devices/cpu/events/PM_INST_PTEG_FROM_LMEM - /sys/devices/cpu/events/PM_DTLB_MISS_4K - /sys/devices/cpu/events/PM_PMC4_SAVED - /sys/devices/cpu/events/PM_VSU1_PERMUTE_ISSUED - /sys/devices/cpu/events/PM_SLB_MISS - /sys/devices/cpu/events/PM_LSU1_FLUSH_LRQ - /sys/devices/cpu/events/PM_DTLB_MISS - /sys/devices/cpu/events/PM_VSU1_FRSP - /sys/devices/cpu/events/PM_VSU_VECTOR_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_L2_CASTOUT_SHR - /sys/devices/cpu/events/PM_DATA_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_VSU1_STF - /sys/devices/cpu/events/PM_ST_FIN - /sys/devices/cpu/events/PM_PTEG_FROM_L21_SHR - /sys/devices/cpu/events/PM_L2_LOC_GUESS_WRONG - /sys/devices/cpu/events/PM_MRK_STCX_FAIL - /sys/devices/cpu/events/PM_LSU0_REJECT_LHS - /sys/devices/cpu/events/PM_IC_PREF_CANCEL_HIT - /sys/devices/cpu/events/PM_L3_PREF_BUSY - /sys/devices/cpu/events/PM_MRK_BRU_FIN - /sys/devices/cpu/events/PM_LSU1_NCLD - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L31_MOD - /sys/devices/cpu/events/PM_LSU_NCLD - /sys/devices/cpu/events/PM_LSU_LDX - /sys/devices/cpu/events/PM_L2_LOC_GUESS_CORRECT - /sys/devices/cpu/events/PM_THRESH_TIMEO - /sys/devices/cpu/events/PM_L3_PREF_ST - /sys/devices/cpu/events/PM_DISP_CLB_HELD_SYNC - /sys/devices/cpu/events/PM_VSU_SIMPLE_ISSUED - /sys/devices/cpu/events/PM_VSU1_SINGLE - /sys/devices/cpu/events/PM_DATA_TABLEWALK_CYC - /sys/devices/cpu/events/PM_L2_RC_ST_DONE - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L21_MOD - /sys/devices/cpu/events/PM_LARX_LSU1 - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RMEM - /sys/devices/cpu/events/PM_DISP_CLB_HELD - /sys/devices/cpu/events/PM_DERAT_MISS_4K - /sys/devices/cpu/events/PM_L2_RCLD_DISP_FAIL_ADDR - /sys/devices/cpu/events/PM_SEG_EXCEPTION - /sys/devices/cpu/events/PM_FLUSH_DISP_SB - /sys/devices/cpu/events/PM_L2_DC_INV - /sys/devices/cpu/events/PM_PTEG_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_DSEG - /sys/devices/cpu/events/PM_BR_PRED_LSTACK - /sys/devices/cpu/events/PM_VSU0_STF - /sys/devices/cpu/events/PM_LSU_FX_FIN - /sys/devices/cpu/events/PM_DERAT_MISS_16M - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_GCT_UTIL_11_PLUS_SLOTS - /sys/devices/cpu/events/PM_INST_FROM_L3 - /sys/devices/cpu/events/PM_MRK_IFU_FIN - /sys/devices/cpu/events/PM_ITLB_MISS - /sys/devices/cpu/events/PM_VSU_STF - /sys/devices/cpu/events/PM_LSU_FLUSH_UST - /sys/devices/cpu/events/PM_L2_LDST_MISS - /sys/devices/cpu/events/PM_FXU1_FIN - /sys/devices/cpu/events/PM_SHL_DEALLOCATED - /sys/devices/cpu/events/PM_L2_SN_M_WR_DONE - /sys/devices/cpu/events/PM_LSU_REJECT_SET_MPRED - /sys/devices/cpu/events/PM_L3_PREF_LD - /sys/devices/cpu/events/PM_L2_SN_M_RD_DONE - /sys/devices/cpu/events/PM_MRK_DERAT_MISS_16G - /sys/devices/cpu/events/PM_VSU_FCONV - /sys/devices/cpu/events/PM_ANY_THRD_RUN_CYC - /sys/devices/cpu/events/PM_LSU_LMQ_FULL_CYC - /sys/devices/cpu/events/PM_MRK_LSU_REJECT_LHS - /sys/devices/cpu/events/PM_MRK_LD_MISS_L1_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L2_CYC - /sys/devices/cpu/events/PM_INST_IMC_MATCH_DISP - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RMEM_CYC - /sys/devices/cpu/events/PM_VSU0_SIMPLE_ISSUED - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_VSU_FMA_DOUBLE - /sys/devices/cpu/events/PM_VSU_4FLOP - /sys/devices/cpu/events/PM_VSU1_FIN - /sys/devices/cpu/events/PM_NEST_PAIR1_AND - /sys/devices/cpu/events/PM_INST_PTEG_FROM_RL2L3_MOD - /sys/devices/cpu/events/PM_PTEG_FROM_RMEM - /sys/devices/cpu/events/PM_LSU_LRQ_S0_VALID - /sys/devices/cpu/events/PM_LSU0_LDF - /sys/devices/cpu/events/PM_FLUSH_COMPLETION - /sys/devices/cpu/events/PM_ST_MISS_L1 - /sys/devices/cpu/events/PM_L2_NODE_PUMP - /sys/devices/cpu/events/PM_INST_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_MRK_STALL_CMPLU_CYC - /sys/devices/cpu/events/PM_VSU1_DENORM - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L31_SHR_CYC - /sys/devices/cpu/events/PM_NEST_PAIR0_ADD - /sys/devices/cpu/events/PM_INST_FROM_L3MISS - /sys/devices/cpu/events/PM_EE_OFF_EXT_INT - /sys/devices/cpu/events/PM_INST_PTEG_FROM_DMEM - /sys/devices/cpu/events/PM_INST_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_PMC6_OVERFLOW - /sys/devices/cpu/events/PM_VSU_2FLOP_DOUBLE - /sys/devices/cpu/events/PM_TLB_MISS - /sys/devices/cpu/events/PM_FXU_BUSY - /sys/devices/cpu/events/PM_L2_RCLD_DISP_FAIL_OTHER - /sys/devices/cpu/events/PM_LSU_REJECT_LMQ_FULL - /sys/devices/cpu/events/PM_IC_RELOAD_SHR - /sys/devices/cpu/events/PM_GRP_MRK - /sys/devices/cpu/events/PM_MRK_ST_NEST - /sys/devices/cpu/events/PM_VSU1_FSQRT_FDIV - /sys/devices/cpu/events/PM_LSU0_FLUSH_LRQ - /sys/devices/cpu/events/PM_LARX_LSU0 - /sys/devices/cpu/events/PM_IBUF_FULL_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DL2L3_SHR_CYC - /sys/devices/cpu/events/PM_LSU_DC_PREF_STREAM_ALLOC - /sys/devices/cpu/events/PM_GRP_MRK_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RL2L3_SHR_CYC - /sys/devices/cpu/events/PM_L2_GLOB_GUESS_CORRECT - /sys/devices/cpu/events/PM_LSU_REJECT_LHS - /sys/devices/cpu/events/PM_MRK_DATA_FROM_LMEM - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L3 - /sys/devices/cpu/events/PM_FREQ_DOWN - /sys/devices/cpu/events/PM_PB_RETRY_NODE_PUMP - /sys/devices/cpu/events/PM_INST_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_MRK_INST_ISSUED - /sys/devices/cpu/events/PM_PTEG_FROM_L3MISS - /sys/devices/cpu/events/PM_RUN_PURR - /sys/devices/cpu/events/PM_MRK_GRP_IC_MISS - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L3 - /sys/devices/cpu/events/PM_PTEG_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_LSU_FLUSH_LRQ - /sys/devices/cpu/events/PM_MRK_DERAT_MISS_64K - /sys/devices/cpu/events/PM_INST_PTEG_FROM_DL2L3_MOD - /sys/devices/cpu/events/PM_L2_ST_MISS - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L21_SHR - /sys/devices/cpu/events/PM_LWSYNC - /sys/devices/cpu/events/PM_LSU0_DC_PREF_STREAM_CONFIRM_STRIDE - /sys/devices/cpu/events/PM_MRK_LSU_FLUSH_LRQ - /sys/devices/cpu/events/PM_INST_IMC_MATCH_CMPL - /sys/devices/cpu/events/PM_NEST_PAIR3_AND - /sys/devices/cpu/events/PM_PB_RETRY_SYS_PUMP - /sys/devices/cpu/events/PM_MRK_INST_FIN - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_INST_FROM_L31_MOD - /sys/devices/cpu/events/PM_MRK_DTLB_MISS_64K - /sys/devices/cpu/events/PM_LSU_FIN - /sys/devices/cpu/events/PM_MRK_LSU_REJECT - /sys/devices/cpu/events/PM_L2_CO_FAIL_BUSY - /sys/devices/cpu/events/PM_MEM0_WQ_DISP - /sys/devices/cpu/events/PM_DATA_FROM_L31_MOD - /sys/devices/cpu/events/PM_THERMAL_WARN - /sys/devices/cpu/events/PM_VSU0_4FLOP - /sys/devices/cpu/events/PM_BR_MPRED_CCACHE - /sys/devices/cpu/events/PM_L1_DEMAND_WRITE - /sys/devices/cpu/events/PM_FLUSH_BR_MPRED - /sys/devices/cpu/events/PM_MRK_DTLB_MISS_16G - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_DMEM - /sys/devices/cpu/events/PM_L2_RCST_DISP - /sys/devices/cpu/events/PM_LSU_PARTIAL_CDF - /sys/devices/cpu/events/PM_DISP_CLB_HELD_SB - /sys/devices/cpu/events/PM_VSU0_FMA_DOUBLE - /sys/devices/cpu/events/PM_FXU0_BUSY_FXU1_IDLE - /sys/devices/cpu/events/PM_IC_DEMAND_CYC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L21_SHR - /sys/devices/cpu/events/PM_MRK_LSU_FLUSH_UST - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L3MISS - /sys/devices/cpu/events/PM_VSU_DENORM - /sys/devices/cpu/events/PM_MRK_LSU_PARTIAL_CDF - /sys/devices/cpu/events/PM_INST_FROM_L21_SHR - /sys/devices/cpu/events/PM_IC_PREF_WRITE - /sys/devices/cpu/events/PM_BR_PRED - /sys/devices/cpu/events/PM_INST_FROM_DMEM - /sys/devices/cpu/events/PM_IC_PREF_CANCEL_ALL - /sys/devices/cpu/events/PM_LSU_DC_PREF_STREAM_CONFIRM - /sys/devices/cpu/events/PM_MRK_LSU_FLUSH_SRQ - /sys/devices/cpu/events/PM_MRK_FIN_STALL_CYC - /sys/devices/cpu/events/PM_L2_RCST_DISP_FAIL_OTHER - /sys/devices/cpu/events/PM_VSU1_DD_ISSUED - /sys/devices/cpu/events/PM_PTEG_FROM_L31_SHR - /sys/devices/cpu/events/PM_DATA_FROM_L21_SHR - /sys/devices/cpu/events/PM_LSU0_NCLD - /sys/devices/cpu/events/PM_VSU1_4FLOP - /sys/devices/cpu/events/PM_VSU1_8FLOP - /sys/devices/cpu/events/PM_VSU_8FLOP - /sys/devices/cpu/events/PM_LSU_LMQ_SRQ_EMPTY_CYC - /sys/devices/cpu/events/PM_DTLB_MISS_64K - /sys/devices/cpu/events/PM_THRD_CONC_RUN_INST - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L2 - /sys/devices/cpu/events/PM_PB_SYS_PUMP - /sys/devices/cpu/events/PM_VSU_FIN - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L31_MOD - /sys/devices/cpu/events/PM_THRD_PRIO_0_1_CYC - /sys/devices/cpu/events/PM_DERAT_MISS_64K - /sys/devices/cpu/events/PM_PMC2_REWIND - /sys/devices/cpu/events/PM_INST_FROM_L2 - /sys/devices/cpu/events/PM_GRP_BR_MPRED_NONSPEC - /sys/devices/cpu/events/PM_INST_DISP - /sys/devices/cpu/events/PM_MEM0_RD_CANCEL_TOTAL - /sys/devices/cpu/events/PM_LSU0_DC_PREF_STREAM_CONFIRM - /sys/devices/cpu/events/PM_L1_DCACHE_RELOAD_VALID - /sys/devices/cpu/events/PM_VSU_SCALAR_DOUBLE_ISSUED - /sys/devices/cpu/events/PM_L3_PREF_HIT - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L31_MOD - /sys/devices/cpu/events/PM_MRK_FXU_FIN - /sys/devices/cpu/events/PM_PMC4_OVERFLOW - /sys/devices/cpu/events/PM_MRK_PTEG_FROM_L3 - /sys/devices/cpu/events/PM_LSU0_LMQ_LHR_MERGE - /sys/devices/cpu/events/PM_BTAC_HIT - /sys/devices/cpu/events/PM_L3_RD_BUSY - /sys/devices/cpu/events/PM_LSU0_L1_SW_PREF - /sys/devices/cpu/events/PM_INST_FROM_L2MISS - /sys/devices/cpu/events/PM_LSU0_DC_PREF_STREAM_ALLOC - /sys/devices/cpu/events/PM_L2_ST - /sys/devices/cpu/events/PM_VSU0_DENORM - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_BR_PRED_CR_TA - /sys/devices/cpu/events/PM_VSU0_FCONV - /sys/devices/cpu/events/PM_MRK_LSU_FLUSH_ULD - /sys/devices/cpu/events/PM_BTAC_MISS - /sys/devices/cpu/events/PM_MRK_LD_MISS_EXPOSED_CYC_COUNT - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L2 - /sys/devices/cpu/events/PM_LSU_DCACHE_RELOAD_VALID - /sys/devices/cpu/events/PM_VSU_FMA - /sys/devices/cpu/events/PM_LSU0_FLUSH_SRQ - /sys/devices/cpu/events/PM_LSU1_L1_PREF - /sys/devices/cpu/events/PM_IOPS_CMPL - /sys/devices/cpu/events/PM_L2_SYS_PUMP - /sys/devices/cpu/events/PM_L2_RCLD_BUSY_RC_FULL - /sys/devices/cpu/events/PM_LSU_LMQ_S0_ALLOC - /sys/devices/cpu/events/PM_FLUSH_DISP_SYNC - /sys/devices/cpu/events/PM_MRK_DATA_FROM_DL2L3_MOD_CYC - /sys/devices/cpu/events/PM_L2_IC_INV - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L21_MOD_CYC - /sys/devices/cpu/events/PM_L3_PREF_LDST - /sys/devices/cpu/events/PM_LSU_SRQ_EMPTY_CYC - /sys/devices/cpu/events/PM_LSU_LMQ_S0_VALID - /sys/devices/cpu/events/PM_FLUSH_PARTIAL - /sys/devices/cpu/events/PM_VSU1_FMA_DOUBLE - /sys/devices/cpu/events/PM_1PLUS_PPC_DISP - /sys/devices/cpu/events/PM_DATA_FROM_L2MISS - /sys/devices/cpu/events/PM_SUSPENDED - /sys/devices/cpu/events/PM_VSU0_FMA - /sys/devices/cpu/events/PM_STCX_FAIL - /sys/devices/cpu/events/PM_VSU0_FSQRT_FDIV_DOUBLE - /sys/devices/cpu/events/PM_DC_PREF_DST - /sys/devices/cpu/events/PM_VSU1_SCAL_SINGLE_ISSUED - /sys/devices/cpu/events/PM_L3_HIT - /sys/devices/cpu/events/PM_L2_GLOB_GUESS_WRONG - /sys/devices/cpu/events/PM_MRK_DFU_FIN - /sys/devices/cpu/events/PM_INST_FROM_L1 - /sys/devices/cpu/events/PM_IC_DEMAND_REQ - /sys/devices/cpu/events/PM_VSU1_FSQRT_FDIV_DOUBLE - /sys/devices/cpu/events/PM_VSU1_FMA - /sys/devices/cpu/events/PM_MRK_LD_MISS_L1 - /sys/devices/cpu/events/PM_VSU0_2FLOP_DOUBLE - /sys/devices/cpu/events/PM_LSU_DC_PREF_STRIDED_STREAM_CONFIRM - /sys/devices/cpu/events/PM_INST_PTEG_FROM_L31_SHR - /sys/devices/cpu/events/PM_MRK_LSU_REJECT_ERAT_MISS - /sys/devices/cpu/events/PM_MRK_DATA_FROM_L2MISS - /sys/devices/cpu/events/PM_DATA_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_INST_FROM_PREF - /sys/devices/cpu/events/PM_VSU1_SQ - /sys/devices/cpu/events/PM_L2_LD_DISP - /sys/devices/cpu/events/PM_L2_DISP_ALL - /sys/devices/cpu/events/PM_THRD_GRP_CMPL_BOTH_CYC - /sys/devices/cpu/events/PM_VSU_FSQRT_FDIV_DOUBLE - /sys/devices/cpu/events/PM_INST_PTEG_FROM_DL2L3_SHR - /sys/devices/cpu/events/PM_VSU_1FLOP - /sys/devices/cpu/events/PM_HV_CYC - /sys/devices/cpu/events/PM_MRK_LSU_FIN - /sys/devices/cpu/events/PM_MRK_DATA_FROM_RL2L3_SHR - /sys/devices/cpu/events/PM_DTLB_MISS_16M - /sys/devices/cpu/events/PM_LSU1_LMQ_LHR_MERGE - /sys/devices/cpu/events/PM_IFU_FIN - /sys/devices/cpu/events/PM_1THRD_CON_RUN_INSTR - /sys/devices/cpu/events/PM_CMPLU_STALL_COUNT - /sys/devices/cpu/events/PM_MEM0_PB_RD_CL - /sys/devices/cpu/events/PM_THRD_1_RUN_CYC - /sys/devices/cpu/events/PM_THRD_2_CONC_RUN_INSTR - /sys/devices/cpu/events/PM_THRD_2_RUN_CYC - /sys/devices/cpu/events/PM_THRD_3_CONC_RUN_INST - /sys/devices/cpu/events/PM_THRD_3_RUN_CYC - /sys/devices/cpu/events/PM_THRD_4_CONC_RUN_INST - /sys/devices/cpu/events/PM_THRD_4_RUN_CYC - -Date: 2013/01/08 - -Contact: Linux kernel mailing list <[email protected]> - Linux Powerpc mailing list <[email protected]> - -Description: POWER-systems specific performance monitoring events - - A collection of performance monitoring events that may be - supported by the POWER CPU. These events can be monitored - using the 'perf(1)' tool. - - These events may not be supported by other CPUs. - - The contents of each file would look like: - - event=0xNNNN - - where 'N' is a hex digit and the number '0xNNNN' shows the - "raw code" for the perf event identified by the file's - "basename". - - Further, multiple terms like 'event=0xNNNN' can be specified - and separated with comma. All available terms are defined in - the /sys/bus/event_source/devices/<dev>/format file. - What: /sys/bus/event_source/devices/<pmu>/events/<event> Date: 2014/02/24 Contact: Linux kernel mailing list <[email protected]>
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/15 Revert "perf tools: Default to cpu// for events v5"
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
This reverts commit 50e200f07948 ("perf tools: Default to cpu// for events v5")
The fixup cannot handle the case that
new style format(which without //) mixed with
other different formats.
For example,
group events with new style format: {mem-stores,mem-loads} some hardware event + new style event: cycles,mem-loads Cache event + new style event: LLC-loads,mem-loads
Raw event + new style event:
cpu/event=0xc8,umask=0x08/,mem-loads
old style event and new stytle mixture: mem-stores,cpu/mem-loads/
--- tools/perf/util/include/linux/string.h | 1 - tools/perf/util/parse-events.c | 30 +----------------------------- tools/perf/util/string.c | 24 ------------------------ 3 files changed, 1 insertion(+), 54 deletions(-)
tools/perf/util/include/linux/string.h +0 -1
@@ -1,4 +1,3 @@#include <string.h> void *memdup (const void *src,size_t len); -int str_append (char **s,int *len,const char *a);
tools/perf/util/parse-events.c +1 -29
@@ -6,7 +6,7 @@#include "parse-options.h" #include "parse-events.h" #include "exec_cmd.h" -#include "linux/string.h" +#include "string.h" #include "symbol.h" #include "cache.h" #include "header.h"
@@ -863,32 +863,6 @@ int parse_events_name(struct list_head *list, char *name)return 0 ; } -static int parse_events__scanner (const char *str,void *data,int start_token); - -static int parse_events_fixup (int ret,const char *str,void *data, -int start_token) -{ -char *o =strdup (str); -char *s =NULL ; -char *t = o; -char *p; -int len =0 ; - -if (!o) -return ret; -while ((p =strsep (&t,"," )) !=NULL ) { -if (s) -str_append (&s, &len,"," ); -str_append (&s, &len,"cpu/" ); -str_append (&s, &len, p); -str_append (&s, &len,"/" ); - } -free (o); -if (!s) -return -ENOMEM ; -return parse_events__scanner (s, data, start_token); -} -static int parse_events__scanner (const char *str,void *data,int start_token) {YY_BUFFER_STATE buffer;
@@ -909,8 +883,6 @@ static int parse_events__scanner(const char *str, void *data, int start_token)parse_events__flush_buffer (buffer, scanner);parse_events__delete_buffer (buffer, scanner);parse_events_lex_destroy (scanner); -if (ret && !strchr (str,'/' )) - ret =parse_events_fixup (ret, str, data, start_token);return ret; }
tools/perf/util/string.c +0 -24
@@ -357,27 +357,3 @@ void *memdup(const void *src, size_t len)return p; } - -/** -* str_append - reallocate string and append another -* @s: pointer to string pointer -* @len: pointer to len (initialized) -* @a: string to append. -*/ -int str_append (char **s,int *len,const char *a) -{ -int olen = *s ?strlen (*s) :0 ; -int nlen = olen +strlen (a) +1 ; -if (*len < nlen) { - *len = *len *2 ; -if (*len < nlen) - *len = nlen; - *s =realloc (*s, *len); -if (!*s) -return -ENOMEM ; -if (olen ==0 ) - **s =0 ; - } -strcat (*s, a); -return 0 ; -}
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/15 perf tools: Parse the pmu event prefix and suffix
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
There are two types of event formats for PMU events. E.g. el-abort OR cpu/el-abort/. However, the lexer mistakenly recognizes the simple style format as two events.
The parse_events_pmu_check function uses bsearch to search the name in known pmu event list. It can tell the lexer that the name is a PE_NAME or a PMU event name prefix or a PMU event name suffix. All these information will be used for accurately parsing kernel PMU events.
The pmu events list will be read from sysfs at runtime.
Note: Currently, the patch only want to handle the PMU event name as "a-b" and "a". The only exception, "stalled-cycles-frontend" and "stalled-cycles-fronted", are already hardcoded in lexer.
--- tools/perf/util/parse-events.c | 117 +++++++++++++++++++++++++++++++++++++++++ tools/perf/util/parse-events.h | 14 +++++ tools/perf/util/pmu.c | 10 ---- tools/perf/util/pmu.h | 10 ++++ 4 files changed, 141 insertions(+), 10 deletions(-)
tools/perf/util/parse-events.c +117 -0
@@ -30,6 +30,15 @@ extern int parse_events_debug;#endif int parse_events_parse (void *data,void *scanner); +static struct perf_pmu_event_symbol *perf_pmu_events_list; +/* +* The variable indicates the number of supported pmu event symbols. +* 0 means not initialized and ready to init +* -1 means failed to init, don't try anymore +* >0 is the number of supported pmu event symbols +*/ +static int perf_pmu_events_list_num; +static struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX ] = { [PERF_COUNT_HW_CPU_CYCLES ] = { .symbol ="cpu-cycles" ,
@@ -863,6 +872,113 @@ int parse_events_name(struct list_head *list, char *name)return 0 ; } +static int +comp_pmu (const void *p1,const void *p2) +{ +struct perf_pmu_event_symbol *pmu1 = (struct perf_pmu_event_symbol *) p1; +struct perf_pmu_event_symbol *pmu2 = (struct perf_pmu_event_symbol *) p2; + +return strcmp (pmu1->symbol, pmu2->symbol); +} + +static void perf_pmu__parse_cleanup (void ) +{ +if (perf_pmu_events_list_num >0 ) { +struct perf_pmu_event_symbol *p; +int i; + +for (i =0 ; i < perf_pmu_events_list_num; i++) { + p = perf_pmu_events_list + i; +free (p->symbol); + } +free (perf_pmu_events_list); + perf_pmu_events_list =NULL ; + perf_pmu_events_list_num =0 ; + } +} + +#define SET_SYMBOL (str, stype) \ +do { \ + p->symbol = str; \ + if (!p->symbol) \ + goto err; \ + p->type = stype; \ +} while (0) + +/* +* Read the pmu events list from sysfs +* Save it into perf_pmu_events_list +*/ +static void perf_pmu__parse_init (void ) +{ + +struct perf_pmu *pmu =NULL ; +struct perf_pmu_alias *alias; +int len =0 ; + + pmu =perf_pmu__find ("cpu" ); +if ((pmu ==NULL ) ||list_empty (&pmu->aliases)) { + perf_pmu_events_list_num =-1 ; +return ; + } +list_for_each_entry (alias, &pmu->aliases, list) { +if (strchr (alias->name,'-' )) + len++; + len++; + } + perf_pmu_events_list =malloc (sizeof (struct perf_pmu_event_symbol ) * len); +if (!perf_pmu_events_list) +return ; + perf_pmu_events_list_num = len; + + len =0 ; +list_for_each_entry (alias, &pmu->aliases, list) { +struct perf_pmu_event_symbol *p = perf_pmu_events_list + len; +char *tmp =strchr (alias->name,'-' ); + +if (tmp !=NULL ) { +SET_SYMBOL (strndup (alias->name, tmp - alias->name), +PMU_EVENT_SYMBOL_PREFIX ); + p++; +SET_SYMBOL (strdup (++tmp),PMU_EVENT_SYMBOL_SUFFIX ); + len +=2 ; + }else { +SET_SYMBOL (strdup (alias->name),PMU_EVENT_SYMBOL ); + len++; + } + } +qsort (perf_pmu_events_list, len, +sizeof (struct perf_pmu_event_symbol ), comp_pmu); + +return ; +err: +perf_pmu__parse_cleanup (); +} + +enum perf_pmu_event_symbol_type +perf_pmu__parse_check (const char *name) +{ +struct perf_pmu_event_symbol p, *r; + +/* scan kernel pmu events from sysfs if needed */ +if (perf_pmu_events_list_num ==0 ) +perf_pmu__parse_init (); +/* +* name "cpu" could be prefix of cpu-cycles or cpu// events. +* cpu-cycles has been handled by hardcode. +* So it must be cpu// events, not kernel pmu event. +*/ +if ((perf_pmu_events_list_num <=0 ) || !strcmp (name,"cpu" )) +return PMU_EVENT_SYMBOL_ERR ; + + p.symbol =strdup (name); + r =bsearch (&p, perf_pmu_events_list, + (size_t ) perf_pmu_events_list_num, +sizeof (struct perf_pmu_event_symbol ), comp_pmu); +free (p.symbol); +return r ? r->type :PMU_EVENT_SYMBOL_ERR ; +} +static int parse_events__scanner (const char *str,void *data,int start_token) {YY_BUFFER_STATE buffer;
@@ -917,6 +1033,7 @@ int parse_events(struct perf_evlist *evlist, const char *str)int ret; ret =parse_events__scanner (str, &data,PE_START_EVENTS ); +perf_pmu__parse_cleanup ();if (!ret) {int entries = data.idx - evlist->nr_entries;perf_evlist__splice_list_tail (evlist, &data.list, entries);
tools/perf/util/parse-events.h +14 -0
@@ -35,6 +35,18 @@ extern int parse_filter(const struct option *opt, const char *str, int unset);#define EVENTS_HELP_MAX (128*1024) +enum perf_pmu_event_symbol_type { +PMU_EVENT_SYMBOL_ERR ,/* not a PMU EVENT */ +PMU_EVENT_SYMBOL ,/* normal style PMU event */ +PMU_EVENT_SYMBOL_PREFIX ,/* prefix of pre-suf style event */ +PMU_EVENT_SYMBOL_SUFFIX ,/* suffix of pre-suf style event */ +}; + +struct perf_pmu_event_symbol { +char *symbol; +enum perf_pmu_event_symbol_type type; +}; +enum {PARSE_EVENTS__TERM_TYPE_NUM ,PARSE_EVENTS__TERM_TYPE_STR ,
@@ -95,6 +107,8 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, void *ptr, char *type);int parse_events_add_pmu (struct list_head *list,int *idx,char *pmu ,struct list_head *head_config); +enum perf_pmu_event_symbol_type +perf_pmu__parse_check (const char *name);void parse_events__set_leader (char *name,struct list_head *list);void parse_events_update_lists (struct list_head *list_event,struct list_head *list_all);
tools/perf/util/pmu.c +0 -10
@@ -12,16 +12,6 @@#include "parse-events.h" #include "cpumap.h" -#define UNIT_MAX_LEN 31/* max length for event unit name */ - -struct perf_pmu_alias { -char *name; -struct list_head terms;/* HEAD struct parse_events_term -> list */ -struct list_head list;/* ELEM */ -char unit[UNIT_MAX_LEN +1 ]; -double scale; -}; -struct perf_pmu_format {char *name;int value;
tools/perf/util/pmu.h +10 -0
@@ -30,6 +30,16 @@ struct perf_pmu_info {double scale; }; +#define UNIT_MAX_LEN 31/* max length for event unit name */ + +struct perf_pmu_alias { +char *name; +struct list_head terms;/* HEAD struct parse_events_term -> list */ +struct list_head list;/* ELEM */ +char unit[UNIT_MAX_LEN +1 ]; +double scale; +}; +struct perf_pmu *perf_pmu__find (const char *name);int perf_pmu__config (struct perf_pmu *pmu,struct perf_event_attr *attr,struct list_head *head_terms);
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/15 perf tools: Add support to new style format of kernel PMU event
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Add new rules for kernel PMU event.
Currently, the patch only want to handle the PMU event name as "a-b" and "a".
event_pmu:PE_KERNEL_PMU_EVENT sep_dc
|PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
PE_KERNEL_PMU_EVENT token is for
cycles-ct/cycles-t/mem-loads/mem-stores.
The prefix cycles is mixed up with cpu-cycles. loads and stores are mixed up with cache event So they have to be hardcode in lex.
PE_PMU_EVENT_PRE and PE_PMU_EVENT_SUF tokens are for other PMU events.
The lex looks generic identifier up in the table and return the matched token. If there is no match, generic PE_NAME token will be return.
Using the rules, kernel PMU event could use new style format without //
so you can use:
perf record -e mem-loads ...
instead of:
perf record -e cpu/mem-loads/
--- tools/perf/util/parse-events.l | 30 +++++++++++++++++++++++++++++- tools/perf/util/parse-events.y | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-)
tools/perf/util/parse-events.l +29 -1
@@ -51,6 +51,24 @@ static int str(yyscan_t scanner, int token) return token; } +static int pmu_str_check(yyscan_t scanner) +{ + YYSTYPE *yylval = parse_events_get_lval(scanner); + char *text = parse_events_get_text(scanner); + + yylval->str = strdup(text); + switch (perf_pmu__parse_check(text)) { + case PMU_EVENT_SYMBOL_PREFIX: + return PE_PMU_EVENT_PRE; + case PMU_EVENT_SYMBOL_SUFFIX: + return PE_PMU_EVENT_SUF; + case PMU_EVENT_SYMBOL: + return PE_KERNEL_PMU_EVENT; + default: + return PE_NAME; + } +} + static int sym(yyscan_t scanner, int type, int config) { YYSTYPE *yylval = parse_events_get_lval(scanner);
@@ -178,6 +196,16 @@ alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_AL emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } + /* + * We have to handle the kernel PMU event cycles-ct/cycles-t/mem-loads/mem-stores separately. + * Because the prefix cycles is mixed up with cpu-cycles. + * loads and stores are mixed up with cache event + */ +cycles-ct { return str(yyscanner, PE_KERNEL_PMU_EVENT); } +cycles-t { return str(yyscanner, PE_KERNEL_PMU_EVENT); } +mem-loads { return str(yyscanner, PE_KERNEL_PMU_EVENT); } +mem-stores { return str(yyscanner, PE_KERNEL_PMU_EVENT); } + L1-dcache|l1-d|l1d|L1-data | L1-icache|l1-i|l1i|L1-instruction | LLC|L2 |
@@ -199,7 +227,7 @@ r{num_raw_hex} { return raw(yyscanner); } {num_hex} { return value(yyscanner, 16); } {modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); } -{name} { return str(yyscanner, PE_NAME); } +{name} { return pmu_str_check(yyscanner); } "/" { BEGIN(config); return '/'; } - { return '-'; } , { BEGIN(event); return ','; }
tools/perf/util/parse-events.y +40 -0
@@ -47,6 +47,7 @@ static inc_group_count(struct list_head *list, %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP %token PE_ERROR +%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type <num> PE_VALUE %type <num> PE_VALUE_SYM_HW %type <num> PE_VALUE_SYM_SW
@@ -58,6 +59,7 @@ static inc_group_count(struct list_head *list, %type <str> PE_MODIFIER_EVENT %type <str> PE_MODIFIER_BP %type <str> PE_EVENT_NAME +%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type <num> value_sym %type <head> event_config %type <term> event_term
@@ -220,6 +222,44 @@ PE_NAME '/' '/' ABORT_ON(parse_events_add_pmu(list, &data->idx, $1, NULL)); $$ = list; } +| +PE_KERNEL_PMU_EVENT sep_dc +{ + struct parse_events_evlist *data = _data; + struct list_head *head; + struct parse_events_term *term; + struct list_head *list; + + ALLOC_LIST(head); + ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, 1)); + list_add_tail(&term->list, head); + + ALLOC_LIST(list); + ABORT_ON(parse_events_add_pmu(list, &data->idx, "cpu", head)); + parse_events__free_terms(head); + $$ = list; +} +| +PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc +{ + struct parse_events_evlist *data = _data; + struct list_head *head; + struct parse_events_term *term; + struct list_head *list; + char pmu_name[128]; + snprintf(&pmu_name, 128, "%s-%s", $1, $3); + + ALLOC_LIST(head); + ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + &pmu_name, 1)); + list_add_tail(&term->list, head); + + ALLOC_LIST(list); + ABORT_ON(parse_events_add_pmu(list, &data->idx, "cpu", head)); + parse_events__free_terms(head); + $$ = list; +} value_sym: PE_VALUE_SYM_HW
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/15 perf test: Add test case for pmu event new style format
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Add test case in automated tests suite. It checks not only the two types of pmu event stytle formats "pmu_event_name" and "cpu/pmu_event_name/", but also the different formats mixtures which are more likely to trigger parse issue.
The patch set including this one has been tested by the perf automated test:
./perf test parse -v"
On haswell, ivybridge and Romley platform.
The patch set also has been tested on haswell by the following script.
Note: please make sure that your test system support TSX and L1-dcache-loads events. Otherwise, you may want to change the events to other pmu events.
[lk@localhost ~]$ cat perf_style_test.sh
# hardware events + kernel pmu event with different style
perf stat -x, -e cycles,mem-stores,tx-start sleep 2
perf stat -x, -e cpu-cycles,cycles-ct,cycles-t sleep 2
perf stat -x, -e cycles,cpu/cycles-ct/,cpu/cycles-t/ sleep 2
perf stat -x, -e instructions,cpu/tx-start/ sleep 2
perf stat -x, -e '{cycles,tx-start}' sleep 2
perf stat -x, -e '{cycles,cpu/tx-start/}' sleep 2# HW Cache event + kernel pmu event with different style perf stat -x, -e L1-dcache-loads,cpu/mem-stores/,tx-start sleep 2 perf stat -x, -e L1-dcache-loads,mem-stores,cpu/tx-start/ sleep 2 perf stat -x, -e '{L1-dcache-loads,mem-stores}' sleep 2 perf stat -x, -e '{L1-dcache-loads,cpu/tx-start/}' sleep 2
# Raw event + kernel pmu event with different style:
perf stat -x, -e cpu/event=0xc0,umask=0x00/,mem-loads,cpu/mem-stores/ sleep 2 perf stat -x, -e cpu/event=0xc0,umask=0x00/,tx-start,cpu/el-start/ sleep 2 perf stat -x, -e '{cpu/event=0xc0,umask=0x00/,tx-start}' sleep 2
--- tools/perf/tests/parse-events.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
tools/perf/tests/parse-events.c +36 -0
@@ -457,6 +457,36 @@ static int test__checkevent_pmu_events(struct perf_evlist *evlist)return 0 ; } + +static int test__checkevent_pmu_events_mix (struct perf_evlist *evlist) +{ +struct perf_evsel *evsel =perf_evlist__first (evlist); + +/* pmu-event:u */ +TEST_ASSERT_VAL ("wrong number of entries" ,2 == evlist->nr_entries); +TEST_ASSERT_VAL ("wrong exclude_user" , + !evsel->attr.exclude_user); +TEST_ASSERT_VAL ("wrong exclude_kernel" , + evsel->attr.exclude_kernel); +TEST_ASSERT_VAL ("wrong exclude_hv" , evsel->attr.exclude_hv); +TEST_ASSERT_VAL ("wrong precise_ip" , !evsel->attr.precise_ip); +TEST_ASSERT_VAL ("wrong pinned" , !evsel->attr.pinned); + +/* cpu/pmu-event/u*/ + evsel =perf_evsel__next (evsel); +TEST_ASSERT_VAL ("wrong number of entries" ,2 == evlist->nr_entries); +TEST_ASSERT_VAL ("wrong type" ,PERF_TYPE_RAW == evsel->attr.type); +TEST_ASSERT_VAL ("wrong exclude_user" , + !evsel->attr.exclude_user); +TEST_ASSERT_VAL ("wrong exclude_kernel" , + evsel->attr.exclude_kernel); +TEST_ASSERT_VAL ("wrong exclude_hv" , evsel->attr.exclude_hv); +TEST_ASSERT_VAL ("wrong precise_ip" , !evsel->attr.precise_ip); +TEST_ASSERT_VAL ("wrong pinned" , !evsel->attr.pinned); + +return 0 ; +} +static int test__checkterms_simple (struct list_head *terms) {struct parse_events_term *term;
@@ -1554,6 +1584,12 @@ static int test_pmu_events(void) e.check = test__checkevent_pmu_events; ret =test_event (&e); +if (ret) +break ; +snprintf (name,MAX_NAME ,"%s:u,cpu/event=%s/u" , ent->d_name, ent->d_name); + e.name = name; + e.check = test__checkevent_pmu_events_mix; + ret =test_event (&e);#undef MAX_NAME }
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/15 perf evlist: Fix for double free in tools/perf stat
In reply to Arnaldo Carvalho de MeloFrom: Yasser Shalabi <[email protected]>
Fix for double free bug in tools/perf due to dangling thread_map pointer in perf_evlist struct.
Code path excercised when perf stat -C switch is used but not set and is followed by another switch.
Example:
perf stat -C -e.
--- tools/perf/util/evlist.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/evlist.c +1 -0
@@ -1003,6 +1003,7 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target) out_delete_threads:thread_map__delete (evlist->threads); + evlist->threads =NULL ;return -1 ; }
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/15 perf report: Set callchain_param.record_mode for future use
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
Normally the callchain_param.record_mode is used only for record path. But as it might need to prepare something for dwarf unwinding, setup this info for perf report too.
--- tools/perf/builtin-report.c | 7 +++++++ tools/perf/tests/dwarf-unwind.c | 3 +++ 2 files changed, 10 insertions(+)
tools/perf/builtin-report.c +7 -0
@@ -257,6 +257,13 @@ static int report__setup_sample_type(struct report *rep) } } +if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) { +if ((sample_type &PERF_SAMPLE_REGS_USER ) && + (sample_type &PERF_SAMPLE_STACK_USER )) + callchain_param.record_mode =CALLCHAIN_DWARF ; +else + callchain_param.record_mode =CALLCHAIN_FP ; + }return 0 ; }
tools/perf/tests/dwarf-unwind.c +3 -0
@@ -9,6 +9,7 @@#include "perf_regs.h" #include "map.h" #include "thread.h" +#include "callchain.h" static int mmap_handler(struct perf_tool *tool __maybe_unused, union perf_event *event,
@@ -120,6 +121,8 @@ int test__dwarf_unwind(void)return -1 ; } + callchain_param.record_mode =CALLCHAIN_DWARF ; +if (init_live_machine (machine)) {pr_err ("Could not init machine\n" ); goto out;
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/15 perf callchain: Create an address space per thread
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
The unw_addr_space_t in libunwind represents an address space to be used for stack unwinding. It doesn't need to be create/destory everytime to unwind callchain (as in get_entries) and can have a same lifetime as thread (unless exec called).
So move the address space construction/destruction logic to the thread lifetime handling functions. This is a preparation to enable caching in the unwind library.
Note that it saves unw_addr_space_t object using thread__set_priv(). It seems currently only used by perf trace and perf kvm stat commands which don't use callchain.
[ Fixup unwind-libunwind.c missing CALLCHAIN_DWARF definition, added
missing __maybe_unused on unused parameters in stubs at util/unwind.h ]
--- tools/perf/util/thread.c | 6 ++++++ tools/perf/util/unwind-libunwind.c | 37 ++++++++++++++++++++++++++++++++----- tools/perf/util/unwind.h | 17 +++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-)
tools/perf/util/thread.c +6 -0
@@ -7,6 +7,7 @@#include "util.h" #include "debug.h" #include "comm.h" +#include "unwind.h" int thread__init_map_groups (struct thread *thread,struct machine *machine) {
@@ -37,6 +38,9 @@ struct thread *thread__new(pid_t pid, pid_t tid) thread->cpu =-1 ;INIT_LIST_HEAD (&thread->comm_list); +if (unwind__prepare_access (thread) <0 ) + goto err_thread; + comm_str =malloc (32 );if (!comm_str) goto err_thread;
@@ -48,6 +52,7 @@ struct thread *thread__new(pid_t pid, pid_t tid) goto err_thread;list_add (&comm->list, &thread->comm_list); + }return thread;
@@ -69,6 +74,7 @@ void thread__delete(struct thread *thread)list_del (&comm->list);comm__free (comm); } +unwind__finish_access (thread);free (thread); }
tools/perf/util/unwind-libunwind.c +32 -5
@@ -24,6 +24,7 @@#include <linux/list.h> #include <libunwind.h> #include <libunwind-ptrace.h> +#include "callchain.h" #include "thread.h" #include "session.h" #include "perf_regs.h"
@@ -525,12 +526,12 @@ static unw_accessors_t accessors = { .get_proc_name = get_proc_name, }; -static int get_entries (struct unwind_info *ui,unwind_entry_cb_t cb, -void *arg,int max_stack) +int unwind__prepare_access (struct thread *thread) {unw_addr_space_t addr_space; -unw_cursor_t c; -int ret; + +if (callchain_param.record_mode !=CALLCHAIN_DWARF ) +return 0 ; addr_space =unw_create_addr_space (&accessors,0 );if (!addr_space) {
@@ -538,6 +539,33 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,return -ENOMEM ; } +thread__set_priv (thread, addr_space); + +return 0 ; +} + +void unwind__finish_access (struct thread *thread) +{ +unw_addr_space_t addr_space; + +if (callchain_param.record_mode !=CALLCHAIN_DWARF ) +return ; + + addr_space =thread__priv (thread); +unw_destroy_addr_space (addr_space); +} + +static int get_entries (struct unwind_info *ui,unwind_entry_cb_t cb, +void *arg,int max_stack) +{ +unw_addr_space_t addr_space; +unw_cursor_t c; +int ret; + + addr_space =thread__priv (ui->thread); +if (addr_space ==NULL ) +return -1 ; + ret =unw_init_remote (&c, addr_space, ui);if (ret)display_error (ret);
@@ -549,7 +577,6 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, ret = ip ?entry (ip, ui->thread, ui->machine, cb, arg) :0 ; } -unw_destroy_addr_space (addr_space);return ret; }
tools/perf/util/unwind.h +17 -0
@@ -4,6 +4,7 @@#include <linux/types.h> #include "event.h" #include "symbol.h" +#include "thread.h" struct unwind_entry {struct map *map;
@@ -21,6 +22,15 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,/* libunwind specific */ #ifdef HAVE_LIBUNWIND_SUPPORT int libunwind__arch_reg_id (int regnum); +int unwind__prepare_access (struct thread *thread); +void unwind__finish_access (struct thread *thread); +#else +static inline int unwind__prepare_access (struct thread *thread__maybe_unused ) +{ +return 0 ; +} + +static inline void unwind__finish_access (struct thread *thread__maybe_unused ) {}#endif #else static inline int
@@ -33,5 +43,12 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, {return 0 ; } + +static inline int unwind__prepare_access (struct thread *thread__maybe_unused ) +{ +return 0 ; +} + +static inline void unwind__finish_access (struct thread *thread__maybe_unused ) {}#endif /* HAVE_DWARF_UNWIND_SUPPORT */ #endif /* __UNWIND_H */
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/15 perf kvm: Use thread_{,_set}_priv helpers
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
This is mechanical changes only for accounting access to thread->priv properly in the source level.
--- tools/perf/builtin-kvm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/perf/builtin-kvm.c +3 -3
@@ -376,7 +376,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, struct perf_sample *sample) {/* Only kvm_entry records vcpu id. */ -if (!thread->priv &&kvm_entry_event (evsel)) { +if (!thread__priv (thread) &&kvm_entry_event (evsel)) {struct vcpu_event_record *vcpu_record; vcpu_record =zalloc (sizeof (*vcpu_record));
@@ -386,10 +386,10 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, } vcpu_record->vcpu_id =perf_evsel__intval (evsel, sample,VCPU_ID ); - thread->priv = vcpu_record; +thread__set_priv (thread, vcpu_record); } -return thread->priv; +return thread__priv (thread); } static bool handle_kvm_event(struct perf_kvm_stat *kvm,
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/15 perf trace: Use thread_{,_set}_priv helpers
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
This is mechanical changes only for accounting access to thread->priv properly in the source level.
--- tools/perf/builtin-trace.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/perf/builtin-trace.c +8 -8
@@ -1189,13 +1189,13 @@ static struct thread_trace *thread__trace(struct thread *thread, FILE *fp)if (thread ==NULL ) goto fail; -if (thread->priv ==NULL ) - thread->priv =thread_trace__new (); +if (thread__priv (thread) ==NULL ) +thread__set_priv (thread,thread_trace__new ()); -if (thread->priv ==NULL ) +if (thread__priv (thread) ==NULL ) goto fail; - ttrace = thread->priv; + ttrace =thread__priv (thread); ++ttrace->nr_events;return ttrace;
@@ -1248,7 +1248,7 @@ struct trace {static int trace__set_fd_pathname (struct thread *thread,int fd,const char *pathname) { -struct thread_trace *ttrace = thread->priv; +struct thread_trace *ttrace =thread__priv (thread);if (fd > ttrace->paths.max) {char **npath =realloc (ttrace->paths.table, (fd +1 ) *sizeof (char *));
@@ -1301,7 +1301,7 @@ static int thread__read_fd_path(struct thread *thread, int fd)static const char *thread__fd_path (struct thread *thread,int fd,struct trace *trace) { -struct thread_trace *ttrace = thread->priv; +struct thread_trace *ttrace =thread__priv (thread);if (ttrace ==NULL )return NULL ;
@@ -1338,7 +1338,7 @@ static size_t syscall_arg__scnprintf_close_fd(char *bf, size_t size, {int fd = arg->val;size_t printed =syscall_arg__scnprintf_fd (bf, size, arg); -struct thread_trace *ttrace = arg->thread->priv; +struct thread_trace *ttrace =thread__priv (arg->thread);if (ttrace && fd >=0 && fd <= ttrace->paths.max)zfree (&ttrace->paths.table[fd]);
@@ -2381,7 +2381,7 @@ static int trace__fprintf_one_thread(struct thread *thread, void *priv)FILE *fp = data->fp;size_t printed = data->printed;struct trace *trace = data->trace; -struct thread_trace *ttrace = thread->priv; +struct thread_trace *ttrace =thread__priv (thread);double ratio;if (ttrace ==NULL )
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 13/15 perf Documentation: Fix typos in perf/Documentation
In reply to Arnaldo Carvalho de MeloFrom: Masanari Iida <[email protected]>
This patch fix spelling typos found in tool/perf/Documentation.
--- tools/perf/Documentation/perf-diff.txt | 6 +++--- tools/perf/Documentation/perf-kvm.txt | 4 ++-- tools/perf/Documentation/perf-list.txt | 2 +- tools/perf/Documentation/perf-record.txt | 2 +- tools/perf/Documentation/perf-script-perl.txt | 4 ++-- tools/perf/Documentation/perf-script-python.txt | 6 +++--- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/Documentation/perf-test.txt | 2 +- tools/perf/Documentation/perf-trace.txt | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-)
tools/perf/Documentation/perf-diff.txt +3 -3
@@ -196,10 +196,10 @@ If specified the 'Weighted diff' column is displayed with value 'd' computed as: - period being the hist entry period value - - WEIGHT-A/WEIGHT-B being user suplied weights in the the '-c' option + - WEIGHT-A/WEIGHT-B being user supplied weights in the the '-c' option behind ':' separator like '-c wdiff:1,2'. - - WIEGHT-A being the weight of the data file - - WIEGHT-B being the weight of the baseline data file + - WEIGHT-A being the weight of the data file + - WEIGHT-B being the weight of the baseline data file SEE ALSO --------
tools/perf/Documentation/perf-kvm.txt +2 -2
@@ -100,7 +100,7 @@ OPTIONS STAT REPORT OPTIONS ------------------- --vcpu=<value>:: - analyze events which occures on this vcpu. (default: all vcpus) + analyze events which occur on this vcpu. (default: all vcpus) --event=<value>:: event to be analyzed. Possible values: vmexit, mmio (x86 only),
@@ -134,7 +134,7 @@ STAT LIVE OPTIONS Analyze events only for given process ID(s) (comma separated list). --vcpu=<value>:: - analyze events which occures on this vcpu. (default: all vcpus) + analyze events which occur on this vcpu. (default: all vcpus) --event=<value>::
tools/perf/Documentation/perf-list.txt +1 -1
@@ -19,7 +19,7 @@ various perf commands with the -e option. EVENT MODIFIERS --------------- -Events can optionally have a modifer by appending a colon and one or +Events can optionally have a modifier by appending a colon and one or more modifiers. Modifiers allow the user to restrict the events to be counted. The following modifiers exist:
tools/perf/Documentation/perf-record.txt +1 -1
@@ -146,7 +146,7 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs. -N:: --no-buildid-cache:: -Do not update the builid cache. This saves some overhead in situations +Do not update the buildid cache. This saves some overhead in situations where the information in the perf.data file (which includes buildids) is sufficient.
tools/perf/Documentation/perf-script-perl.txt +2 -2
@@ -181,8 +181,8 @@ strings for flag and symbolic fields. These correspond to the strings and values parsed from the 'print fmt' fields of the event format files: - flag_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the flag field $field_name of event $event_name - symbol_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the symbolic field $field_name of event $event_name + flag_str($event_name, $field_name, $field_value) - returns the string representation corresponding to $field_value for the flag field $field_name of event $event_name + symbol_str($event_name, $field_name, $field_value) - returns the string representation corresponding to $field_value for the symbolic field $field_name of event $event_name Perf::Trace::Context Module ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/perf/Documentation/perf-script-python.txt +3 -3
@@ -263,7 +263,7 @@ and having the counts we've tallied as values. The print_syscall_totals() function iterates over the entries in the dictionary and displays a line for each entry containing the syscall -name (the dictonary keys contain the syscall ids, which are passed to +name (the dictionary keys contain the syscall ids, which are passed to the Util function syscall_name(), which translates the raw syscall numbers to the corresponding syscall name strings). The output is displayed after all the events in the trace have been processed, by
@@ -576,8 +576,8 @@ strings for flag and symbolic fields. These correspond to the strings and values parsed from the 'print fmt' fields of the event format files: - flag_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the flag field field_name of event event_name - symbol_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the symbolic field field_name of event event_name + flag_str(event_name, field_name, field_value) - returns the string representation corresponding to field_value for the flag field field_name of event event_name + symbol_str(event_name, field_name, field_value) - returns the string representation corresponding to field_value for the symbolic field field_name of event event_name The *autodict* function returns a special kind of Python dictionary that implements Perl's 'autovivifying' hashes in Python
tools/perf/Documentation/perf-script.txt +1 -1
@@ -140,7 +140,7 @@ OPTIONS "Overriding previous field request for all events." - Alternativey, consider the order: + Alternatively, consider the order: -f comm,tid,time,ip,sym -f trace:
tools/perf/Documentation/perf-test.txt +1 -1
@@ -25,7 +25,7 @@ OPTIONS ------- -s:: --skip:: - Tests to skip (comma separater numeric list). + Tests to skip (comma separated numeric list). -v:: --verbose::
tools/perf/Documentation/perf-trace.txt +1 -1
@@ -20,7 +20,7 @@ scheduling events, etc. This is a live mode tool in addition to working with perf.data files like the other perf tools. Files can be generated using the 'perf record' command but the session needs to include the raw_syscalls events (-e 'raw_syscalls:*'). -Alernatively, the 'perf trace record' can be used as a shortcut to +Alternatively, 'perf trace record' can be used as a shortcut to automatically include the raw_syscalls events when writing events to a file. The following options apply to perf trace; options to perf trace record are
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 14/15 perf session: Add option to copy events when queueing
In reply to Arnaldo Carvalho de MeloFrom: Alexander Yarygin <[email protected]>
When processing events the session code has an ordered samples queue which is used to time-sort events coming in across multiple mmaps. At a later point in time samples on the queue are flushed up to some timestamp at which point the event is actually processed.
When analyzing events live (ie., record/analysis path in the same command) there is a race that leads to corrupted events and parse errors which cause perf to terminate. The problem is that when the event is placed in the ordered samples queue it is only a reference to the event which is really sitting in the mmap buffer. Even though the event is queued for later processing the mmap tail pointer is updated which indicates to the kernel that the event has been processed. The race is flushing the event from the queue before it gets overwritten by some other event. For commands trying to process events live (versus just writing to a file) and processing a high rate of events this leads to parse failures and perf terminates.
Examples hitting this problem are 'perf kvm stat live', especially with nested VMs which generate 100,000+ traces per second, and a command processing scheduling events with a high rate of context switching -- e.g., running 'perf bench sched pipe'.
This patch offers live commands an option to copy the event when it is placed in the ordered samples queue.
Based on a patch from David Ahern <[email protected]>
--- tools/perf/util/ordered-events.c | 49 ++++++++++++++++++++++++++++++++++++---- tools/perf/util/ordered-events.h | 10 +++++++- tools/perf/util/session.c | 5 ++-- 3 files changed, 56 insertions(+), 8 deletions(-)
tools/perf/util/ordered-events.c +45 -4
@@ -1,5 +1,6 @@#include <linux/list.h> #include <linux/compiler.h> +#include <linux/string.h> #include "ordered-events.h" #include "evlist.h" #include "session.h"
@@ -57,11 +58,45 @@ static void queue_event(struct ordered_events *oe, struct ordered_event *new) } } +static union perf_event *__dup_event (struct ordered_events *oe, +union perf_event *event) +{ +union perf_event *new_event =NULL ; + +if (oe->cur_alloc_size < oe->max_alloc_size) { + new_event =memdup (event, event->header.size); +if (new_event) + oe->cur_alloc_size += event->header.size; + } + +return new_event; +} + +static union perf_event *dup_event (struct ordered_events *oe, +union perf_event *event) +{ +return oe->copy_on_queue ?__dup_event (oe, event) : event; +} + +static void free_dup_event (struct ordered_events *oe,union perf_event *event) +{ +if (oe->copy_on_queue) { + oe->cur_alloc_size -= event->header.size; +free (event); + } +} +#define MAX_SAMPLE_BUFFER (64 * 1024 / sizeof(struct ordered_event)) -static struct ordered_event *alloc_event (struct ordered_events *oe) +static struct ordered_event *alloc_event (struct ordered_events *oe, +union perf_event *event) {struct list_head *cache = &oe->cache;struct ordered_event *new =NULL ; +union perf_event *new_event; + + new_event =dup_event (oe, event); +if (!new_event) +return NULL ;if (!list_empty (cache)) { new = list_entry(cache->next, struct ordered_event, list);
@@ -74,8 +109,10 @@ static struct ordered_event *alloc_event(struct ordered_events *oe)size_t size =MAX_SAMPLE_BUFFER *sizeof (*new); oe->buffer =malloc (size); -if (!oe->buffer) +if (!oe->buffer) { +free_dup_event (oe, new_event);return NULL ; + }pr ("alloc size %" PRIu64"B (+%zu), max %" PRIu64"B\n" , oe->cur_alloc_size, size, oe->max_alloc_size);
@@ -90,15 +127,17 @@ static struct ordered_event *alloc_event(struct ordered_events *oe)pr ("allocation limit reached %" PRIu64"B\n" , oe->max_alloc_size); } + new->event = new_event;return new; }struct ordered_event * -ordered_events__new (struct ordered_events *oe,u64 timestamp) +ordered_events__new (struct ordered_events *oe,u64 timestamp, +union perf_event *event) {struct ordered_event *new; - new =alloc_event (oe); + new =alloc_event (oe, event);if (new) { new->timestamp = timestamp;queue_event (oe, new);
@@ -111,6 +150,7 @@ void ordered_events__delete(struct ordered_events *oe, struct ordered_event *eve {list_move (&event->list, &oe->cache); oe->nr_events--; +free_dup_event (oe, event->event); } static int __ordered_events__flush(struct perf_session *s,
@@ -240,6 +280,7 @@ void ordered_events__free(struct ordered_events *oe) event = list_entry(oe->to_free.next, struct ordered_event, list);list_del (&event->list); +free_dup_event (oe, event->event);free (event); } }
tools/perf/util/ordered-events.h +9 -1
@@ -34,9 +34,11 @@ struct ordered_events {int buffer_idx;unsigned int nr_events;enum oe_flush last_flush_type; +bool copy_on_queue; }; -struct ordered_event *ordered_events__new (struct ordered_events *oe,u64 timestamp); +struct ordered_event *ordered_events__new (struct ordered_events *oe,u64 timestamp, +union perf_event *event);void ordered_events__delete (struct ordered_events *oe,struct ordered_event *event);int ordered_events__flush (struct perf_session *s,struct perf_tool *tool,enum oe_flush how);
@@ -48,4 +50,10 @@ void ordered_events__set_alloc_size(struct ordered_events *oe, u64 size) { oe->max_alloc_size = size; } + +static inline +void ordered_events__set_copy_on_queue (struct ordered_events *oe,bool copy) +{ + oe->copy_on_queue = copy; +}#endif /* __ORDERED_EVENTS_H */
tools/perf/util/session.c +2 -3
@@ -532,17 +532,16 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event,return -EINVAL ; } - new =ordered_events__new (oe, timestamp); + new =ordered_events__new (oe, timestamp, event);if (!new) {ordered_events__flush (s, tool,OE_FLUSH__HALF ); - new =ordered_events__new (oe, timestamp); + new =ordered_events__new (oe, timestamp, event); }if (!new)return -ENOMEM ; new->file_offset = file_offset; - new->event = event;return 0 ; }
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 15/15 perf kvm stat live: Enable events copying
In reply to Arnaldo Carvalho de MeloFrom: Alexander Yarygin <[email protected]>
Process of analyzing events caused by 2 functions: mmap_read() and finished_round().
During mmap_read(), perf receives events from shared memory, queues their pointers for further processing in finished_round() and notifies the kernel that the events have been processed.
By the time when finished_round() is invoked, queued events can be overwritten by the kernel, so the finished_round() occurs on potentially corrupted memory.
Since there is no place where the event can be safely consumed, let's copy events when queueing.
--- tools/perf/builtin-kvm.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/builtin-kvm.c +1 -0
@@ -1358,6 +1358,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, } kvm->session->evlist = kvm->evlist;perf_session__set_id_hdr_size (kvm->session); +ordered_events__set_copy_on_queue (&kvm->session->ordered_events, true);machine__synthesize_threads (&kvm->session->machines.host, &kvm->opts.target, kvm->evlist->threads, false); err =kvm_live_open_events (kvm);
Signature · 1 line
1.9.3
Quoted 104 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling, I guess the changes are minor of affect just some
non-core feature, so it is you call if you prefer to pull it into perf/urgent instead.Best Regards,
- Arnaldo
The following changes since commit
ec4212d88a77eb6caec10777ddd629b702a5ebbd:Merge tag 'perf-core-for-mingo' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/urgent (2014-10-15 11:54:14 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingofor you to fetch changes up to
673d659f5c5918b7ddbafebf1f129c9eb82973b4:perf kvm stat live: Enable events copying (2014-10-15 17:39:03 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:User visible:
* Add a visual cue for toggle zeroing of samples in 'perf top' (Taeung Song)
* Fix for double free in 'perf stat' when using some specific invalid command line combo (Yasser Shalabi)
Infrastructure:
* Add option to copy events when queuing for sorting across cpu buffers and enable it for 'perf kvm stat live', to avoid having events left in the queue pointing to the ring buffer be rewritten in high volume sessions. (Alexander Yarygin, improving work done by David Ahern):
* Document sysfs events/ interfaces (Cody P Schafer)
* Add support to new style format of kernel PMU event. (Kan Liang)
* Fix typos in perf/Documentation (Masanari Iida)
* Improve callchains when using libunwind (Namhyung Kim)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>Lines starting with '#' will be ignored.
----------------------------------------------------------------
Alexander Yarygin (2):
perf session: Add option to copy events when queueing perf kvm stat live: Enable events copyingCody P Schafer (2):
perf Documentation: sysfs events/ interfaces
perf Documentation: Remove Ruplicated docs for powerpc cpu specific eventsKan Liang (4):
Revert "perf tools: Default to cpu// for events v5" perf tools: Parse the pmu event prefix and suffix perf tools: Add support to new style format of kernel PMU event perf test: Add test case for pmu event new style formatMasanari Iida (1):
perf Documentation: Fix typos in perf/DocumentationNamhyung Kim (4):
perf report: Set callchain_param.record_mode for future use perf callchain: Create an address space per thread perf kvm: Use thread_{,_set}_priv helpers
perf trace: Use thread_{,_set}_priv helpersTaeung Song (1):
perf top: Add a visual cue for toggle zeroing of samplesYasser Shalabi (1):
perf evlist: Fix for double free intools/perfstat.../testing/sysfs-bus-event_source-devices-events | 611 ++------------------- tools/perf/Documentation/perf-diff.txt | 6 +- tools/perf/Documentation/perf-kvm.txt | 4 +- tools/perf/Documentation/perf-list.txt | 2 +- tools/perf/Documentation/perf-record.txt | 2 +- tools/perf/Documentation/perf-script-perl.txt | 4 +- tools/perf/Documentation/perf-script-python.txt | 6 +- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/Documentation/perf-test.txt | 2 +- tools/perf/Documentation/perf-trace.txt | 2 +- tools/perf/builtin-kvm.c | 7 +- tools/perf/builtin-report.c | 7 + tools/perf/builtin-trace.c | 16 +- tools/perf/tests/dwarf-unwind.c | 3 + tools/perf/tests/parse-events.c | 36 ++ tools/perf/ui/browsers/hists.c | 32 +- tools/perf/util/evlist.c | 1 + tools/perf/util/include/linux/string.h | 1 - tools/perf/util/ordered-events.c | 49 +- tools/perf/util/ordered-events.h | 10 +- tools/perf/util/parse-events.c | 133 ++++- tools/perf/util/parse-events.h | 14 + tools/perf/util/parse-events.l | 30 +- tools/perf/util/parse-events.y | 40 ++
Quoted 8 lines
tools/perf/util/pmu.c | 10 - tools/perf/util/pmu.h | 10 + tools/perf/util/session.c | 5 +- tools/perf/util/string.c | 24 - tools/perf/util/thread.c | 6 + tools/perf/util/unwind-libunwind.c | 37 +- tools/perf/util/unwind.h | 17 + 31 files changed, 460 insertions(+), 669 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo