perf fixes
Subsystems (2)
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: 64dfab8e83644902ad2fd559a56c411b47e3ef3c perf/x86: Remove unused variable in nhmex_rbox_alter_er()
Most of the kernel diffstat relates to a group of Intel P6 and KNC (Xeon-Phi Knights Corner) PMU driver fixes, neither of which is in heavy use, so we took the fixes.
The rest is diverse smallish fixes to the tooling and kernel side.
Thanks,
Ingo
------------------>
Andre Przywara (1):
x86/perf: Fix virtualization sanity check
Arnaldo Carvalho de Melo (2):
perf trace: Validate syscall id before growing syscall table perf trace: Check if sample raw_data field is set
Jiri Olsa (1):
perf test: Fix exclude_guest parse events tests
Luigi Semenzato (1):
perf tools: do not flush maps on COMM for perf report
Namhyung Kim (1):
perf help: Fix --help for builtins
Srivatsa S. Bhat (2):
perf, cpu hotplug: Run CPU_STARTING notifiers with irqs disabled perf, cpu hotplug: Use cached value of smp_processor_id()
Vince Weaver (6):
perf/x86: Fix P6 FP_ASSIST event constraint
perf/x86: Update/fix generic events on P6 PMU
perf/x86: Remove P6 cpuc->enabled check
perf/x86: Make Intel KNC use full 40-bit width of counters perf/x86: Remove cpuc->enable check on Intl KNC event enable/disable perf/x86: Enable overflow on Intel KNC with a custom knc_pmu_handle_irq()
Wei Yongjun (1):
perf/x86: Remove unused variable in nhmex_rbox_alter_er()
Yan, Zheng (1):
perf/x86/uncore: Handle pci_read_config_dword() errors
arch/x86/kernel/cpu/perf_event.c | 10 +- arch/x86/kernel/cpu/perf_event_intel_uncore.c | 45 +++++---- arch/x86/kernel/cpu/perf_event_knc.c | 93 ++++++++++++++++--- arch/x86/kernel/cpu/perf_event_p6.c | 127 +++++++++++++++++++++++--- include/linux/perf_event.h | 10 +- tools/perf/builtin-help.c | 2 +- tools/perf/builtin-trace.c | 18 +++- tools/perf/util/parse-events-test.c | 12 ++- tools/perf/util/thread.c | 1 - 9 files changed, 257 insertions(+), 61 deletions(-)
arch/x86/kernel/cpu/perf_event.c +6 -4
@@ -208,12 +208,14 @@ static bool check_hw_exists(void) }/* -* Now write a value and read it back to see if it matches, -* this is needed to detect certain hardware emulators (qemu/kvm) -* that don't trap on the MSR access and always return 0s. +* Read the current value, change it and read it back to see if it +* matches, this is needed to detect certain hardware emulators +* (qemu/kvm) that don't trap on the MSR access and always return 0s. */ - val =0xabcdUL ; reg =x86_pmu_event_addr (0 ); +if (rdmsrl_safe (reg, &val)) + goto msr_fail; + val ^=0xffffUL ; ret =wrmsrl_safe (reg, val); ret |=rdmsrl_safe (reg, &val_new);if (ret || val != val_new)
arch/x86/kernel/cpu/perf_event_intel_uncore.c +28 -17
108 lines not on this page · raw message
arch/x86/kernel/cpu/perf_event_knc.c +82 -11
137 lines not on this page · raw message
arch/x86/kernel/cpu/perf_event_p6.c +112 -15
162 lines not on this page · raw message
include/linux/perf_event.h +7 -3
@@ -803,12 +803,16 @@ static inline void perf_event_task_tick(void) { }do { \ static struct notifier_block fn##_nb __cpuinitdata = \ { .notifier_call = fn, .priority =CPU_PRI_PERF }; \ +unsigned long cpu =smp_processor_id (); \ +unsigned long flags; \ fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \ - (void *)(unsigned long )smp_processor_id ()); \ + (void *)(unsigned long )cpu); \ +local_irq_save (flags); \ fn(&fn##_nb, (unsigned long)CPU_STARTING, \ - (void *)(unsigned long )smp_processor_id ()); \ + (void *)(unsigned long )cpu); \ +local_irq_restore (flags); \ fn(&fn##_nb, (unsigned long)CPU_ONLINE, \ - (void *)(unsigned long )smp_processor_id ()); \ + (void *)(unsigned long )cpu); \ register_cpu_notifier(&fn##_nb); \ }while (0 )
tools/perf/builtin-help.c +1 -1
@@ -414,7 +414,7 @@ static int show_html_page(const char *perf_cmd)int cmd_help (int argc,const char **argv,const char *prefix__maybe_unused ) {bool show_all = false; -enum help_format help_format =HELP_FORMAT_NONE ; +enum help_format help_format =HELP_FORMAT_MAN ;struct option builtin_help_options[] = {OPT_BOOLEAN ('a' ,"all" , &show_all,"print all available commands" ),OPT_SET_UINT ('m' ,"man" , &help_format,"show man page" ,HELP_FORMAT_MAN ),
tools/perf/builtin-trace.c +13 -5
@@ -56,6 +56,10 @@ static int trace__read_syscall_info(struct trace *trace, int id) {char tp_name[128 ];struct syscall *sc; +const char *name =audit_syscall_to_name (id, trace->audit_machine); + +if (name ==NULL ) +return -1 ;if (id > trace->syscalls.max) {struct syscall *nsyscalls =realloc (trace->syscalls.table, (id +1 ) *sizeof (*sc));
@@ -75,11 +79,8 @@ static int trace__read_syscall_info(struct trace *trace, int id) } sc = trace->syscalls.table + id; - sc->name =audit_syscall_to_name (id, trace->audit_machine); -if (sc->name ==NULL ) -return -1 ; - - sc->fmt =syscall_fmt__find (sc->name); + sc->name = name; + sc->fmt =syscall_fmt__find (sc->name);snprintf (tp_name,sizeof (tp_name),"sys_enter_%s" , sc->name); sc->tp_format =event_format__new ("syscalls" , tp_name);
@@ -267,6 +268,13 @@ again:if (evlist->threads->map[0 ] ==-1 || evlist->threads->nr >1 )printf ("%d " , sample.tid); +if (sample.raw_data ==NULL ) { +printf ("%s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping...\n" , +perf_evsel__name (evsel), sample.tid, + sample.cpu, sample.raw_size); +continue ; + } + handler = evsel->handler.func;handler (trace, evsel, &sample); }
tools/perf/util/parse-events-test.c +8 -4
@@ -513,7 +513,8 @@ static int test__group1(struct perf_evlist *evlist)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 exclude guest" , !evsel->attr.exclude_guest); +/* use of precise requires exclude_guest */ +TEST_ASSERT_VAL ("wrong exclude guest" , evsel->attr.exclude_guest);TEST_ASSERT_VAL ("wrong exclude host" , !evsel->attr.exclude_host);TEST_ASSERT_VAL ("wrong precise_ip" , evsel->attr.precise_ip ==2 );TEST_ASSERT_VAL ("wrong leader" , evsel->leader == leader);
@@ -599,7 +600,8 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)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 exclude guest" , !evsel->attr.exclude_guest); +/* use of precise requires exclude_guest */ +TEST_ASSERT_VAL ("wrong exclude guest" , evsel->attr.exclude_guest);TEST_ASSERT_VAL ("wrong exclude host" , !evsel->attr.exclude_host);TEST_ASSERT_VAL ("wrong precise_ip" , evsel->attr.precise_ip ==3 );TEST_ASSERT_VAL ("wrong leader" , evsel->leader == leader);
@@ -662,7 +664,8 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused)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 exclude guest" , !evsel->attr.exclude_guest); +/* use of precise requires exclude_guest */ +TEST_ASSERT_VAL ("wrong exclude guest" , evsel->attr.exclude_guest);TEST_ASSERT_VAL ("wrong exclude host" , !evsel->attr.exclude_host);TEST_ASSERT_VAL ("wrong precise_ip" , evsel->attr.precise_ip ==1 );TEST_ASSERT_VAL ("wrong group name" , !evsel->group_name);
@@ -676,7 +679,8 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused)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 exclude guest" , !evsel->attr.exclude_guest); +/* use of precise requires exclude_guest */ +TEST_ASSERT_VAL ("wrong exclude guest" , evsel->attr.exclude_guest);TEST_ASSERT_VAL ("wrong exclude host" , !evsel->attr.exclude_host);TEST_ASSERT_VAL ("wrong precise_ip" , evsel->attr.precise_ip ==2 );TEST_ASSERT_VAL ("wrong leader" , evsel->leader == leader);
tools/perf/util/thread.c +0 -1
@@ -39,7 +39,6 @@ int thread__set_comm(struct thread *self, const char *comm) err = self->comm ==NULL ? -ENOMEM :0 ;if (!err) { self->comm_set = true; -map_groups__flush (&self->mg); }return err; }