perf updates
Subsystems (4)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
# HEAD: 0c99241c93b8060441f3c8434848e54b5338f922 perf/x86/intel/pt: Fix and clean up error handling in pt_event_add()
This update has mostly fixes, but also other bits:
- perf tooling fixes
- PMU driver fixes
- Intel Broadwell PMU driver HW-enablement for LBR callstacks
- a late coming 'perf kmem' tool update that enables it to also analyze page allocation data. Note, this comes with MM tracepoint changes that we believe to not break anything: because it changes the formerly opaque 'struct page *' field that uniquely identifies pages to 'pfn' which identifies pages uniquely too, but isn't as opaque and can be used for other purposes as well.
Thanks,
Ingo
------------------>
He Kuang (2):
perf probe: Set retprobe flag when probe in address-based alternative mode perf probe: Fix segfault when probe with lazy_line to file
Ingo Molnar (1):
perf/x86/intel/pt: Fix and clean up error handling in pt_event_add()
Jacob Pan (1):
perf/x86/intel/rapl: Fix energy counter measurements but supporing per domain energy units
Kan Liang (1):
perf/x86/intel: Add Broadwell support for the LBR callstack
Namhyung Kim (2):
tracing, mm: Record pfn instead of pointer to struct page perf kmem: Analyze page allocator events also
Naohiro Aota (1):
perf probe: Find compilation directory path for lazy matching
Peter Zijlstra (2):
perf/x86: Fix hw_perf_event::flags collision perf/x86/intel: Fix Core2,Atom,NHM,WSM cycles:pp events
arch/x86/kernel/cpu/perf_event.h | 18 +- arch/x86/kernel/cpu/perf_event_intel.c | 2 +- arch/x86/kernel/cpu/perf_event_intel_ds.c | 8 + arch/x86/kernel/cpu/perf_event_intel_pt.c | 33 +- arch/x86/kernel/cpu/perf_event_intel_rapl.c | 94 ++++-- include/trace/events/filemap.h | 8 +- include/trace/events/kmem.h | 42 +-- include/trace/events/vmscan.h | 8 +- tools/perf/Documentation/perf-kmem.txt | 8 +- tools/perf/builtin-kmem.c | 500 +++++++++++++++++++++++++++- tools/perf/util/probe-event.c | 60 +--- tools/perf/util/probe-finder.c | 73 +++- tools/perf/util/probe-finder.h | 4 + 13 files changed, 702 insertions(+), 156 deletions(-)
arch/x86/kernel/cpu/perf_event.h +9 -9
@@ -65,15 +65,15 @@ struct event_constraint {/* * struct hw_perf_event.flags flags */ -#define PERF_X86_EVENT_PEBS_LDLAT 0x1/* ld+ldlat data address sampling */ -#define PERF_X86_EVENT_PEBS_ST 0x2/* st data address sampling */ -#define PERF_X86_EVENT_PEBS_ST_HSW 0x4/* haswell style datala, store */ -#define PERF_X86_EVENT_COMMITTED 0x8/* event passed commit_txn */ -#define PERF_X86_EVENT_PEBS_LD_HSW 0x10/* haswell style datala, load */ -#define PERF_X86_EVENT_PEBS_NA_HSW 0x20/* haswell style datala, unknown */ -#define PERF_X86_EVENT_EXCL 0x40/* HT exclusivity on counter */ -#define PERF_X86_EVENT_DYNAMIC 0x80/* dynamic alloc'd constraint */ -#define PERF_X86_EVENT_RDPMC_ALLOWED 0x40/* grant rdpmc permission */ +#define PERF_X86_EVENT_PEBS_LDLAT 0x0001/* ld+ldlat data address sampling */ +#define PERF_X86_EVENT_PEBS_ST 0x0002/* st data address sampling */ +#define PERF_X86_EVENT_PEBS_ST_HSW 0x0004/* haswell style datala, store */ +#define PERF_X86_EVENT_COMMITTED 0x0008/* event passed commit_txn */ +#define PERF_X86_EVENT_PEBS_LD_HSW 0x0010/* haswell style datala, load */ +#define PERF_X86_EVENT_PEBS_NA_HSW 0x0020/* haswell style datala, unknown */ +#define PERF_X86_EVENT_EXCL 0x0040/* HT exclusivity on counter */ +#define PERF_X86_EVENT_DYNAMIC 0x0080/* dynamic alloc'd constraint */ +#define PERF_X86_EVENT_RDPMC_ALLOWED 0x0100/* grant rdpmc permission */ struct amd_nb {
arch/x86/kernel/cpu/perf_event_intel.c +1 -1
@@ -3275,7 +3275,7 @@ __init int intel_pmu_init(void) hw_cache_extra_regs[C (NODE )][C (OP_WRITE )][C (RESULT_ACCESS )] =HSW_DEMAND_WRITE |BDW_L3_MISS_LOCAL |HSW_SNOOP_DRAM ; -intel_pmu_lbr_init_snb (); +intel_pmu_lbr_init_hsw (); x86_pmu.event_constraints = intel_bdw_event_constraints; x86_pmu.pebs_constraints = intel_hsw_pebs_event_constraints;
arch/x86/kernel/cpu/perf_event_intel_ds.c +8 -0
@@ -558,6 +558,8 @@ struct event_constraint intel_core2_pebs_event_constraints[] = {INTEL_FLAGS_UEVENT_CONSTRAINT (0x00c5 ,0x1 ),/* BR_INST_RETIRED.MISPRED */ INTEL_FLAGS_UEVENT_CONSTRAINT (0x1fc7 ,0x1 ),/* SIMD_INST_RETURED.ANY */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0x1 ),/* MEM_LOAD_RETIRED.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x01 ), EVENT_CONSTRAINT_END };
@@ -565,6 +567,8 @@ struct event_constraint intel_atom_pebs_event_constraints[] = {INTEL_FLAGS_UEVENT_CONSTRAINT (0x00c0 ,0x1 ),/* INST_RETIRED.ANY */ INTEL_FLAGS_UEVENT_CONSTRAINT (0x00c5 ,0x1 ),/* MISPREDICTED_BRANCH_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0x1 ),/* MEM_LOAD_RETIRED.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x01 ), EVENT_CONSTRAINT_END };
@@ -588,6 +592,8 @@ struct event_constraint intel_nehalem_pebs_event_constraints[] = {INTEL_FLAGS_UEVENT_CONSTRAINT (0x20c8 ,0xf ),/* ITLB_MISS_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0xf ),/* MEM_LOAD_RETIRED.* */ INTEL_FLAGS_EVENT_CONSTRAINT (0xf7 ,0xf ),/* FP_ASSIST.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x0f ), EVENT_CONSTRAINT_END };
@@ -603,6 +609,8 @@ struct event_constraint intel_westmere_pebs_event_constraints[] = {INTEL_FLAGS_UEVENT_CONSTRAINT (0x20c8 ,0xf ),/* ITLB_MISS_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0xf ),/* MEM_LOAD_RETIRED.* */ INTEL_FLAGS_EVENT_CONSTRAINT (0xf7 ,0xf ),/* FP_ASSIST.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x0f ), EVENT_CONSTRAINT_END };
arch/x86/kernel/cpu/perf_event_intel_pt.c +15 -18
@@ -988,39 +988,36 @@ static int pt_event_add(struct perf_event *event, int mode)int ret = -EBUSY ;if (pt->handle.event) - goto out; + goto fail; buf =perf_aux_output_begin (&pt->handle, event); -if (!buf) { - ret = -EINVAL ; - goto out; - } + ret = -EINVAL ; +if (!buf) + goto fail_stop;pt_buffer_reset_offsets (buf, pt->handle.head);if (!buf->snapshot) { ret =pt_buffer_reset_markers (buf, &pt->handle); -if (ret) { -perf_aux_output_end (&pt->handle,0 , true); - goto out; - } +if (ret) + goto fail_end_stop; }if (mode &PERF_EF_START ) {pt_event_start (event,0 ); -if (hwc->state ==PERF_HES_STOPPED ) { -pt_event_del (event,0 ); - ret = -EBUSY ; - } + ret = -EBUSY ; +if (hwc->state ==PERF_HES_STOPPED ) + goto fail_end_stop; }else { hwc->state =PERF_HES_STOPPED ; } - ret =0 ; -out: - -if (ret) - hwc->state =PERF_HES_STOPPED ; +return 0 ; +fail_end_stop: +perf_aux_output_end (&pt->handle,0 , true); +fail_stop: + hwc->state =PERF_HES_STOPPED ; +fail:return ret; }
arch/x86/kernel/cpu/perf_event_intel_rapl.c +73 -21
203 lines not on this page · raw message
include/trace/events/filemap.h +4 -4
@@ -18,14 +18,14 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache,TP_ARGS (page),TP_STRUCT__entry ( - __field(struct page *, page) + __field(unsigned long, pfn)__field (unsigned long ,i_ino ) __field(unsigned long, index)__field (dev_t, s_dev) ),TP_fast_assign ( - __entry->page = page; + __entry->pfn = page_to_pfn(page); __entry->i_ino = page->mapping->host->i_ino; __entry->index = page->index;if (page->mapping->host->i_sb)
@@ -37,8 +37,8 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache,TP_printk ("dev %d:%d ino %lx page=%p pfn=%lu ofs=%lu" ,MAJOR (__entry->s_dev),MINOR (__entry->s_dev), __entry->i_ino, - __entry->page, -page_to_pfn (__entry->page), +pfn_to_page (__entry->pfn), + __entry->pfn, __entry->index <<PAGE_SHIFT ) );
include/trace/events/kmem.h +21 -21
128 lines not on this page · raw message
include/trace/events/vmscan.h +4 -4
@@ -336,18 +336,18 @@ TRACE_EVENT(mm_vmscan_writepage,TP_ARGS (page, reclaim_flags),TP_STRUCT__entry ( - __field(struct page *, page) + __field(unsigned long, pfn)__field (int, reclaim_flags) ),TP_fast_assign ( - __entry->page = page; + __entry->pfn = page_to_pfn(page); __entry->reclaim_flags = reclaim_flags; ),TP_printk ("page=%p pfn=%lu flags=%s" , - __entry->page, -page_to_pfn (__entry->page), +pfn_to_page (__entry->pfn), + __entry->pfn,show_reclaim_flags (__entry->reclaim_flags)) );
tools/perf/Documentation/perf-kmem.txt +7 -1
@@ -3,7 +3,7 @@ perf-kmem(1) NAME ---- -perf-kmem - Tool to trace/measure kernel memory(slab) properties +perf-kmem - Tool to trace/measure kernel memory properties SYNOPSIS --------
@@ -46,6 +46,12 @@ OPTIONS --raw-ip:: Print raw ip instead of symbol +--slab:: + Analyze SLAB allocator events. + +--page:: + Analyze page allocator events + SEE ALSO -------- linkperf:perf-record[1]
tools/perf/builtin-kmem.c +484 -16
624 lines not on this page · raw message
tools/perf/util/probe-event.c +1 -59
72 lines not on this page · raw message
tools/perf/util/probe-finder.c +71 -2
92 lines not on this page · raw message
tools/perf/util/probe-finder.h +4 -0
@@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,struct variable_list **vls, int max_points, bool externs); +/* Find a src file from a DWARF tag path */ +int get_real_path (const char *raw_path,const char *comp_dir, +char **new_path); +struct probe_finder {struct perf_probe_event *pev;/* Target probe event */