diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-10 00:18:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-10 00:18:06 -0500 |
| commit | bee2782f30f66898be3f74ad02e4d1f87a969694 (patch) | |
| tree | cd175099b587ad14d2e6d5208b9a5781d696dc7c | |
| parent | 5706ffd045c3810912c4982357d7daa721af3464 (diff) | |
| parent | 201e7deb9062bb9a8a5bc113e36457c3ff55b226 (diff) | |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull leftover perf fixes from Ingo Molnar:
"Two perf fixes left over from the previous cycle"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf session: Do not fail on processing out of order event
x86/asm/traps: Disable tracing and kprobes in fixup_bad_iret and sync_regs
| -rw-r--r-- | arch/x86/kernel/traps.c | 5 | ||||
| -rw-r--r-- | tools/perf/util/event.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 11 |
3 files changed, 9 insertions, 8 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index de801f22128a..07ab8e9733c5 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -387,7 +387,7 @@ NOKPROBE_SYMBOL(do_int3); | |||
| 387 | * for scheduling or signal handling. The actual stack switch is done in | 387 | * for scheduling or signal handling. The actual stack switch is done in |
| 388 | * entry.S | 388 | * entry.S |
| 389 | */ | 389 | */ |
| 390 | asmlinkage __visible struct pt_regs *sync_regs(struct pt_regs *eregs) | 390 | asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs) |
| 391 | { | 391 | { |
| 392 | struct pt_regs *regs = eregs; | 392 | struct pt_regs *regs = eregs; |
| 393 | /* Did already sync */ | 393 | /* Did already sync */ |
| @@ -413,7 +413,7 @@ struct bad_iret_stack { | |||
| 413 | struct pt_regs regs; | 413 | struct pt_regs regs; |
| 414 | }; | 414 | }; |
| 415 | 415 | ||
| 416 | asmlinkage __visible | 416 | asmlinkage __visible notrace |
| 417 | struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s) | 417 | struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s) |
| 418 | { | 418 | { |
| 419 | /* | 419 | /* |
| @@ -436,6 +436,7 @@ struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s) | |||
| 436 | BUG_ON(!user_mode_vm(&new_stack->regs)); | 436 | BUG_ON(!user_mode_vm(&new_stack->regs)); |
| 437 | return new_stack; | 437 | return new_stack; |
| 438 | } | 438 | } |
| 439 | NOKPROBE_SYMBOL(fixup_bad_iret); | ||
| 439 | #endif | 440 | #endif |
| 440 | 441 | ||
| 441 | /* | 442 | /* |
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 09b9e8d3fcf7..c4ffe2bd0738 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
| @@ -242,6 +242,7 @@ struct events_stats { | |||
| 242 | u32 nr_invalid_chains; | 242 | u32 nr_invalid_chains; |
| 243 | u32 nr_unknown_id; | 243 | u32 nr_unknown_id; |
| 244 | u32 nr_unprocessable_samples; | 244 | u32 nr_unprocessable_samples; |
| 245 | u32 nr_unordered_events; | ||
| 245 | }; | 246 | }; |
| 246 | 247 | ||
| 247 | struct attr_event { | 248 | struct attr_event { |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 6ac62ae6b8fa..5f0e05a76c05 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -533,15 +533,11 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event, | |||
| 533 | return -ETIME; | 533 | return -ETIME; |
| 534 | 534 | ||
| 535 | if (timestamp < oe->last_flush) { | 535 | if (timestamp < oe->last_flush) { |
| 536 | WARN_ONCE(1, "Timestamp below last timeslice flush\n"); | 536 | pr_oe_time(timestamp, "out of order event\n"); |
| 537 | |||
| 538 | pr_oe_time(timestamp, "out of order event"); | ||
| 539 | pr_oe_time(oe->last_flush, "last flush, last_flush_type %d\n", | 537 | pr_oe_time(oe->last_flush, "last flush, last_flush_type %d\n", |
| 540 | oe->last_flush_type); | 538 | oe->last_flush_type); |
| 541 | 539 | ||
| 542 | /* We could get out of order messages after forced flush. */ | 540 | s->stats.nr_unordered_events++; |
| 543 | if (oe->last_flush_type != OE_FLUSH__HALF) | ||
| 544 | return -EINVAL; | ||
| 545 | } | 541 | } |
| 546 | 542 | ||
| 547 | new = ordered_events__new(oe, timestamp, event); | 543 | new = ordered_events__new(oe, timestamp, event); |
| @@ -1118,6 +1114,9 @@ static void perf_session__warn_about_errors(const struct perf_session *session, | |||
| 1118 | "Do you have a KVM guest running and not using 'perf kvm'?\n", | 1114 | "Do you have a KVM guest running and not using 'perf kvm'?\n", |
| 1119 | session->stats.nr_unprocessable_samples); | 1115 | session->stats.nr_unprocessable_samples); |
| 1120 | } | 1116 | } |
| 1117 | |||
| 1118 | if (session->stats.nr_unordered_events != 0) | ||
| 1119 | ui__warning("%u out of order events recorded.\n", session->stats.nr_unordered_events); | ||
| 1121 | } | 1120 | } |
| 1122 | 1121 | ||
| 1123 | volatile int session_done; | 1122 | volatile int session_done; |
