diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-18 19:52:46 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-18 19:52:46 -0400 |
| commit | f82c37e7bb4c4d9b6a476c642d5c2d2efbd6f240 (patch) | |
| tree | 09fc553c2fb6f527962048d139159dc139e04afc /kernel | |
| parent | c6b9e73f2fee8bb86058f296de808b326473456b (diff) | |
| parent | dcd5c1662db59a6b82942f47fb6ac9dd63f6d3dd (diff) | |
Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (35 commits)
perf: Fix unexported generic perf_arch_fetch_caller_regs
perf record: Don't try to find buildids in a zero sized file
perf: export perf_trace_regs and perf_arch_fetch_caller_regs
perf, x86: Fix hw_perf_enable() event assignment
perf, ppc: Fix compile error due to new cpu notifiers
perf: Make the install relative to DESTDIR if specified
kprobes: Calculate the index correctly when freeing the out-of-line execution slot
perf tools: Fix sparse CPU numbering related bugs
perf_event: Fix oops triggered by cpu offline/online
perf: Drop the obsolete profile naming for trace events
perf: Take a hot regs snapshot for trace events
perf: Introduce new perf_fetch_caller_regs() for hot regs snapshot
perf/x86-64: Use frame pointer to walk on irq and process stacks
lockdep: Move lock events under lockdep recursion protection
perf report: Print the map table just after samples for which no map was found
perf report: Add multiple event support
perf session: Change perf_session post processing functions to take histogram tree
perf session: Add storage for seperating event types in report
perf session: Change add_hist_entry to take the tree root instead of session
perf record: Add ID and to recorded event data when recording multiple events
...
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kprobes.c | 3 | ||||
| -rw-r--r-- | kernel/lockdep.c | 9 | ||||
| -rw-r--r-- | kernel/perf_event.c | 84 | ||||
| -rw-r--r-- | kernel/trace/Makefile | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_event_perf.c (renamed from kernel/trace/trace_event_profile.c) | 50 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 29 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 72 |
8 files changed, 126 insertions, 125 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index fa034d29cf73..0ed46f3e51e9 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -259,7 +259,8 @@ static void __kprobes __free_insn_slot(struct kprobe_insn_cache *c, | |||
| 259 | struct kprobe_insn_page *kip; | 259 | struct kprobe_insn_page *kip; |
| 260 | 260 | ||
| 261 | list_for_each_entry(kip, &c->pages, list) { | 261 | list_for_each_entry(kip, &c->pages, list) { |
| 262 | long idx = ((long)slot - (long)kip->insns) / c->insn_size; | 262 | long idx = ((long)slot - (long)kip->insns) / |
| 263 | (c->insn_size * sizeof(kprobe_opcode_t)); | ||
| 263 | if (idx >= 0 && idx < slots_per_page(c)) { | 264 | if (idx >= 0 && idx < slots_per_page(c)) { |
| 264 | WARN_ON(kip->slot_used[idx] != SLOT_USED); | 265 | WARN_ON(kip->slot_used[idx] != SLOT_USED); |
| 265 | if (dirty) { | 266 | if (dirty) { |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 681bc2e1e187..c927a549db2c 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -3211,8 +3211,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
| 3211 | { | 3211 | { |
| 3212 | unsigned long flags; | 3212 | unsigned long flags; |
| 3213 | 3213 | ||
| 3214 | trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip); | ||
| 3215 | |||
| 3216 | if (unlikely(current->lockdep_recursion)) | 3214 | if (unlikely(current->lockdep_recursion)) |
| 3217 | return; | 3215 | return; |
| 3218 | 3216 | ||
| @@ -3220,6 +3218,7 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
| 3220 | check_flags(flags); | 3218 | check_flags(flags); |
| 3221 | 3219 | ||
| 3222 | current->lockdep_recursion = 1; | 3220 | current->lockdep_recursion = 1; |
| 3221 | trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip); | ||
| 3223 | __lock_acquire(lock, subclass, trylock, read, check, | 3222 | __lock_acquire(lock, subclass, trylock, read, check, |
| 3224 | irqs_disabled_flags(flags), nest_lock, ip, 0); | 3223 | irqs_disabled_flags(flags), nest_lock, ip, 0); |
| 3225 | current->lockdep_recursion = 0; | 3224 | current->lockdep_recursion = 0; |
| @@ -3232,14 +3231,13 @@ void lock_release(struct lockdep_map *lock, int nested, | |||
| 3232 | { | 3231 | { |
| 3233 | unsigned long flags; | 3232 | unsigned long flags; |
| 3234 | 3233 | ||
| 3235 | trace_lock_release(lock, nested, ip); | ||
| 3236 | |||
| 3237 | if (unlikely(current->lockdep_recursion)) | 3234 | if (unlikely(current->lockdep_recursion)) |
| 3238 | return; | 3235 | return; |
| 3239 | 3236 | ||
| 3240 | raw_local_irq_save(flags); | 3237 | raw_local_irq_save(flags); |
| 3241 | check_flags(flags); | 3238 | check_flags(flags); |
| 3242 | current->lockdep_recursion = 1; | 3239 | current->lockdep_recursion = 1; |
| 3240 | trace_lock_release(lock, nested, ip); | ||
| 3243 | __lock_release(lock, nested, ip); | 3241 | __lock_release(lock, nested, ip); |
| 3244 | current->lockdep_recursion = 0; | 3242 | current->lockdep_recursion = 0; |
| 3245 | raw_local_irq_restore(flags); | 3243 | raw_local_irq_restore(flags); |
| @@ -3413,8 +3411,6 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip) | |||
| 3413 | { | 3411 | { |
| 3414 | unsigned long flags; | 3412 | unsigned long flags; |
| 3415 | 3413 | ||
| 3416 | trace_lock_contended(lock, ip); | ||
| 3417 | |||
| 3418 | if (unlikely(!lock_stat)) | 3414 | if (unlikely(!lock_stat)) |
| 3419 | return; | 3415 | return; |
| 3420 | 3416 | ||
| @@ -3424,6 +3420,7 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip) | |||
| 3424 | raw_local_irq_save(flags); | 3420 | raw_local_irq_save(flags); |
| 3425 | check_flags(flags); | 3421 | check_flags(flags); |
| 3426 | current->lockdep_recursion = 1; | 3422 | current->lockdep_recursion = 1; |
| 3423 | trace_lock_contended(lock, ip); | ||
| 3427 | __lock_contended(lock, ip); | 3424 | __lock_contended(lock, ip); |
| 3428 | current->lockdep_recursion = 0; | 3425 | current->lockdep_recursion = 0; |
| 3429 | raw_local_irq_restore(flags); | 3426 | raw_local_irq_restore(flags); |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 4393b9e73740..574ee58a3046 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -81,10 +81,6 @@ extern __weak const struct pmu *hw_perf_event_init(struct perf_event *event) | |||
| 81 | void __weak hw_perf_disable(void) { barrier(); } | 81 | void __weak hw_perf_disable(void) { barrier(); } |
| 82 | void __weak hw_perf_enable(void) { barrier(); } | 82 | void __weak hw_perf_enable(void) { barrier(); } |
| 83 | 83 | ||
| 84 | void __weak hw_perf_event_setup(int cpu) { barrier(); } | ||
| 85 | void __weak hw_perf_event_setup_online(int cpu) { barrier(); } | ||
| 86 | void __weak hw_perf_event_setup_offline(int cpu) { barrier(); } | ||
| 87 | |||
| 88 | int __weak | 84 | int __weak |
| 89 | hw_perf_group_sched_in(struct perf_event *group_leader, | 85 | hw_perf_group_sched_in(struct perf_event *group_leader, |
| 90 | struct perf_cpu_context *cpuctx, | 86 | struct perf_cpu_context *cpuctx, |
| @@ -97,25 +93,15 @@ void __weak perf_event_print_debug(void) { } | |||
| 97 | 93 | ||
| 98 | static DEFINE_PER_CPU(int, perf_disable_count); | 94 | static DEFINE_PER_CPU(int, perf_disable_count); |
| 99 | 95 | ||
| 100 | void __perf_disable(void) | ||
| 101 | { | ||
| 102 | __get_cpu_var(perf_disable_count)++; | ||
| 103 | } | ||
| 104 | |||
| 105 | bool __perf_enable(void) | ||
| 106 | { | ||
| 107 | return !--__get_cpu_var(perf_disable_count); | ||
| 108 | } | ||
| 109 | |||
| 110 | void perf_disable(void) | 96 | void perf_disable(void) |
| 111 | { | 97 | { |
| 112 | __perf_disable(); | 98 | if (!__get_cpu_var(perf_disable_count)++) |
| 113 | hw_perf_disable(); | 99 | hw_perf_disable(); |
| 114 | } | 100 | } |
| 115 | 101 | ||
| 116 | void perf_enable(void) | 102 | void perf_enable(void) |
| 117 | { | 103 | { |
| 118 | if (__perf_enable()) | 104 | if (!--__get_cpu_var(perf_disable_count)) |
| 119 | hw_perf_enable(); | 105 | hw_perf_enable(); |
| 120 | } | 106 | } |
| 121 | 107 | ||
| @@ -1538,12 +1524,15 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) | |||
| 1538 | */ | 1524 | */ |
| 1539 | if (interrupts == MAX_INTERRUPTS) { | 1525 | if (interrupts == MAX_INTERRUPTS) { |
| 1540 | perf_log_throttle(event, 1); | 1526 | perf_log_throttle(event, 1); |
| 1527 | perf_disable(); | ||
| 1541 | event->pmu->unthrottle(event); | 1528 | event->pmu->unthrottle(event); |
| 1529 | perf_enable(); | ||
| 1542 | } | 1530 | } |
| 1543 | 1531 | ||
| 1544 | if (!event->attr.freq || !event->attr.sample_freq) | 1532 | if (!event->attr.freq || !event->attr.sample_freq) |
| 1545 | continue; | 1533 | continue; |
| 1546 | 1534 | ||
| 1535 | perf_disable(); | ||
| 1547 | event->pmu->read(event); | 1536 | event->pmu->read(event); |
| 1548 | now = atomic64_read(&event->count); | 1537 | now = atomic64_read(&event->count); |
| 1549 | delta = now - hwc->freq_count_stamp; | 1538 | delta = now - hwc->freq_count_stamp; |
| @@ -1551,6 +1540,7 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) | |||
| 1551 | 1540 | ||
| 1552 | if (delta > 0) | 1541 | if (delta > 0) |
| 1553 | perf_adjust_period(event, TICK_NSEC, delta); | 1542 | perf_adjust_period(event, TICK_NSEC, delta); |
| 1543 | perf_enable(); | ||
| 1554 | } | 1544 | } |
| 1555 | raw_spin_unlock(&ctx->lock); | 1545 | raw_spin_unlock(&ctx->lock); |
| 1556 | } | 1546 | } |
| @@ -1560,9 +1550,6 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) | |||
| 1560 | */ | 1550 | */ |
| 1561 | static void rotate_ctx(struct perf_event_context *ctx) | 1551 | static void rotate_ctx(struct perf_event_context *ctx) |
| 1562 | { | 1552 | { |
| 1563 | if (!ctx->nr_events) | ||
| 1564 | return; | ||
| 1565 | |||
| 1566 | raw_spin_lock(&ctx->lock); | 1553 | raw_spin_lock(&ctx->lock); |
| 1567 | 1554 | ||
| 1568 | /* Rotate the first entry last of non-pinned groups */ | 1555 | /* Rotate the first entry last of non-pinned groups */ |
| @@ -1575,19 +1562,28 @@ void perf_event_task_tick(struct task_struct *curr) | |||
| 1575 | { | 1562 | { |
| 1576 | struct perf_cpu_context *cpuctx; | 1563 | struct perf_cpu_context *cpuctx; |
| 1577 | struct perf_event_context *ctx; | 1564 | struct perf_event_context *ctx; |
| 1565 | int rotate = 0; | ||
