diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-05-17 22:26:53 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-05-18 00:35:23 -0400 |
| commit | f0218b3e9974f06014b61be8987159f4a20e011e (patch) | |
| tree | 29a593c4d71ab18cb0c450a34e79bf6bea66877e /kernel | |
| parent | 1eaa4787a774c4896518c81f24e8bccaa2244924 (diff) | |
| parent | 9d192e118a094087494997ea1c8a2faf39af38c5 (diff) | |
Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip into trace/tip/tracing/core-6
Conflicts:
include/trace/ftrace.h
kernel/trace/trace_kprobe.c
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup_freezer.c | 5 | ||||
| -rw-r--r-- | kernel/fork.c | 3 | ||||
| -rw-r--r-- | kernel/hw_breakpoint.c | 196 | ||||
| -rw-r--r-- | kernel/kprobes.c | 132 | ||||
| -rw-r--r-- | kernel/lockdep.c | 4 | ||||
| -rw-r--r-- | kernel/perf_event.c | 379 | ||||
| -rw-r--r-- | kernel/ptrace.c | 1 | ||||
| -rw-r--r-- | kernel/sched.c | 61 | ||||
| -rw-r--r-- | kernel/trace/Kconfig | 11 | ||||
| -rw-r--r-- | kernel/trace/Makefile | 1 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 20 | ||||
| -rw-r--r-- | kernel/trace/trace_entries.h | 12 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_hw_branches.c | 312 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 535 | ||||
| -rw-r--r-- | kernel/trace/trace_ksym.c | 26 | ||||
| -rw-r--r-- | kernel/trace/trace_selftest.c | 57 | ||||
| -rw-r--r-- | kernel/workqueue.c | 2 |
18 files changed, 849 insertions, 910 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index da5e13975531..e5c0244962b0 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
| @@ -205,9 +205,12 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) | |||
| 205 | * No lock is needed, since the task isn't on tasklist yet, | 205 | * No lock is needed, since the task isn't on tasklist yet, |
| 206 | * so it can't be moved to another cgroup, which means the | 206 | * so it can't be moved to another cgroup, which means the |
| 207 | * freezer won't be removed and will be valid during this | 207 | * freezer won't be removed and will be valid during this |
| 208 | * function call. | 208 | * function call. Nevertheless, apply RCU read-side critical |
| 209 | * section to suppress RCU lockdep false positives. | ||
| 209 | */ | 210 | */ |
| 211 | rcu_read_lock(); | ||
| 210 | freezer = task_freezer(task); | 212 | freezer = task_freezer(task); |
| 213 | rcu_read_unlock(); | ||
| 211 | 214 | ||
| 212 | /* | 215 | /* |
| 213 | * The root cgroup is non-freezable, so we can skip the | 216 | * The root cgroup is non-freezable, so we can skip the |
diff --git a/kernel/fork.c b/kernel/fork.c index 44b0791b0a2e..5d3592deaf71 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1111,9 +1111,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
| 1111 | p->memcg_batch.do_batch = 0; | 1111 | p->memcg_batch.do_batch = 0; |
| 1112 | p->memcg_batch.memcg = NULL; | 1112 | p->memcg_batch.memcg = NULL; |
| 1113 | #endif | 1113 | #endif |
| 1114 | |||
| 1115 | p->bts = NULL; | ||
| 1116 | |||
| 1117 | p->stack_start = stack_start; | 1114 | p->stack_start = stack_start; |
| 1118 | 1115 | ||
| 1119 | /* Perform scheduler related setup. Assign this task to a CPU. */ | 1116 | /* Perform scheduler related setup. Assign this task to a CPU. */ |
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index 03808ed342a6..7a56b22e0602 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
| @@ -40,23 +40,29 @@ | |||
| 40 | #include <linux/percpu.h> | 40 | #include <linux/percpu.h> |
| 41 | #include <linux/sched.h> | 41 | #include <linux/sched.h> |
| 42 | #include <linux/init.h> | 42 | #include <linux/init.h> |
| 43 | #include <linux/slab.h> | ||
| 43 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> |
| 44 | #include <linux/smp.h> | 45 | #include <linux/smp.h> |
| 45 | 46 | ||
| 46 | #include <linux/hw_breakpoint.h> | 47 | #include <linux/hw_breakpoint.h> |
| 47 | 48 | ||
| 49 | |||
| 48 | /* | 50 | /* |
| 49 | * Constraints data | 51 | * Constraints data |
| 50 | */ | 52 | */ |
| 51 | 53 | ||
| 52 | /* Number of pinned cpu breakpoints in a cpu */ | 54 | /* Number of pinned cpu breakpoints in a cpu */ |
| 53 | static DEFINE_PER_CPU(unsigned int, nr_cpu_bp_pinned); | 55 | static DEFINE_PER_CPU(unsigned int, nr_cpu_bp_pinned[TYPE_MAX]); |
| 54 | 56 | ||
| 55 | /* Number of pinned task breakpoints in a cpu */ | 57 | /* Number of pinned task breakpoints in a cpu */ |
| 56 | static DEFINE_PER_CPU(unsigned int, nr_task_bp_pinned[HBP_NUM]); | 58 | static DEFINE_PER_CPU(unsigned int *, nr_task_bp_pinned[TYPE_MAX]); |
| 57 | 59 | ||
| 58 | /* Number of non-pinned cpu/task breakpoints in a cpu */ | 60 | /* Number of non-pinned cpu/task breakpoints in a cpu */ |
| 59 | static DEFINE_PER_CPU(unsigned int, nr_bp_flexible); | 61 | static DEFINE_PER_CPU(unsigned int, nr_bp_flexible[TYPE_MAX]); |
| 62 | |||
| 63 | static int nr_slots[TYPE_MAX]; | ||
| 64 | |||
| 65 | static int constraints_initialized; | ||
| 60 | 66 | ||
| 61 | /* Gather the number of total pinned and un-pinned bp in a cpuset */ | 67 | /* Gather the number of total pinned and un-pinned bp in a cpuset */ |
| 62 | struct bp_busy_slots { | 68 | struct bp_busy_slots { |
| @@ -67,16 +73,29 @@ struct bp_busy_slots { | |||
| 67 | /* Serialize accesses to the above constraints */ | 73 | /* Serialize accesses to the above constraints */ |
| 68 | static DEFINE_MUTEX(nr_bp_mutex); | 74 | static DEFINE_MUTEX(nr_bp_mutex); |
| 69 | 75 | ||
| 76 | __weak int hw_breakpoint_weight(struct perf_event *bp) | ||
| 77 | { | ||
| 78 | return 1; | ||
| 79 | } | ||
| 80 | |||
| 81 | static inline enum bp_type_idx find_slot_idx(struct perf_event *bp) | ||
| 82 | { | ||
| 83 | if (bp->attr.bp_type & HW_BREAKPOINT_RW) | ||
| 84 | return TYPE_DATA; | ||
| 85 | |||
| 86 | return TYPE_INST; | ||
| 87 | } | ||
| 88 | |||
| 70 | /* | 89 | /* |
| 71 | * Report the maximum number of pinned breakpoints a task | 90 | * Report the maximum number of pinned breakpoints a task |
| 72 | * have in this cpu | 91 | * have in this cpu |
| 73 | */ | 92 | */ |
| 74 | static unsigned int max_task_bp_pinned(int cpu) | 93 | static unsigned int max_task_bp_pinned(int cpu, enum bp_type_idx type) |
| 75 | { | 94 | { |
| 76 | int i; | 95 | int i; |
| 77 | unsigned int *tsk_pinned = per_cpu(nr_task_bp_pinned, cpu); | 96 | unsigned int *tsk_pinned = per_cpu(nr_task_bp_pinned[type], cpu); |
| 78 | 97 | ||
| 79 | for (i = HBP_NUM -1; i >= 0; i--) { | 98 | for (i = nr_slots[type] - 1; i >= 0; i--) { |
| 80 | if (tsk_pinned[i] > 0) | 99 | if (tsk_pinned[i] > 0) |
| 81 | return i + 1; | 100 | return i + 1; |
| 82 | } | 101 | } |
| @@ -84,7 +103,7 @@ static unsigned int max_task_bp_pinned(int cpu) | |||
| 84 | return 0; | 103 | return 0; |
| 85 | } | 104 | } |
| 86 | 105 | ||
| 87 | static int task_bp_pinned(struct task_struct *tsk) | 106 | static int task_bp_pinned(struct task_struct *tsk, enum bp_type_idx type) |
| 88 | { | 107 | { |
| 89 | struct perf_event_context *ctx = tsk->perf_event_ctxp; | 108 | struct perf_event_context *ctx = tsk->perf_event_ctxp; |
| 90 | struct list_head *list; | 109 | struct list_head *list; |
| @@ -105,7 +124,8 @@ static int task_bp_pinned(struct task_struct *tsk) | |||
| 105 | */ | 124 | */ |
| 106 | list_for_each_entry(bp, list, event_entry) { | 125 | list_for_each_entry(bp, list, event_entry) { |
| 107 | if (bp->attr.type == PERF_TYPE_BREAKPOINT) | 126 | if (bp->attr.type == PERF_TYPE_BREAKPOINT) |
| 108 | count++; | 127 | if (find_slot_idx(bp) == type) |
| 128 | count += hw_breakpoint_weight(bp); | ||
| 109 | } | 129 | } |
| 110 | 130 | ||
| 111 | raw_spin_unlock_irqrestore(&ctx->lock, flags); | 131 | raw_spin_unlock_irqrestore(&ctx->lock, flags); |
| @@ -118,18 +138,19 @@ static int task_bp_pinned(struct task_struct *tsk) | |||
| 118 | * a given cpu (cpu > -1) or in all of them (cpu = -1). | 138 | * a given cpu (cpu > -1) or in all of them (cpu = -1). |
| 119 | */ | 139 | */ |
| 120 | static void | 140 | static void |
| 121 | fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp) | 141 | fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp, |
| 142 | enum bp_type_idx type) | ||
| 122 | { | 143 | { |
| 123 | int cpu = bp->cpu; | 144 | int cpu = bp->cpu; |
| 124 | struct task_struct *tsk = bp->ctx->task; | 145 | struct task_struct *tsk = bp->ctx->task; |
| 125 | 146 | ||
| 126 | if (cpu >= 0) { | 147 | if (cpu >= 0) { |
| 127 | slots->pinned = per_cpu(nr_cpu_bp_pinned, cpu); | 148 | slots->pinned = per_cpu(nr_cpu_bp_pinned[type], cpu); |
| 128 | if (!tsk) | 149 | if (!tsk) |
| 129 | slots->pinned += max_task_bp_pinned(cpu); | 150 | slots->pinned += max_task_bp_pinned(cpu, type); |
| 130 | else | 151 | else |
| 131 | slots->pinned += task_bp_pinned(tsk); | 152 | slots->pinned += task_bp_pinned(tsk, type); |
| 132 | slots->flexible = per_cpu(nr_bp_flexible, cpu); | 153 | slots->flexible = per_cpu(nr_bp_flexible[type], cpu); |
| 133 | 154 | ||
| 134 | return; | 155 | return; |
| 135 | } | ||
