On Thu, 2011-08-11 at 21:06 +0900, Akihiro Nagai wrote:Yes.Change perf_event_headder.misc to PERF_RECORD_MISC_USER for
BTS records, because BTS traces both kernel and user spaces
nevertheless perf specifies to trace only kernel or user space.
Now I'm confused..
If BTS traces both kernel and user, the MISC bit should reflect the
right state per-sample, on x86 that's easy enough to do by the address.
Current perf always enables IA32_DEBUGCTL_MSR.BTS_OFF_OS when traces with BTS.
---
arch/x86/kernel/cpu/perf_event_intel_ds.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c
index 1b1ef3a..323f3f0 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
@@ -340,6 +340,14 @@ static int intel_pmu_drain_bts_buffer(void)
*/
perf_prepare_sample(&header,&data, event,®s);
+ /*
+ * Since BTS can not trace kernel and user space separately, set
Uhm, IA32_DEBUGCTL_MSR.BTS_OFF_{OS,USR} seem to suggest it can?!
It looks good.
+ * PERF_RECORD_MISC_USER in header.misc to resolve both kernel and
+ * user DSOs and symbols.
+ */
+ header.misc&= ~PERF_RECORD_MISC_CPUMODE_MASK;
+ header.misc |= PERF_RECORD_MISC_USER;
So what's wrong with something like:
header.misc |= is_kernel_address(at->from) ?
PERF_RECORD_MISC_KERNEL :
PERF_RECORD_MISC_USER;
if (perf_output_begin(&handle, event, header.size * (top - at)))
return 1;