Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1251955
| From | Andi Kleen <andi@firstfloor.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 1/5] x86, perf: Fix LBR call stack save/restore |
| Date | 2015-10-20 20:50 +0200 |
| Message-ID | <qlK8W-3Ji-9@gated-at.bofh.it> (permalink) |
| Organization | linux.* mail to news gateway |
From: Andi Kleen <ak@linux.intel.com>
This fixes a bug added with the earlier 90405aa02. The bug
could lead to lost LBR call stacks. When restoring the LBR
state we need to use the TOS of the previous context, not
the current context. To do that we need to save/restore the tos.
Cc: <stable@vger.kernel.org> # 4.2+
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
arch/x86/kernel/cpu/perf_event.h | 1 +
arch/x86/kernel/cpu/perf_event_intel_lbr.c | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
index d871c94..1b47164 100644
--- a/arch/x86/kernel/cpu/perf_event.h
+++ b/arch/x86/kernel/cpu/perf_event.h
@@ -631,6 +631,7 @@ struct x86_perf_task_context {
u64 lbr_from[MAX_LBR_ENTRIES];
u64 lbr_to[MAX_LBR_ENTRIES];
u64 lbr_info[MAX_LBR_ENTRIES];
+ int tos;
int lbr_callstack_users;
int lbr_stack_state;
};
diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
index ad0b8b0..0e4ea00 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
@@ -239,7 +239,7 @@ static void __intel_pmu_lbr_restore(struct x86_perf_task_context *task_ctx)
}
mask = x86_pmu.lbr_nr - 1;
- tos = intel_pmu_lbr_tos();
+ tos = task_ctx->tos;
for (i = 0; i < tos; i++) {
lbr_idx = (tos - i) & mask;
wrmsrl(x86_pmu.lbr_from + lbr_idx, task_ctx->lbr_from[i]);
@@ -247,6 +247,7 @@ static void __intel_pmu_lbr_restore(struct x86_perf_task_context *task_ctx)
if (x86_pmu.intel_cap.lbr_format == LBR_FORMAT_INFO)
wrmsrl(MSR_LBR_INFO_0 + lbr_idx, task_ctx->lbr_info[i]);
}
+ wrmsrl(x86_pmu.lbr_tos, tos);
task_ctx->lbr_stack_state = LBR_NONE;
}
@@ -270,6 +271,7 @@ static void __intel_pmu_lbr_save(struct x86_perf_task_context *task_ctx)
if (x86_pmu.intel_cap.lbr_format == LBR_FORMAT_INFO)
rdmsrl(MSR_LBR_INFO_0 + lbr_idx, task_ctx->lbr_info[i]);
}
+ task_ctx->tos = tos;
task_ctx->lbr_stack_state = LBR_VALID;
}
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[PATCH 1/5] x86, perf: Fix LBR call stack save/restore Andi Kleen <andi@firstfloor.org> - 2015-10-20 20:50 +0200
[PATCH 5/5] x86, perf: Avoid context switching LBR_INFO when not needed Andi Kleen <andi@firstfloor.org> - 2015-10-20 20:50 +0200
Re: [PATCH 5/5] x86, perf: Avoid context switching LBR_INFO when not needed Peter Zijlstra <peterz@infradead.org> - 2015-10-21 15:50 +0200
[PATCH 3/5] perf, tools: Disable branch flags/cycles for --callgraph lbr Andi Kleen <andi@firstfloor.org> - 2015-10-20 21:00 +0200
Re: [PATCH 3/5] perf, tools: Disable branch flags/cycles for --callgraph lbr Peter Zijlstra <peterz@infradead.org> - 2015-10-21 15:30 +0200
Re: [PATCH 3/5] perf, tools: Disable branch flags/cycles for --callgraph lbr Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-21 20:10 +0200
Re: [PATCH 1/5] x86, perf: Fix LBR call stack save/restore Peter Zijlstra <peterz@infradead.org> - 2015-10-21 15:20 +0200
Re: [PATCH 1/5] x86, perf: Fix LBR call stack save/restore Andi Kleen <andi@firstfloor.org> - 2015-10-21 16:40 +0200
Re: [PATCH 1/5] x86, perf: Fix LBR call stack save/restore Ingo Molnar <mingo@kernel.org> - 2015-10-21 18:30 +0200
csiph-web