Skip to content

Commit

Permalink
x86, trace: Add page fault tracepoints
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Seiji Aguchi authored and H. Peter Anvin committed Nov 8, 2013
1 parent ac7956e commit d34603b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 0 deletions.
52 changes: 52 additions & 0 deletions arch/x86/include/asm/trace/exceptions.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#undef TRACE_SYSTEM
#define TRACE_SYSTEM exceptions

#if !defined(_TRACE_PAGE_FAULT_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_PAGE_FAULT_H

#include <linux/tracepoint.h>

extern void trace_irq_vector_regfunc(void);
extern void trace_irq_vector_unregfunc(void);

DECLARE_EVENT_CLASS(x86_exceptions,

TP_PROTO(unsigned long address, struct pt_regs *regs,
unsigned long error_code),

TP_ARGS(address, regs, error_code),

TP_STRUCT__entry(
__field( unsigned long, address )
__field( unsigned long, ip )
__field( unsigned long, error_code )
),

TP_fast_assign(
__entry->address = address;
__entry->ip = regs->ip;
__entry->error_code = error_code;
),

TP_printk("address=%pf ip=%pf error_code=0x%lx",
(void *)__entry->address, (void *)__entry->ip,
__entry->error_code) );

#define DEFINE_PAGE_FAULT_EVENT(name) \
DEFINE_EVENT_FN(x86_exceptions, name, \
TP_PROTO(unsigned long address, struct pt_regs *regs, \
unsigned long error_code), \
TP_ARGS(address, regs, error_code), \
trace_irq_vector_regfunc, \
trace_irq_vector_unregfunc);

DEFINE_PAGE_FAULT_EVENT(user_page_fault);
DEFINE_PAGE_FAULT_EVENT(kernel_page_fault);

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE exceptions
#endif /* _TRACE_PAGE_FAULT_H */

/* This part must be outside protection */
#include <trace/define_trace.h>
2 changes: 2 additions & 0 deletions arch/x86/mm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ nostackp := $(call cc-option, -fno-stack-protector)
CFLAGS_physaddr.o := $(nostackp)
CFLAGS_setup_nx.o := $(nostackp)

CFLAGS_fault.o := -I$(src)/../include/asm/trace

obj-$(CONFIG_X86_PAT) += pat_rbtree.o
obj-$(CONFIG_SMP) += tlb.o

Expand Down
13 changes: 13 additions & 0 deletions arch/x86/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
#include <asm/kmemcheck.h> /* kmemcheck_*(), ... */
#include <asm/fixmap.h> /* VSYSCALL_START */

#define CREATE_TRACE_POINTS
#include <asm/trace/exceptions.h>

/*
* Page fault error code bits:
*
Expand Down Expand Up @@ -1232,12 +1235,22 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
exception_exit(prev_state);
}

static void trace_page_fault_entries(struct pt_regs *regs,
unsigned long error_code)
{
if (user_mode(regs))
trace_user_page_fault(read_cr2(), regs, error_code);
else
trace_kernel_page_fault(read_cr2(), regs, error_code);
}

dotraplinkage void __kprobes
trace_do_page_fault(struct pt_regs *regs, unsigned long error_code)
{
enum ctx_state prev_state;

prev_state = exception_enter();
trace_page_fault_entries(regs, error_code);
__do_page_fault(regs, error_code);
exception_exit(prev_state);
}

0 comments on commit d34603b

Please sign in to comment.