diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-05 18:30:21 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-05 18:30:21 -0500 |
| commit | c3fa27d1367fac63ac8533d6f20ea851d0d70a10 (patch) | |
| tree | e7731554085e22b6b63411b1ebb401079f3e0bbb /kernel | |
| parent | 96fa2b508d2d3fe040cf4ef2fffb955f0a537ea1 (diff) | |
| parent | d103d01e4b19f185d3c85f77402b605534c32e89 (diff) | |
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (470 commits)
x86: Fix comments of register/stack access functions
perf tools: Replace %m with %a in sscanf
hw-breakpoints: Keep track of user disabled breakpoints
tracing/syscalls: Make syscall events print callbacks static
tracing: Add DEFINE_EVENT(), DEFINE_SINGLE_EVENT() support to docbook
perf: Don't free perf_mmap_data until work has been done
perf_event: Fix compile error
perf tools: Fix _GNU_SOURCE macro related strndup() build error
trace_syscalls: Remove unused syscall_name_to_nr()
trace_syscalls: Simplify syscall profile
trace_syscalls: Remove duplicate init_enter_##sname()
trace_syscalls: Add syscall_nr field to struct syscall_metadata
trace_syscalls: Remove enter_id exit_id
trace_syscalls: Set event_enter_##sname->data to its metadata
trace_syscalls: Remove unused event_syscall_enter and event_syscall_exit
perf_event: Initialize data.period in perf_swevent_hrtimer()
perf probe: Simplify event naming
perf probe: Add --list option for listing current probe events
perf probe: Add argv_split() from lib/argv_split.c
perf probe: Move probe event utility functions to probe-event.c
...
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Makefile | 2 | ||||
| -rw-r--r-- | kernel/exit.c | 5 | ||||
| -rw-r--r-- | kernel/hw_breakpoint.c | 423 | ||||
| -rw-r--r-- | kernel/kallsyms.c | 1 | ||||
| -rw-r--r-- | kernel/kprobes.c | 68 | ||||
| -rw-r--r-- | kernel/lockdep.c | 2 | ||||
| -rw-r--r-- | kernel/notifier.c | 2 | ||||
| -rw-r--r-- | kernel/perf_event.c | 627 | ||||
| -rw-r--r-- | kernel/signal.c | 27 | ||||
| -rw-r--r-- | kernel/trace/Kconfig | 38 | ||||
| -rw-r--r-- | kernel/trace/Makefile | 2 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 15 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 38 | ||||
| -rw-r--r-- | kernel/trace/trace_entries.h | 16 | ||||
| -rw-r--r-- | kernel/trace/trace_event_profile.c | 43 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 168 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 310 | ||||
| -rw-r--r-- | kernel/trace/trace_export.c | 39 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 1523 | ||||
| -rw-r--r-- | kernel/trace/trace_ksym.c | 550 | ||||
| -rw-r--r-- | kernel/trace/trace_selftest.c | 55 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 195 |
22 files changed, 3574 insertions, 575 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index dcf6789bf547..982c50e2ce53 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -21,6 +21,7 @@ CFLAGS_REMOVE_mutex-debug.o = -pg | |||
| 21 | CFLAGS_REMOVE_rtmutex-debug.o = -pg | 21 | CFLAGS_REMOVE_rtmutex-debug.o = -pg |
| 22 | CFLAGS_REMOVE_cgroup-debug.o = -pg | 22 | CFLAGS_REMOVE_cgroup-debug.o = -pg |
| 23 | CFLAGS_REMOVE_sched_clock.o = -pg | 23 | CFLAGS_REMOVE_sched_clock.o = -pg |
| 24 | CFLAGS_REMOVE_perf_event.o = -pg | ||
| 24 | endif | 25 | endif |
| 25 | 26 | ||
| 26 | obj-$(CONFIG_FREEZER) += freezer.o | 27 | obj-$(CONFIG_FREEZER) += freezer.o |
| @@ -97,6 +98,7 @@ obj-$(CONFIG_SMP) += sched_cpupri.o | |||
| 97 | obj-$(CONFIG_SLOW_WORK) += slow-work.o | 98 | obj-$(CONFIG_SLOW_WORK) += slow-work.o |
| 98 | obj-$(CONFIG_SLOW_WORK_DEBUG) += slow-work-debugfs.o | 99 | obj-$(CONFIG_SLOW_WORK_DEBUG) += slow-work-debugfs.o |
| 99 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o | 100 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o |
| 101 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o | ||
| 100 | 102 | ||
| 101 | ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) | 103 | ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) |
| 102 | # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is | 104 | # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is |
diff --git a/kernel/exit.c b/kernel/exit.c index f7864ac2ecc1..3f45e3cf931d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/init_task.h> | 49 | #include <linux/init_task.h> |
| 50 | #include <linux/perf_event.h> | 50 | #include <linux/perf_event.h> |
| 51 | #include <trace/events/sched.h> | 51 | #include <trace/events/sched.h> |
| 52 | #include <linux/hw_breakpoint.h> | ||
| 52 | 53 | ||
| 53 | #include <asm/uaccess.h> | 54 | #include <asm/uaccess.h> |
| 54 | #include <asm/unistd.h> | 55 | #include <asm/unistd.h> |
| @@ -978,6 +979,10 @@ NORET_TYPE void do_exit(long code) | |||
| 978 | proc_exit_connector(tsk); | 979 | proc_exit_connector(tsk); |
| 979 | 980 | ||
| 980 | /* | 981 | /* |
| 982 | * FIXME: do that only when needed, using sched_exit tracepoint | ||
| 983 | */ | ||
| 984 | flush_ptrace_hw_breakpoint(tsk); | ||
| 985 | /* | ||
| 981 | * Flush inherited counters to the parent - before the parent | 986 | * Flush inherited counters to the parent - before the parent |
| 982 | * gets woken up by child-exit notifications. | 987 | * gets woken up by child-exit notifications. |
| 983 | */ | 988 | */ |
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c new file mode 100644 index 000000000000..cf5ee1628411 --- /dev/null +++ b/kernel/hw_breakpoint.c | |||
| @@ -0,0 +1,423 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 15 | * | ||
| 16 | * Copyright (C) 2007 Alan Stern | ||
| 17 | * Copyright (C) IBM Corporation, 2009 | ||
| 18 | * Copyright (C) 2009, Frederic Weisbecker <fweisbec@gmail.com> | ||
| 19 | * | ||
| 20 | * Thanks to Ingo Molnar for his many suggestions. | ||
| 21 | * | ||
| 22 | * Authors: Alan Stern <stern@rowland.harvard.edu> | ||
| 23 | * K.Prasad <prasad@linux.vnet.ibm.com> | ||
| 24 | * Frederic Weisbecker <fweisbec@gmail.com> | ||
| 25 | */ | ||
| 26 | |||
| 27 | /* | ||
| 28 | * HW_breakpoint: a unified kernel/user-space hardware breakpoint facility, | ||
| 29 | * using the CPU's debug registers. | ||
| 30 | * This file contains the arch-independent routines. | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include <linux/irqflags.h> | ||
| 34 | #include <linux/kallsyms.h> | ||
| 35 | #include <linux/notifier.h> | ||
| 36 | #include <linux/kprobes.h> | ||
| 37 | #include <linux/kdebug.h> | ||
| 38 | #include <linux/kernel.h> | ||
| 39 | #include <linux/module.h> | ||
| 40 | #include <linux/percpu.h> | ||
| 41 | #include <linux/sched.h> | ||
| 42 | #include <linux/init.h> | ||
| 43 | #include <linux/smp.h> | ||
| 44 | |||
| 45 | #include <linux/hw_breakpoint.h> | ||
| 46 | |||
| 47 | /* | ||
| 48 | * Constraints data | ||
| 49 | */ | ||
| 50 | |||
| 51 | /* Number of pinned cpu breakpoints in a cpu */ | ||
| 52 | static DEFINE_PER_CPU(unsigned int, nr_cpu_bp_pinned); | ||
| 53 | |||
| 54 | /* Number of pinned task breakpoints in a cpu */ | ||
| 55 | static DEFINE_PER_CPU(unsigned int, task_bp_pinned[HBP_NUM]); | ||
| 56 | |||
| 57 | /* Number of non-pinned cpu/task breakpoints in a cpu */ | ||
| 58 | static DEFINE_PER_CPU(unsigned int, nr_bp_flexible); | ||
| 59 | |||
| 60 | /* Gather the number of total pinned and un-pinned bp in a cpuset */ | ||
| 61 | struct bp_busy_slots { | ||
| 62 | unsigned int pinned; | ||
| 63 | unsigned int flexible; | ||
| 64 | }; | ||
| 65 | |||
| 66 | /* Serialize accesses to the above constraints */ | ||
| 67 | static DEFINE_MUTEX(nr_bp_mutex); | ||
| 68 | |||
| 69 | /* | ||
| 70 | * Report the maximum number of pinned breakpoints a task | ||
| 71 | * have in this cpu | ||
| 72 | */ | ||
| 73 | static unsigned int max_task_bp_pinned(int cpu) | ||
| 74 | { | ||
| 75 | int i; | ||
| 76 | unsigned int *tsk_pinned = per_cpu(task_bp_pinned, cpu); | ||
| 77 | |||
| 78 | for (i = HBP_NUM -1; i >= 0; i--) { | ||
| 79 | if (tsk_pinned[i] > 0) | ||
| 80 | return i + 1; | ||
| 81 | } | ||
| 82 | |||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | |||
| 86 | /* | ||
| 87 | * Report the number of pinned/un-pinned breakpoints we have in | ||
| 88 | * a given cpu (cpu > -1) or in all of them (cpu = -1). | ||
| 89 | */ | ||
| 90 | static void fetch_bp_busy_slots(struct bp_busy_slots *slots, int cpu) | ||
| 91 | { | ||
| 92 | if (cpu >= 0) { | ||
| 93 | slots->pinned = per_cpu(nr_cpu_bp_pinned, cpu); | ||
| 94 | slots->pinned += max_task_bp_pinned(cpu); | ||
| 95 | slots->flexible = per_cpu(nr_bp_flexible, cpu); | ||
| 96 | |||
| 97 | return; | ||
| 98 | } | ||
| 99 | |||
| 100 | for_each_online_cpu(cpu) { | ||
| 101 | unsigned int nr; | ||
| 102 | |||
| 103 | nr = per_cpu(nr_cpu_bp_pinned, cpu); | ||
| 104 | nr += max_task_bp_pinned(cpu); | ||
| 105 | |||
| 106 | if (nr > slots->pinned) | ||
| 107 | slots->pinned = nr; | ||
| 108 | |||
| 109 | nr = per_cpu(nr_bp_flexible, cpu); | ||
| 110 | |||
| 111 | if (nr > slots->flexible) | ||
| 112 | slots->flexible = nr; | ||
| 113 | } | ||
| 114 | |||
