perf fixes
Subsystems (3)
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: fd6da696f38b00ffeae1185d6f0ec5d4ab3b472d Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
This is mostly about unbreaking architectures that took the UAPI changes in the v3.7 cycle, plus misc fixes.
Thanks,
Ingo
------------------>
David Howells (5):
x86: Export asm/{svm.h,vmx.h,perf_regs.h}
tools: Define a Makefile function to do subdir processing
tools: Honour the O= flag when tool build called from a higher Makefile
tools: Pass the target in descend
perf: Make perf build for x86 with UAPI disintegration applied
Michael Neuling (1):
perf, powerpc: Fix hw breakpoints returning -ENOSPC
Namhyung Kim (2):
perf header: Fix numa topology printing
perf tools: Fix strbuf_addf() when the buffer needs to grow
Sukadev Bhattiprolu (1):
perf powerpc: Use uapi/unistd.h to fix build error
Xiao Guangrong (2):
perf kvm: Rename perf_kvm to perf_kvm_stat perf kvm: Fix building perf kvm on non x86 arches
Makefile | 6 +- arch/x86/include/asm/Kbuild | 3 + include/linux/hw_breakpoint.h | 31 +------- include/uapi/linux/Kbuild | 1 + include/uapi/linux/hw_breakpoint.h | 30 ++++++++ kernel/events/hw_breakpoint.c | 12 ++-- tools/Makefile | 24 +++---- tools/perf/Makefile | 29 +++++++- tools/perf/arch/x86/include/perf_regs.h | 2 +- tools/perf/builtin-kvm.c | 121 ++++++++++++++++++-------------- tools/perf/builtin-test.c | 2 +- tools/perf/perf.h | 16 +---- tools/perf/util/evsel.c | 4 +- tools/perf/util/evsel.h | 3 +- tools/perf/util/header.c | 2 + tools/perf/util/header.h | 2 +- tools/perf/util/parse-events-test.c | 2 +- tools/perf/util/parse-events.c | 2 +- tools/perf/util/parse-events.h | 2 +- tools/perf/util/pmu.h | 2 +- tools/perf/util/session.h | 2 +- tools/perf/util/strbuf.c | 8 +-- tools/scripts/Makefile.include | 23 +++++- 23 files changed, 194 insertions(+), 135 deletions(-) create mode 100644 include/uapi/linux/hw_breakpoint.h
Makefile +4 -2
@@ -1321,10 +1321,12 @@ kernelversion: # Clear a bunch of variables before executing the submake tools/: FORCE - $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ + $(Q)mkdir -p $(objtree)/tools + $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ tools/%: FORCE - $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $* + $(Q)mkdir -p $(objtree)/tools + $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ $* # Single targets # ---------------------------------------------------------------------------
arch/x86/include/asm/Kbuild +3 -0
@@ -12,6 +12,7 @@ header-y += mce.h header-y += msr-index.h header-y += msr.h header-y += mtrr.h +header-y += perf_regs.h header-y += posix_types_32.h header-y += posix_types_64.h header-y += posix_types_x32.h
@@ -19,8 +20,10 @@ header-y += prctl.h header-y += processor-flags.h header-y += ptrace-abi.h header-y += sigcontext32.h +header-y += svm.h header-y += ucontext.h header-y += vm86.h +header-y += vmx.h header-y += vsyscall.h genhdr-y += unistd_32.h
include/linux/hw_breakpoint.h +1 -30
@@ -1,35 +1,8 @@#ifndef _LINUX_HW_BREAKPOINT_H#define _LINUX_HW_BREAKPOINT_H -enum { -HW_BREAKPOINT_LEN_1 =1 , -HW_BREAKPOINT_LEN_2 =2 , -HW_BREAKPOINT_LEN_4 =4 , -HW_BREAKPOINT_LEN_8 =8 , -}; - -enum { -HW_BREAKPOINT_EMPTY =0 , -HW_BREAKPOINT_R =1 , -HW_BREAKPOINT_W =2 , -HW_BREAKPOINT_RW =HW_BREAKPOINT_R |HW_BREAKPOINT_W , -HW_BREAKPOINT_X =4 , -HW_BREAKPOINT_INVALID =HW_BREAKPOINT_RW |HW_BREAKPOINT_X , -}; - -enum bp_type_idx { -TYPE_INST =0 , -#ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS -TYPE_DATA =0 , -#else -TYPE_DATA =1 , -#endif -TYPE_MAX -}; - -#ifdef __KERNEL__ -#include <linux/perf_event.h> +#include <uapi/linux/hw_breakpoint.h> #ifdef CONFIG_HAVE_HW_BREAKPOINT
@@ -151,6 +124,4 @@ static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) }#endif /* CONFIG_HAVE_HW_BREAKPOINT */ -#endif /* __KERNEL__ */ -#endif /* _LINUX_HW_BREAKPOINT_H */
include/uapi/linux/Kbuild +1 -0
@@ -415,3 +415,4 @@ header-y += wireless.h header-y += x25.h header-y += xattr.h header-y += xfrm.h +header-y += hw_breakpoint.h
include/uapi/linux/hw_breakpoint.h new file +30 -0
@@ -0,0 +1,30 @@ +#ifndef _UAPI_LINUX_HW_BREAKPOINT_H +#define _UAPI_LINUX_HW_BREAKPOINT_H + +enum { +HW_BREAKPOINT_LEN_1 =1 , +HW_BREAKPOINT_LEN_2 =2 , +HW_BREAKPOINT_LEN_4 =4 , +HW_BREAKPOINT_LEN_8 =8 , +}; + +enum { +HW_BREAKPOINT_EMPTY =0 , +HW_BREAKPOINT_R =1 , +HW_BREAKPOINT_W =2 , +HW_BREAKPOINT_RW =HW_BREAKPOINT_R |HW_BREAKPOINT_W , +HW_BREAKPOINT_X =4 , +HW_BREAKPOINT_INVALID =HW_BREAKPOINT_RW |HW_BREAKPOINT_X , +}; + +enum bp_type_idx { +TYPE_INST =0 , +#ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS +TYPE_DATA =0 , +#else +TYPE_DATA =1 , +#endif +TYPE_MAX +}; + +#endif /* _UAPI_LINUX_HW_BREAKPOINT_H */
kernel/events/hw_breakpoint.c +7 -5
@@ -111,14 +111,16 @@ static unsigned int max_task_bp_pinned(int cpu, enum bp_type_idx type)* Count the number of breakpoints of the same type and same task. * The given event must be not on the list. */ -static int task_bp_pinned (struct perf_event *bp,enum bp_type_idx type) +static int task_bp_pinned (int cpu,struct perf_event *bp,enum bp_type_idx type) {struct task_struct *tsk = bp->hw.bp_target;struct perf_event *iter;int count =0 ;list_for_each_entry (iter, &bp_task_head, hw.bp_list) { -if (iter->hw.bp_target == tsk &&find_slot_idx (iter) == type) +if (iter->hw.bp_target == tsk && +find_slot_idx (iter) == type && + cpu == iter->cpu) count +=hw_breakpoint_weight (iter); }
@@ -141,7 +143,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp,if (!tsk) slots->pinned +=max_task_bp_pinned (cpu, type);else - slots->pinned +=task_bp_pinned (bp, type); + slots->pinned +=task_bp_pinned (cpu, bp, type); slots->flexible =per_cpu (nr_bp_flexible[type], cpu);return ;
@@ -154,7 +156,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp,if (!tsk) nr +=max_task_bp_pinned (cpu, type);else - nr +=task_bp_pinned (bp, type); + nr +=task_bp_pinned (cpu, bp, type);if (nr > slots->pinned) slots->pinned = nr;
@@ -188,7 +190,7 @@ static void toggle_bp_task_slot(struct perf_event *bp, int cpu, bool enable,int old_idx =0 ;int idx =0 ; - old_count =task_bp_pinned (bp, type); + old_count =task_bp_pinned (cpu, bp, type); old_idx = old_count -1 ; idx = old_idx + weight;
tools/Makefile +12 -12
@@ -31,44 +31,44 @@ help: @echo ' clean: a summary clean target to clean _all_ folders' cpupower: FORCE - $(QUIET_SUBDIR0)power/$@/ $(QUIET_SUBDIR1) + $(call descend,power/$@) firewire lguest perf usb virtio vm: FORCE - $(QUIET_SUBDIR0)$@/ $(QUIET_SUBDIR1) + $(call descend,$@) selftests: FORCE - $(QUIET_SUBDIR0)testing/$@/ $(QUIET_SUBDIR1) + $(call descend,testing/$@) turbostat x86_energy_perf_policy: FORCE - $(QUIET_SUBDIR0)power/x86/$@/ $(QUIET_SUBDIR1) + $(call descend,power/x86/$@) cpupower_install: - $(QUIET_SUBDIR0)power/$(@:_install=)/ $(QUIET_SUBDIR1) install + $(call descend,power/$(@:_install=),install) firewire_install lguest_install perf_install usb_install virtio_install vm_install: - $(QUIET_SUBDIR0)$(@:_install=)/ $(QUIET_SUBDIR1) install + $(call descend,$(@:_install=),install) selftests_install: - $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) install + $(call descend,testing/$(@:_clean=),install) turbostat_install x86_energy_perf_policy_install: - $(QUIET_SUBDIR0)power/x86/$(@:_install=)/ $(QUIET_SUBDIR1) install + $(call descend,power/x86/$(@:_install=),install) install: cpupower_install firewire_install lguest_install perf_install \ selftests_install turbostat_install usb_install virtio_install \ vm_install x86_energy_perf_policy_install cpupower_clean: - $(QUIET_SUBDIR0)power/cpupower/ $(QUIET_SUBDIR1) clean + $(call descend,power/cpupower,clean) firewire_clean lguest_clean perf_clean usb_clean virtio_clean vm_clean: - $(QUIET_SUBDIR0)$(@:_clean=)/ $(QUIET_SUBDIR1) clean + $(call descend,$(@:_clean=),clean) selftests_clean: - $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) clean + $(call descend,testing/$(@:_clean=),clean) turbostat_clean x86_energy_perf_policy_clean: - $(QUIET_SUBDIR0)power/x86/$(@:_clean=)/ $(QUIET_SUBDIR1) clean + $(call descend,power/x86/$(@:_clean=),clean) clean: cpupower_clean firewire_clean lguest_clean perf_clean selftests_clean \ turbostat_clean usb_clean virtio_clean vm_clean \
tools/perf/Makefile +28 -1
@@ -169,7 +169,34 @@ endif ### --- END CONFIGURATION SECTION --- -BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -I$(OUTPUT)util -I$(TRACE_EVENT_DIR) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(shell pwd))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +#$(info Determined 'srctree' to be $(srctree)) +endif + +ifneq ($(objtree),) +#$(info Determined 'objtree' to be $(objtree)) +endif + +ifneq ($(OUTPUT),) +#$(info Determined 'OUTPUT' to be $(OUTPUT)) +endif + +BASIC_CFLAGS = \ + -Iutil/include \ + -Iarch/$(ARCH)/include \ + $(if $(objtree),-I$(objtree)/arch/$(ARCH)/include/generated/uapi) \ + -I$(srctree)/arch/$(ARCH)/include/uapi \ + -I$(srctree)/arch/$(ARCH)/include \ + $(if $(objtree),-I$(objtree)/include/generated/uapi) \ + -I$(srctree)/include/uapi \ + -I$(srctree)/include \ + -I$(OUTPUT)util \ + -Iutil \ + -I. \ + -I$(TRACE_EVENT_DIR) \ + -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE BASIC_LDFLAGS = # Guard against environment variables
tools/perf/arch/x86/include/perf_regs.h +1 -1
@@ -3,7 +3,7 @@#include <stdlib.h> #include "../../util/types.h" -#include "../../../../../arch/x86/include/asm/perf_regs.h" +#include <asm/perf_regs.h> #ifndef ARCH_X86_64 #define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1)
tools/perf/builtin-kvm.c +67 -54
341 lines not on this page · raw message
tools/perf/builtin-test.c +1 -1
@@ -15,7 +15,7 @@#include "util/thread_map.h" #include "util/pmu.h" #include "event-parse.h" -#include "../../include/linux/hw_breakpoint.h" +#include <linux/hw_breakpoint.h> #include <sys/mman.h>
tools/perf/perf.h +3 -13
@@ -5,8 +5,9 @@ struct winsize;void get_term_dimensions (struct winsize *ws); +#include <asm/unistd.h> +#if defined(__i386__) -#include "../../arch/x86/include/asm/unistd.h" #define rmb () asm volatile("lock; addl $0,0(%%esp)" ::: "memory")#define cpu_relax () asm volatile("rep; nop" ::: "memory");#define CPUINFO_PROC "model name"
@@ -16,7 +17,6 @@ void get_term_dimensions(struct winsize *ws);#endif #if defined(__x86_64__) -#include "../../arch/x86/include/asm/unistd.h" #define rmb () asm volatile("lfence" ::: "memory")#define cpu_relax () asm volatile("rep; nop" ::: "memory");#define CPUINFO_PROC "model name"
@@ -26,20 +26,17 @@ void get_term_dimensions(struct winsize *ws);#endif #ifdef __powerpc__ -#include "../../arch/powerpc/include/asm/unistd.h" #define rmb () asm volatile ("sync" ::: "memory")#define cpu_relax () asm volatile ("" ::: "memory");#define CPUINFO_PROC "cpu"#endif #ifdef __s390__ -#include "../../arch/s390/include/asm/unistd.h" #define rmb () asm volatile("bcr 15,0" ::: "memory")#define cpu_relax () asm volatile("" ::: "memory");#endif #ifdef __sh__ -#include "../../arch/sh/include/asm/unistd.h" #if defined(__SH4A__) || defined(__SH5__)# define rmb () asm volatile("synco" ::: "memory")#else
@@ -50,35 +47,30 @@ void get_term_dimensions(struct winsize *ws);#endif #ifdef __hppa__ -#include "../../arch/parisc/include/asm/unistd.h" #define rmb () asm volatile("" ::: "memory")#define cpu_relax () asm volatile("" ::: "memory");#define CPUINFO_PROC "cpu"#endif #ifdef __sparc__ -#include "../../arch/sparc/include/uapi/asm/unistd.h" #define rmb () asm volatile("":::"memory")#define cpu_relax () asm volatile("":::"memory")#define CPUINFO_PROC "cpu"#endif #ifdef __alpha__ -#include "../../arch/alpha/include/asm/unistd.h" #define rmb () asm volatile("mb" ::: "memory")#define cpu_relax () asm volatile("" ::: "memory")#define CPUINFO_PROC "cpu model"#endif #ifdef __ia64__ -#include "../../arch/ia64/include/asm/unistd.h" #define rmb () asm volatile ("mf" ::: "memory")#define cpu_relax () asm volatile ("hint @pause" ::: "memory")#define CPUINFO_PROC "model name"#endif #ifdef __arm__ -#include "../../arch/arm/include/asm/unistd.h" /* * Use the __kuser_memory_barrier helper in the CPU helper page. See * arch/arm/kernel/entry-armv.S in the kernel source for details.
@@ -89,13 +81,11 @@ void get_term_dimensions(struct winsize *ws);#endif #ifdef __aarch64__ -#include "../../arch/arm64/include/asm/unistd.h" #define rmb () asm volatile("dmb ld" ::: "memory")#define cpu_relax () asm volatile("yield" ::: "memory")#endif #ifdef __mips__ -#include "../../arch/mips/include/asm/unistd.h" #define rmb () asm volatile( \ ".set mips2\n\t" \ "sync\n\t" \
@@ -112,7 +102,7 @@ void get_term_dimensions(struct winsize *ws);#include <sys/types.h> #include <sys/syscall.h> -#include "../../include/uapi/linux/perf_event.h" +#include <linux/perf_event.h> #include "util/types.h" #include <stdbool.h>
tools/perf/util/evsel.c +2 -2
@@ -18,8 +18,8 @@#include "cpumap.h" #include "thread_map.h" #include "target.h" -#include "../../../include/linux/hw_breakpoint.h" -#include "../../../include/uapi/linux/perf_event.h" +#include <linux/hw_breakpoint.h> +#include <linux/perf_event.h> #include "perf_regs.h" #define FD (e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
tools/perf/util/evsel.h +2 -1
@@ -3,7 +3,8 @@#include <linux/list.h> #include <stdbool.h> -#include "../../../include/uapi/linux/perf_event.h" +#include <stddef.h> +#include <linux/perf_event.h> #include "types.h" #include "xyarray.h" #include "cgroup.h"
tools/perf/util/header.c +2 -0
@@ -1378,6 +1378,8 @@ static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused, str = tmp +1 ;fprintf (fp,"# node%u cpu list : %s\n" , c, str); + + str +=strlen (str) +1 ; }return ; error:
tools/perf/util/header.h +1 -1
@@ -1,7 +1,7 @@#ifndef __PERF_HEADER_H#define __PERF_HEADER_H -#include "../../../include/uapi/linux/perf_event.h" +#include <linux/perf_event.h> #include <sys/types.h> #include <stdbool.h> #include "types.h"
tools/perf/util/parse-events-test.c +1 -1
@@ -3,7 +3,7 @@#include "evsel.h" #include "evlist.h" #include "sysfs.h" -#include "../../../include/linux/hw_breakpoint.h" +#include <linux/hw_breakpoint.h> #define TEST_ASSERT_VAL (text, cond) \ do { \
tools/perf/util/parse-events.c +1 -1
@@ -1,4 +1,4 @@ -#include "../../../include/linux/hw_breakpoint.h" +#include <linux/hw_breakpoint.h> #include "util.h" #include "../perf.h" #include "evlist.h"
tools/perf/util/parse-events.h +1 -1
@@ -7,7 +7,7 @@#include <linux/list.h> #include <stdbool.h> #include "types.h" -#include "../../../include/uapi/linux/perf_event.h" +#include <linux/perf_event.h> #include "types.h" struct list_head ;
tools/perf/util/pmu.h +1 -1
@@ -2,7 +2,7 @@#define __PMU_H#include <linux/bitops.h> -#include "../../../include/uapi/linux/perf_event.h" +#include <linux/perf_event.h> enum {PERF_PMU_FORMAT_VALUE_CONFIG ,
tools/perf/util/session.h +1 -1
@@ -7,7 +7,7 @@#include "symbol.h" #include "thread.h" #include <linux/rbtree.h> -#include "../../../include/uapi/linux/perf_event.h" +#include <linux/perf_event.h> struct sample_queue ;struct ip_callchain ;
tools/perf/util/strbuf.c +4 -4
@@ -90,17 +90,17 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)if (!strbuf_avail (sb))strbuf_grow (sb,64 );va_start (ap, fmt); - len =vscnprintf (sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); + len =vsnprintf (sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);va_end (ap);if (len <0 ) -die ("your vscnprintf is broken" ); +die ("your vsnprintf is broken" );if (len >strbuf_avail (sb)) {strbuf_grow (sb, len);va_start (ap, fmt); - len =vscnprintf (sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); + len =vsnprintf (sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);va_end (ap);if (len >strbuf_avail (sb)) { -die ("this should not happen, your snprintf is broken" ); +die ("this should not happen, your vsnprintf is broken" ); } }strbuf_setlen (sb, sb->len + len);
tools/scripts/Makefile.include +20 -3
@@ -1,8 +1,11 @@ -ifeq ("$(origin O)", "command line") +ifeq ($(origin O), command line) dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) ABSOLUTE_O := $(shell cd $(O) ; pwd) - OUTPUT := $(ABSOLUTE_O)/ + OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/) COMMAND_O := O=$(ABSOLUTE_O) +ifeq ($(objtree),) + objtree := $(O) +endif endif ifneq ($(OUTPUT),)
@@ -41,7 +44,16 @@ else NO_SUBDIR = : endif -QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir +# +# Define a callable command for descending to a new directory +# +# Call by doing: $(call descend,directory[,target]) +# +descend = \ + +mkdir -p $(OUTPUT)$(1) && \ + $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2) + +QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir QUIET_SUBDIR1 = ifneq ($(findstring $(MAKEFLAGS),s),s)
@@ -56,5 +68,10 @@ ifndef V $(MAKE) $(PRINT_DIR) -C $$subdir QUIET_FLEX = @echo ' ' FLEX $@; QUIET_BISON = @echo ' ' BISON $@; + + descend = \ + @echo ' ' DESCEND $(1); \ + mkdir -p $(OUTPUT)$(1) && \ + $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2) endif endif