aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/fault.c
diff options
context:
space:
mode:
authorSeiji Aguchi <seiji.aguchi@hds.com>2013-10-30 16:39:03 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-11-08 17:15:49 -0500
commitd34603b07c4255b2b00a546d34f297ccd50ae4c6 (patch)
tree133e7788eb885d11cecc0590184f8825f4c0836f /arch/x86/mm/fault.c
parentac7956e2699380b8b10146ec2ba8cbe43a03ff7a (diff)
x86, trace: Add page fault tracepoints
This patch introduces page fault tracepoints to x86 architecture by switching IDT. Two events, for user and kernel spaces, are introduced at the beginning of page fault handler for tracing. - User space event There is a request of page fault event for user space as below. https://lkml.kernel.org/r/1368079520-11015-2-git-send-email-fdeslaur+()+gmail+!+com https://lkml.kernel.org/r/1368079520-11015-1-git-send-email-fdeslaur+()+gmail+!+com - Kernel space event: When we measure an overhead in kernel space for investigating performance issues, we can check if it comes from the page fault events. Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com> Link: http://lkml.kernel.org/r/52716E67.6090705@hds.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/mm/fault.c')
-rw-r--r--arch/x86/mm/fault.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index fd3e281fbc70..f2730cbce0b5 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -20,6 +20,9 @@
20#include <asm/kmemcheck.h> /* kmemcheck_*(), ... */ 20#include <asm/kmemcheck.h> /* kmemcheck_*(), ... */
21#include <asm/fixmap.h> /* VSYSCALL_START */ 21#include <asm/fixmap.h> /* VSYSCALL_START */
22 22
23#define CREATE_TRACE_POINTS
24#include <asm/trace/exceptions.h>
25
23/* 26/*
24 * Page fault error code bits: 27 * Page fault error code bits:
25 * 28 *
@@ -1232,12 +1235,22 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
1232 exception_exit(prev_state); 1235 exception_exit(prev_state);
1233} 1236}
1234 1237
1238static void trace_page_fault_entries(struct pt_regs *regs,
1239 unsigned long error_code)
1240{
1241 if (user_mode(regs))
1242 trace_user_page_fault(read_cr2(), regs, error_code);
1243 else
1244 trace_kernel_page_fault(read_cr2(), regs, error_code);
1245}
1246
1235dotraplinkage void __kprobes 1247dotraplinkage void __kprobes
1236trace_do_page_fault(struct pt_regs *regs, unsigned long error_code) 1248trace_do_page_fault(struct pt_regs *regs, unsigned long error_code)
1237{ 1249{
1238 enum ctx_state prev_state; 1250 enum ctx_state prev_state;
1239 1251
1240 prev_state = exception_enter(); 1252 prev_state = exception_enter();
1253 trace_page_fault_entries(regs, error_code);
1241 __do_page_fault(regs, error_code); 1254 __do_page_fault(regs, error_code);
1242 exception_exit(prev_state); 1255 exception_exit(prev_state);
1243} 1256}