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
79c81d22
Commit
79c81d22
authored
Nov 06, 2008
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'tracing/fastboot' into tracing/ftrace
parents
3299b4dd
79a9d461
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
66 additions
and
38 deletions
+66
-38
include/linux/ftrace.h
include/linux/ftrace.h
+22
-2
init/main.c
init/main.c
+3
-1
kernel/trace/trace.c
kernel/trace/trace.c
+2
-0
kernel/trace/trace.h
kernel/trace/trace.h
+1
-0
kernel/trace/trace_boot.c
kernel/trace/trace_boot.c
+23
-13
kernel/trace/trace_sched_switch.c
kernel/trace/trace_sched_switch.c
+15
-22
No files found.
include/linux/ftrace.h
View file @
79c81d22
...
@@ -234,6 +234,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { }
...
@@ -234,6 +234,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { }
#endif
#endif
/*
* Structure which defines the trace of an initcall.
* You don't have to fill the func field since it is
* only used internally by the tracer.
*/
struct
boot_trace
{
struct
boot_trace
{
pid_t
caller
;
pid_t
caller
;
char
func
[
KSYM_NAME_LEN
];
char
func
[
KSYM_NAME_LEN
];
...
@@ -244,13 +249,28 @@ struct boot_trace {
...
@@ -244,13 +249,28 @@ struct boot_trace {
};
};
#ifdef CONFIG_BOOT_TRACER
#ifdef CONFIG_BOOT_TRACER
/* Append the trace on the ring-buffer */
extern
void
trace_boot
(
struct
boot_trace
*
it
,
initcall_t
fn
);
extern
void
trace_boot
(
struct
boot_trace
*
it
,
initcall_t
fn
);
/* Tells the tracer that smp_pre_initcall is finished.
* So we can start the tracing
*/
extern
void
start_boot_trace
(
void
);
extern
void
start_boot_trace
(
void
);
extern
void
stop_boot_trace
(
void
);
/* Resume the tracing of other necessary events
* such as sched switches
*/
extern
void
enable_boot_trace
(
void
);
/* Suspend this tracing. Actually, only sched_switches tracing have
* to be suspended. Initcalls doesn't need it.)
*/
extern
void
disable_boot_trace
(
void
);
#else
#else
static
inline
void
trace_boot
(
struct
boot_trace
*
it
,
initcall_t
fn
)
{
}
static
inline
void
trace_boot
(
struct
boot_trace
*
it
,
initcall_t
fn
)
{
}
static
inline
void
start_boot_trace
(
void
)
{
}
static
inline
void
start_boot_trace
(
void
)
{
}
static
inline
void
stop_boot_trace
(
void
)
{
}
static
inline
void
enable_boot_trace
(
void
)
{
}
static
inline
void
disable_boot_trace
(
void
)
{
}
#endif
#endif
...
...
init/main.c
View file @
79c81d22
...
@@ -711,6 +711,7 @@ int do_one_initcall(initcall_t fn)
...
@@ -711,6 +711,7 @@ int do_one_initcall(initcall_t fn)
it
.
caller
=
task_pid_nr
(
current
);
it
.
caller
=
task_pid_nr
(
current
);
printk
(
"calling %pF @ %i
\n
"
,
fn
,
it
.
caller
);
printk
(
"calling %pF @ %i
\n
"
,
fn
,
it
.
caller
);
it
.
calltime
=
ktime_get
();
it
.
calltime
=
ktime_get
();
enable_boot_trace
();
}
}
it
.
result
=
fn
();
it
.
result
=
fn
();
...
@@ -722,6 +723,7 @@ int do_one_initcall(initcall_t fn)
...
@@ -722,6 +723,7 @@ int do_one_initcall(initcall_t fn)
printk
(
"initcall %pF returned %d after %Ld usecs
\n
"
,
fn
,
printk
(
"initcall %pF returned %d after %Ld usecs
\n
"
,
fn
,
it
.
result
,
it
.
duration
);
it
.
result
,
it
.
duration
);
trace_boot
(
&
it
,
fn
);
trace_boot
(
&
it
,
fn
);
disable_boot_trace
();
}
}
msgbuf
[
0
]
=
0
;
msgbuf
[
0
]
=
0
;
...
@@ -882,7 +884,7 @@ static int __init kernel_init(void * unused)
...
@@ -882,7 +884,7 @@ static int __init kernel_init(void * unused)
* we're essentially up and running. Get rid of the
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
* initmem segments and start the user-mode stuff..
*/
*/
stop_boot_trace
();
init_post
();
init_post
();
return
0
;
return
0
;
}
}
kernel/trace/trace.c
View file @
79c81d22
...
@@ -3285,6 +3285,8 @@ __init static int tracer_alloc_buffers(void)
...
@@ -3285,6 +3285,8 @@ __init static int tracer_alloc_buffers(void)
register_tracer
(
&
nop_trace
);
register_tracer
(
&
nop_trace
);
#ifdef CONFIG_BOOT_TRACER
#ifdef CONFIG_BOOT_TRACER
/* We don't want to launch sched_switch tracer yet */
global_trace
.
ctrl
=
0
;
register_tracer
(
&
boot_tracer
);
register_tracer
(
&
boot_tracer
);
current_trace
=
&
boot_tracer
;
current_trace
=
&
boot_tracer
;
current_trace
->
init
(
&
global_trace
);
current_trace
->
init
(
&
global_trace
);
...
...
kernel/trace/trace.h
View file @
79c81d22
...
@@ -49,6 +49,7 @@ struct ftrace_entry {
...
@@ -49,6 +49,7 @@ struct ftrace_entry {
unsigned
long
parent_ip
;
unsigned
long
parent_ip
;
};
};
extern
struct
tracer
boot_tracer
;
extern
struct
tracer
boot_tracer
;
extern
struct
tracer
sched_switch_trace
;
/* Used by the boot tracer */
/*
/*
* Context switch trace entry - which task (and prio) we switched from/to:
* Context switch trace entry - which task (and prio) we switched from/to:
...
...
kernel/trace/trace_boot.c
View file @
79c81d22
...
@@ -13,23 +13,33 @@
...
@@ -13,23 +13,33 @@
#include "trace.h"
#include "trace.h"
static
struct
trace_array
*
boot_trace
;
static
struct
trace_array
*
boot_trace
;
static
int
trace_boot_enabl
ed
;
static
bool
pre_initcalls_finish
ed
;
/* Tells the boot tracer that the pre_smp_initcalls are finished.
/* Should be started after do_pre_smp_initcalls() in init/main.c */
* So we are ready .
* It doesn't enable sched events tracing however.
* You have to call enable_boot_trace to do so.
*/
void
start_boot_trace
(
void
)
void
start_boot_trace
(
void
)
{
{
trace_boot_enabled
=
1
;
pre_initcalls_finished
=
true
;
}
}
void
stop
_boot_trace
(
void
)
void
enable
_boot_trace
(
void
)
{
{
trace_boot_enabled
=
0
;
if
(
pre_initcalls_finished
)
tracing_start_cmdline_record
();
}
}
void
reset_boot_trace
(
struct
trace_array
*
tr
)
void
disable_boot_trace
(
void
)
{
{
stop_boot_trace
();
if
(
pre_initcalls_finished
)
tracing_stop_cmdline_record
();
}
static
void
reset_boot_trace
(
struct
trace_array
*
tr
)
{
sched_switch_trace
.
reset
(
tr
);
}
}
static
void
boot_trace_init
(
struct
trace_array
*
tr
)
static
void
boot_trace_init
(
struct
trace_array
*
tr
)
...
@@ -37,18 +47,18 @@ static void boot_trace_init(struct trace_array *tr)
...
@@ -37,18 +47,18 @@ static void boot_trace_init(struct trace_array *tr)
int
cpu
;
int
cpu
;
boot_trace
=
tr
;
boot_trace
=
tr
;
trace_boot_enabled
=
0
;
for_each_cpu_mask
(
cpu
,
cpu_possible_map
)
for_each_cpu_mask
(
cpu
,
cpu_possible_map
)
tracing_reset
(
tr
,
cpu
);
tracing_reset
(
tr
,
cpu
);
sched_switch_trace
.
init
(
tr
);
}
}
static
void
boot_trace_ctrl_update
(
struct
trace_array
*
tr
)
static
void
boot_trace_ctrl_update
(
struct
trace_array
*
tr
)
{
{
if
(
tr
->
ctrl
)
if
(
tr
->
ctrl
)
start
_boot_trace
();
enable
_boot_trace
();
else
else
stop
_boot_trace
();
disable
_boot_trace
();
}
}
static
enum
print_line_t
initcall_print_line
(
struct
trace_iterator
*
iter
)
static
enum
print_line_t
initcall_print_line
(
struct
trace_iterator
*
iter
)
...
@@ -99,7 +109,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
...
@@ -99,7 +109,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
unsigned
long
irq_flags
;
unsigned
long
irq_flags
;
struct
trace_array
*
tr
=
boot_trace
;
struct
trace_array
*
tr
=
boot_trace
;
if
(
!
trace_boot_enabl
ed
)
if
(
!
pre_initcalls_finish
ed
)
return
;
return
;
/* Get its name now since this function could
/* Get its name now since this function could
...
...
kernel/trace/trace_sched_switch.c
View file @
79c81d22
...
@@ -16,7 +16,8 @@
...
@@ -16,7 +16,8 @@
static
struct
trace_array
*
ctx_trace
;
static
struct
trace_array
*
ctx_trace
;
static
int
__read_mostly
tracer_enabled
;
static
int
__read_mostly
tracer_enabled
;
static
atomic_t
sched_ref
;
static
int
sched_ref
;
static
DEFINE_MUTEX
(
sched_register_mutex
);
static
void
static
void
probe_sched_switch
(
struct
rq
*
__rq
,
struct
task_struct
*
prev
,
probe_sched_switch
(
struct
rq
*
__rq
,
struct
task_struct
*
prev
,
...
@@ -27,7 +28,7 @@ probe_sched_switch(struct rq *__rq, struct task_struct *prev,
...
@@ -27,7 +28,7 @@ probe_sched_switch(struct rq *__rq, struct task_struct *prev,
int
cpu
;
int
cpu
;
int
pc
;
int
pc
;
if
(
!
atomic_read
(
&
sched_ref
)
)
if
(
!
sched_ref
)
return
;
return
;
tracing_record_cmdline
(
prev
);
tracing_record_cmdline
(
prev
);
...
@@ -123,20 +124,22 @@ static void tracing_sched_unregister(void)
...
@@ -123,20 +124,22 @@ static void tracing_sched_unregister(void)
static
void
tracing_start_sched_switch
(
void
)
static
void
tracing_start_sched_switch
(
void
)
{
{
long
ref
;
mutex_lock
(
&
sched_register_mutex
);
if
(
!
(
sched_ref
++
))
{
ref
=
atomic_inc_return
(
&
sched_ref
);
tracer_enabled
=
1
;
if
(
ref
==
1
)
tracing_sched_register
();
tracing_sched_register
();
}
mutex_unlock
(
&
sched_register_mutex
);
}
}
static
void
tracing_stop_sched_switch
(
void
)
static
void
tracing_stop_sched_switch
(
void
)
{
{
long
ref
;
mutex_lock
(
&
sched_register_mutex
);
if
(
!
(
--
sched_ref
))
{
ref
=
atomic_dec_and_test
(
&
sched_ref
);
if
(
ref
)
tracing_sched_unregister
();
tracing_sched_unregister
();
tracer_enabled
=
0
;
}
mutex_unlock
(
&
sched_register_mutex
);
}
}
void
tracing_start_cmdline_record
(
void
)
void
tracing_start_cmdline_record
(
void
)
...
@@ -153,12 +156,10 @@ static void start_sched_trace(struct trace_array *tr)
...
@@ -153,12 +156,10 @@ static void start_sched_trace(struct trace_array *tr)
{
{
sched_switch_reset
(
tr
);
sched_switch_reset
(
tr
);
tracing_start_cmdline_record
();
tracing_start_cmdline_record
();
tracer_enabled
=
1
;
}
}
static
void
stop_sched_trace
(
struct
trace_array
*
tr
)
static
void
stop_sched_trace
(
struct
trace_array
*
tr
)
{
{
tracer_enabled
=
0
;
tracing_stop_cmdline_record
();
tracing_stop_cmdline_record
();
}
}
...
@@ -172,7 +173,7 @@ static void sched_switch_trace_init(struct trace_array *tr)
...
@@ -172,7 +173,7 @@ static void sched_switch_trace_init(struct trace_array *tr)
static
void
sched_switch_trace_reset
(
struct
trace_array
*
tr
)
static
void
sched_switch_trace_reset
(
struct
trace_array
*
tr
)
{
{
if
(
tr
->
ctrl
)
if
(
tr
->
ctrl
&&
sched_ref
)
stop_sched_trace
(
tr
);
stop_sched_trace
(
tr
);
}
}
...
@@ -185,7 +186,7 @@ static void sched_switch_trace_ctrl_update(struct trace_array *tr)
...
@@ -185,7 +186,7 @@ static void sched_switch_trace_ctrl_update(struct trace_array *tr)
stop_sched_trace
(
tr
);
stop_sched_trace
(
tr
);
}
}
st
atic
st
ruct
tracer
sched_switch_trace
__read_mostly
=
struct
tracer
sched_switch_trace
__read_mostly
=
{
{
.
name
=
"sched_switch"
,
.
name
=
"sched_switch"
,
.
init
=
sched_switch_trace_init
,
.
init
=
sched_switch_trace_init
,
...
@@ -198,14 +199,6 @@ static struct tracer sched_switch_trace __read_mostly =
...
@@ -198,14 +199,6 @@ static struct tracer sched_switch_trace __read_mostly =
__init
static
int
init_sched_switch_trace
(
void
)
__init
static
int
init_sched_switch_trace
(
void
)
{
{
int
ret
=
0
;
if
(
atomic_read
(
&
sched_ref
))
ret
=
tracing_sched_register
();
if
(
ret
)
{
pr_info
(
"error registering scheduler trace
\n
"
);
return
ret
;
}
return
register_tracer
(
&
sched_switch_trace
);
return
register_tracer
(
&
sched_switch_trace
);
}
}
device_initcall
(
init_sched_switch_trace
);
device_initcall
(
init_sched_switch_trace
);
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