Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
62a394eb
Commit
62a394eb
authored
Mar 13, 2009
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'tracing/ftrace' and 'tracing/syscalls'; commit 'v2.6.29-rc8' into tracing/core
parents
d2e82546
1b3fa2ce
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
161 additions
and
3 deletions
+161
-3
arch/x86/Kconfig
arch/x86/Kconfig
+1
-0
arch/x86/include/asm/thread_info.h
arch/x86/include/asm/thread_info.h
+6
-3
arch/x86/kernel/ptrace.c
arch/x86/kernel/ptrace.c
+7
-0
include/linux/ftrace.h
include/linux/ftrace.h
+21
-0
kernel/trace/Kconfig
kernel/trace/Kconfig
+10
-0
kernel/trace/Makefile
kernel/trace/Makefile
+1
-0
kernel/trace/trace.h
kernel/trace/trace.h
+2
-0
kernel/trace/trace_syscalls.c
kernel/trace/trace_syscalls.c
+113
-0
No files found.
arch/x86/Kconfig
View file @
62a394eb
...
...
@@ -35,6 +35,7 @@ config X86
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACE_MCOUNT_TEST
select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE
select HAVE_FTRACE_SYSCALLS
select HAVE_KVM
select HAVE_ARCH_KGDB
select HAVE_ARCH_TRACEHOOK
...
...
arch/x86/include/asm/thread_info.h
View file @
62a394eb
...
...
@@ -94,6 +94,7 @@ struct thread_info {
#define TIF_FORCED_TF 24
/* true if TF in eflags artificially */
#define TIF_DEBUGCTLMSR 25
/* uses thread_struct.debugctlmsr */
#define TIF_DS_AREA_MSR 26
/* uses thread_struct.ds_area_msr */
#define TIF_SYSCALL_FTRACE 27
/* for ftrace syscall instrumentation */
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
...
...
@@ -115,15 +116,17 @@ struct thread_info {
#define _TIF_FORCED_TF (1 << TIF_FORCED_TF)
#define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR)
#define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR)
#define _TIF_SYSCALL_FTRACE (1 << TIF_SYSCALL_FTRACE)
/* work to do in syscall_trace_enter() */
#define _TIF_WORK_SYSCALL_ENTRY \
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | \
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU |
_TIF_SYSCALL_FTRACE |
\
_TIF_SYSCALL_AUDIT | _TIF_SECCOMP | _TIF_SINGLESTEP)
/* work to do in syscall_trace_leave() */
#define _TIF_WORK_SYSCALL_EXIT \
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP)
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP | \
_TIF_SYSCALL_FTRACE)
/* work to do on interrupt/exception return */
#define _TIF_WORK_MASK \
...
...
@@ -132,7 +135,7 @@ struct thread_info {
_TIF_SINGLESTEP|_TIF_SECCOMP|_TIF_SYSCALL_EMU))
/* work to do on any return to user space */
#define _TIF_ALLWORK_MASK (
0x0000FFFF & ~_TIF_SECCOMP
)
#define _TIF_ALLWORK_MASK (
(0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_FTRACE
)
/* Only used for 64 bit */
#define _TIF_DO_NOTIFY_MASK \
...
...
arch/x86/kernel/ptrace.c
View file @
62a394eb
...
...
@@ -21,6 +21,7 @@
#include <linux/audit.h>
#include <linux/seccomp.h>
#include <linux/signal.h>
#include <linux/ftrace.h>
#include <asm/uaccess.h>
#include <asm/pgtable.h>
...
...
@@ -1416,6 +1417,9 @@ asmregparm long syscall_trace_enter(struct pt_regs *regs)
tracehook_report_syscall_entry
(
regs
))
ret
=
-
1L
;
if
(
unlikely
(
test_thread_flag
(
TIF_SYSCALL_FTRACE
)))
ftrace_syscall_enter
(
regs
);
if
(
unlikely
(
current
->
audit_context
))
{
if
(
IS_IA32
)
audit_syscall_entry
(
AUDIT_ARCH_I386
,
...
...
@@ -1439,6 +1443,9 @@ asmregparm void syscall_trace_leave(struct pt_regs *regs)
if
(
unlikely
(
current
->
audit_context
))
audit_syscall_exit
(
AUDITSC_RESULT
(
regs
->
ax
),
regs
->
ax
);
if
(
unlikely
(
test_thread_flag
(
TIF_SYSCALL_FTRACE
)))
ftrace_syscall_exit
(
regs
);
if
(
test_thread_flag
(
TIF_SYSCALL_TRACE
))
tracehook_report_syscall_exit
(
regs
,
0
);
...
...
include/linux/ftrace.h
View file @
62a394eb
...
...
@@ -503,4 +503,25 @@ static inline void trace_hw_branch_oops(void) {}
#endif
/* CONFIG_HW_BRANCH_TRACER */
/*
* A syscall entry in the ftrace syscalls array.
*
* @syscall_nr: syscall number
*/
struct
syscall_trace_entry
{
int
syscall_nr
;
};
#ifdef CONFIG_FTRACE_SYSCALLS
extern
void
start_ftrace_syscalls
(
void
);
extern
void
stop_ftrace_syscalls
(
void
);
extern
void
ftrace_syscall_enter
(
struct
pt_regs
*
regs
);
extern
void
ftrace_syscall_exit
(
struct
pt_regs
*
regs
);
#else
static
inline
void
start_ftrace_syscalls
(
void
)
{
}
static
inline
void
stop_ftrace_syscalls
(
void
)
{
}
static
inline
void
ftrace_syscall_enter
(
struct
pt_regs
*
regs
)
{
}
static
inline
void
ftrace_syscall_exit
(
struct
pt_regs
*
regs
)
{
}
#endif
#endif
/* _LINUX_FTRACE_H */
kernel/trace/Kconfig
View file @
62a394eb
...
...
@@ -34,6 +34,9 @@ config HAVE_FTRACE_MCOUNT_RECORD
config HAVE_HW_BRANCH_TRACER
bool
config HAVE_FTRACE_SYSCALLS
bool
config TRACER_MAX_TRACE
bool
...
...
@@ -175,6 +178,13 @@ config EVENT_TRACER
allowing the user to pick and choose which trace point they
want to trace.
config FTRACE_SYSCALLS
bool "Trace syscalls"
depends on HAVE_FTRACE_SYSCALLS
select TRACING
help
Basic tracer to catch the syscall entry and exit events.
config BOOT_TRACER
bool "Trace boot initcalls"
select TRACING
...
...
kernel/trace/Makefile
View file @
62a394eb
...
...
@@ -43,5 +43,6 @@ obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o
obj-$(CONFIG_EVENT_TRACER)
+=
trace_events.o
obj-$(CONFIG_EVENT_TRACER)
+=
events.o
obj-$(CONFIG_EVENT_TRACER)
+=
trace_export.o
obj-$(CONFIG_FTRACE_SYSCALLS)
+=
trace_syscalls.o
libftrace-y
:=
ftrace.o
kernel/trace/trace.h
View file @
62a394eb
...
...
@@ -31,6 +31,8 @@ enum trace_type {
TRACE_GRAPH_ENT
,
TRACE_USER_STACK
,
TRACE_HW_BRANCHES
,
TRACE_SYSCALL_ENTER
,
TRACE_SYSCALL_EXIT
,
TRACE_KMEM_ALLOC
,
TRACE_KMEM_FREE
,
TRACE_POWER
,
...
...
kernel/trace/trace_syscalls.c
0 → 100644
View file @
62a394eb
#include <linux/ftrace.h>
#include <linux/kernel.h>
#include <asm/syscall.h>
#include "trace_output.h"
#include "trace.h"
static
atomic_t
refcount
;
void
start_ftrace_syscalls
(
void
)
{
unsigned
long
flags
;
struct
task_struct
*
g
,
*
t
;
if
(
atomic_inc_return
(
&
refcount
)
!=
1
)
goto
out
;
read_lock_irqsave
(
&
tasklist_lock
,
flags
);
do_each_thread
(
g
,
t
)
{
set_tsk_thread_flag
(
t
,
TIF_SYSCALL_FTRACE
);
}
while_each_thread
(
g
,
t
);
read_unlock_irqrestore
(
&
tasklist_lock
,
flags
);
out:
atomic_dec
(
&
refcount
);
}
void
stop_ftrace_syscalls
(
void
)
{
unsigned
long
flags
;
struct
task_struct
*
g
,
*
t
;
if
(
atomic_dec_return
(
&
refcount
))
goto
out
;
read_lock_irqsave
(
&
tasklist_lock
,
flags
);
do_each_thread
(
g
,
t
)
{
clear_tsk_thread_flag
(
t
,
TIF_SYSCALL_FTRACE
);
}
while_each_thread
(
g
,
t
);
read_unlock_irqrestore
(
&
tasklist_lock
,
flags
);
out:
atomic_inc
(
&
refcount
);
}
void
ftrace_syscall_enter
(
struct
pt_regs
*
regs
)
{
int
syscall_nr
;
syscall_nr
=
syscall_get_nr
(
current
,
regs
);
trace_printk
(
"syscall %d enter
\n
"
,
syscall_nr
);
}
void
ftrace_syscall_exit
(
struct
pt_regs
*
regs
)
{
int
syscall_nr
;
syscall_nr
=
syscall_get_nr
(
current
,
regs
);
trace_printk
(
"syscall %d exit
\n
"
,
syscall_nr
);
}
static
int
init_syscall_tracer
(
struct
trace_array
*
tr
)
{
start_ftrace_syscalls
();
return
0
;
}
static
void
reset_syscall_tracer
(
struct
trace_array
*
tr
)
{
stop_ftrace_syscalls
();
}
static
struct
trace_event
syscall_enter_event
=
{
.
type
=
TRACE_SYSCALL_ENTER
,
};
static
struct
trace_event
syscall_exit_event
=
{
.
type
=
TRACE_SYSCALL_EXIT
,
};
static
struct
tracer
syscall_tracer
__read_mostly
=
{
.
name
=
"syscall"
,
.
init
=
init_syscall_tracer
,
.
reset
=
reset_syscall_tracer
};
__init
int
register_ftrace_syscalls
(
void
)
{
int
ret
;
ret
=
register_ftrace_event
(
&
syscall_enter_event
);
if
(
!
ret
)
{
printk
(
KERN_WARNING
"event %d failed to register
\n
"
,
syscall_enter_event
.
type
);
WARN_ON_ONCE
(
1
);
}
ret
=
register_ftrace_event
(
&
syscall_exit_event
);
if
(
!
ret
)
{
printk
(
KERN_WARNING
"event %d failed to register
\n
"
,
syscall_exit_event
.
type
);
WARN_ON_ONCE
(
1
);
}
return
register_tracer
(
&
syscall_tracer
);
}
device_initcall
(
register_ftrace_syscalls
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment