aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2009-04-08 09:01:33 -0400
committerIngo Molnar <mingo@elte.hu>2009-04-08 13:05:56 -0400
commit78f13e9525ba777da25c4ddab89f28e9366a8b7c (patch)
treed23d43df02330f39e9c31901df9956d2e58a3474 /arch/x86
parent4d855457d84b819fefcd1cd1b0a2a0a0ec475c07 (diff)
perf_counter: allow for data addresses to be recorded
Paul suggested we allow for data addresses to be recorded along with the traditional IPs as power can provide these. For now, only the software pagefault events provide data addresses, but in the future power might as well for some events. x86 doesn't seem capable of providing this atm. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> LKML-Reference: <20090408130409.394816925@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/cpu/perf_counter.c2
-rw-r--r--arch/x86/mm/fault.c8
2 files changed, 6 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/perf_counter.c b/arch/x86/kernel/cpu/perf_counter.c
index 1116a41bc7b5..0fcbaab83f9b 100644
--- a/arch/x86/kernel/cpu/perf_counter.c
+++ b/arch/x86/kernel/cpu/perf_counter.c
@@ -800,7 +800,7 @@ again:
800 continue; 800 continue;
801 801
802 perf_save_and_restart(counter); 802 perf_save_and_restart(counter);
803 if (perf_counter_overflow(counter, nmi, regs)) 803 if (perf_counter_overflow(counter, nmi, regs, 0))
804 __pmc_generic_disable(counter, &counter->hw, bit); 804 __pmc_generic_disable(counter, &counter->hw, bit);
805 } 805 }
806 806
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index f2d3324d9215..6f9df2babe48 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -1045,7 +1045,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
1045 if (unlikely(error_code & PF_RSVD)) 1045 if (unlikely(error_code & PF_RSVD))
1046 pgtable_bad(regs, error_code, address); 1046 pgtable_bad(regs, error_code, address);
1047 1047
1048 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS, 1, 0, regs); 1048 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS, 1, 0, regs, address);
1049 1049
1050 /* 1050 /*
1051 * If we're in an interrupt, have no user context or are running 1051 * If we're in an interrupt, have no user context or are running
@@ -1142,10 +1142,12 @@ good_area:
1142 1142
1143 if (fault & VM_FAULT_MAJOR) { 1143 if (fault & VM_FAULT_MAJOR) {
1144 tsk->maj_flt++; 1144 tsk->maj_flt++;
1145 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS_MAJ, 1, 0, regs); 1145 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS_MAJ, 1, 0,
1146 regs, address);
1146 } else { 1147 } else {
1147 tsk->min_flt++; 1148 tsk->min_flt++;
1148 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS_MIN, 1, 0, regs); 1149 perf_swcounter_event(PERF_COUNT_PAGE_FAULTS_MIN, 1, 0,
1150 regs, address);
1149 } 1151 }
1150 1152
1151 check_v8086_mode(regs, address, tsk); 1153 check_v8086_mode(regs, address, tsk);