Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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