Skip to content

Commit

Permalink
Merge branch 'tip/tracing/ftrace' of git://git.kernel.org/pub/scm/lin…
Browse files Browse the repository at this point in the history
…ux/kernel/git/rostedt/linux-2.6-trace into tracing/ftrace
  • Loading branch information
Ingo Molnar committed Feb 28, 2009
2 parents e9abf4c + f2034f1 commit acdb2c2
Show file tree
Hide file tree
Showing 13 changed files with 776 additions and 123 deletions.
3 changes: 3 additions & 0 deletions include/linux/tracepoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,7 @@ static inline void tracepoint_synchronize_unregister(void)
#define TRACE_FORMAT(name, proto, args, fmt) \
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))

#define TRACE_EVENT_FORMAT(name, proto, args, fmt, struct, tpfmt) \
TRACE_FORMAT(name, PARAMS(proto), PARAMS(args), PARAMS(fmt))

#endif
24 changes: 20 additions & 4 deletions include/trace/irq_event_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,29 @@
# error Unless you know what you are doing.
#endif

TRACE_FORMAT(irq_handler_entry,
#undef TRACE_SYSTEM
#define TRACE_SYSTEM irq

TRACE_EVENT_FORMAT(irq_handler_entry,
TPPROTO(int irq, struct irqaction *action),
TPARGS(irq, action),
TPFMT("irq=%d handler=%s", irq, action->name));
TPFMT("irq=%d handler=%s", irq, action->name),
TRACE_STRUCT(
TRACE_FIELD(int, irq, irq)
),
TPRAWFMT("irq %d")
);

TRACE_FORMAT(irq_handler_exit,
TRACE_EVENT_FORMAT(irq_handler_exit,
TPPROTO(int irq, struct irqaction *action, int ret),
TPARGS(irq, action, ret),
TPFMT("irq=%d handler=%s return=%s",
irq, action->name, ret ? "handled" : "unhandled"));
irq, action->name, ret ? "handled" : "unhandled"),
TRACE_STRUCT(
TRACE_FIELD(int, irq, irq)
TRACE_FIELD(int, ret, ret)
),
TPRAWFMT("irq %d ret %d")
);

#undef TRACE_SYSTEM
124 changes: 99 additions & 25 deletions include/trace/sched_event_types.h
Original file line number Diff line number Diff line change
@@ -1,72 +1,146 @@

/* use <trace/sched.h> instead */
#ifndef TRACE_FORMAT
#ifndef TRACE_EVENT_FORMAT
# error Do not include this file directly.
# error Unless you know what you are doing.
#endif

TRACE_FORMAT(sched_kthread_stop,
#undef TRACE_SYSTEM
#define TRACE_SYSTEM sched

TRACE_EVENT_FORMAT(sched_kthread_stop,
TPPROTO(struct task_struct *t),
TPARGS(t),
TPFMT("task %s:%d", t->comm, t->pid));
TPFMT("task %s:%d", t->comm, t->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, t->pid)
),
TPRAWFMT("task %d")
);

TRACE_FORMAT(sched_kthread_stop_ret,
TRACE_EVENT_FORMAT(sched_kthread_stop_ret,
TPPROTO(int ret),
TPARGS(ret),
TPFMT("ret=%d", ret));
TPFMT("ret=%d", ret),
TRACE_STRUCT(
TRACE_FIELD(int, ret, ret)
),
TPRAWFMT("ret=%d")
);

TRACE_FORMAT(sched_wait_task,
TRACE_EVENT_FORMAT(sched_wait_task,
TPPROTO(struct rq *rq, struct task_struct *p),
TPARGS(rq, p),
TPFMT("task %s:%d", p->comm, p->pid));
TPFMT("task %s:%d", p->comm, p->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
),
TPRAWFMT("task %d")
);

TRACE_FORMAT(sched_wakeup,
TRACE_EVENT_FORMAT(sched_wakeup,
TPPROTO(struct rq *rq, struct task_struct *p, int success),
TPARGS(rq, p, success),
TPFMT("task %s:%d %s",
p->comm, p->pid, success?"succeeded":"failed"));
p->comm, p->pid, success ? "succeeded" : "failed"),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
TRACE_FIELD(int, success, success)
),
TPRAWFMT("task %d success=%d")
);

TRACE_FORMAT(sched_wakeup_new,
TRACE_EVENT_FORMAT(sched_wakeup_new,
TPPROTO(struct rq *rq, struct task_struct *p, int success),
TPARGS(rq, p, success),
TPFMT("task %s:%d",
p->comm, p->pid, success?"succeeded":"failed"));
p->comm, p->pid, success ? "succeeded" : "failed"),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
TRACE_FIELD(int, success, success)
),
TPRAWFMT("task %d success=%d")
);

TRACE_FORMAT(sched_switch,
TRACE_EVENT_FORMAT(sched_switch,
TPPROTO(struct rq *rq, struct task_struct *prev,
struct task_struct *next),
TPARGS(rq, prev, next),
TPFMT("task %s:%d ==> %s:%d",
prev->comm, prev->pid, next->comm, next->pid));
prev->comm, prev->pid, next->comm, next->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, prev_pid, prev->pid)
TRACE_FIELD(int, prev_prio, prev->prio)
TRACE_FIELD(pid_t, next_pid, next->pid)
TRACE_FIELD(int, next_prio, next->prio)
),
TPRAWFMT("prev %d:%d ==> next %d:%d")
);

TRACE_FORMAT(sched_migrate_task,
TRACE_EVENT_FORMAT(sched_migrate_task,
TPPROTO(struct task_struct *p, int orig_cpu, int dest_cpu),
TPARGS(p, orig_cpu, dest_cpu),
TPFMT("task %s:%d from: %d to: %d",
p->comm, p->pid, orig_cpu, dest_cpu));
p->comm, p->pid, orig_cpu, dest_cpu),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
TRACE_FIELD(int, orig_cpu, orig_cpu)
TRACE_FIELD(int, dest_cpu, dest_cpu)
),
TPRAWFMT("task %d from: %d to: %d")
);

TRACE_FORMAT(sched_process_free,
TRACE_EVENT_FORMAT(sched_process_free,
TPPROTO(struct task_struct *p),
TPARGS(p),
TPFMT("task %s:%d", p->comm, p->pid));
TPFMT("task %s:%d", p->comm, p->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
),
TPRAWFMT("task %d")
);

TRACE_FORMAT(sched_process_exit,
TRACE_EVENT_FORMAT(sched_process_exit,
TPPROTO(struct task_struct *p),
TPARGS(p),
TPFMT("task %s:%d", p->comm, p->pid));
TPFMT("task %s:%d", p->comm, p->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, p->pid)
),
TPRAWFMT("task %d")
);

TRACE_FORMAT(sched_process_wait,
TRACE_EVENT_FORMAT(sched_process_wait,
TPPROTO(struct pid *pid),
TPARGS(pid),
TPFMT("pid %d", pid));
TPFMT("pid %d", pid_nr(pid)),
TRACE_STRUCT(
TRACE_FIELD(pid_t, pid, pid_nr(pid))
),
TPRAWFMT("task %d")
);

TRACE_FORMAT(sched_process_fork,
TRACE_EVENT_FORMAT(sched_process_fork,
TPPROTO(struct task_struct *parent, struct task_struct *child),
TPARGS(parent, child),
TPFMT("parent %s:%d child %s:%d",
parent->comm, parent->pid, child->comm, child->pid));
parent->comm, parent->pid, child->comm, child->pid),
TRACE_STRUCT(
TRACE_FIELD(pid_t, parent, parent->pid)
TRACE_FIELD(pid_t, child, child->pid)
),
TPRAWFMT("parent %d child %d")
);

TRACE_FORMAT(sched_signal_send,
TRACE_EVENT_FORMAT(sched_signal_send,
TPPROTO(int sig, struct task_struct *p),
TPARGS(sig, p),
TPFMT("sig: %d task %s:%d", sig, p->comm, p->pid));
TPFMT("sig: %d task %s:%d", sig, p->comm, p->pid),
TRACE_STRUCT(
TRACE_FIELD(int, sig, sig)
TRACE_FIELD(pid_t, pid, p->pid)
),
TPRAWFMT("sig: %d task %d")
);

#undef TRACE_SYSTEM
4 changes: 4 additions & 0 deletions include/trace/trace_event_types.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* trace/<type>_event_types.h here */

#include <trace/sched_event_types.h>
#include <trace/irq_event_types.h>
4 changes: 4 additions & 0 deletions include/trace/trace_events.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* trace/<type>.h here */

#include <trace/sched.h>
#include <trace/irq.h>
20 changes: 11 additions & 9 deletions kernel/trace/events.c
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
/*
* This is the place to register all trace points as events.
* Include the trace/<type>.h at the top.
* Include the trace/<type>_event_types.h at the bottom.
*/

/* trace/<type>.h here */
#include <trace/sched.h>
#include <trace/irq.h>
/* someday this needs to go in a generic header */
#define __STR(x) #x
#define STR(x) __STR(x)

#include "trace_events.h"
#include <trace/trace_events.h>

/* trace/<type>_event_types.h here */
#include <trace/sched_event_types.h>
#include <trace/irq_event_types.h>
#include "trace_output.h"

#include "trace_events_stage_1.h"
#include "trace_events_stage_2.h"
#include "trace_events_stage_3.h"

#include <trace/trace_event_types.h>
14 changes: 14 additions & 0 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,20 @@ void trace_buffer_unlock_commit(struct trace_array *tr,
trace_wake_up();
}

struct ring_buffer_event *
trace_current_buffer_lock_reserve(unsigned char type, unsigned long len,
unsigned long flags, int pc)
{
return trace_buffer_lock_reserve(&global_trace,
type, len, flags, pc);
}

void trace_current_buffer_unlock_commit(struct ring_buffer_event *event,
unsigned long flags, int pc)
{
return trace_buffer_unlock_commit(&global_trace, event, flags, pc);
}

void
trace_function(struct trace_array *tr,
unsigned long ip, unsigned long parent_ip, unsigned long flags,
Expand Down
32 changes: 32 additions & 0 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,12 @@ void trace_buffer_unlock_commit(struct trace_array *tr,
struct ring_buffer_event *event,
unsigned long flags, int pc);

struct ring_buffer_event *
trace_current_buffer_lock_reserve(unsigned char type, unsigned long len,
unsigned long flags, int pc);
void trace_current_buffer_unlock_commit(struct ring_buffer_event *event,
unsigned long flags, int pc);

struct trace_entry *tracing_get_trace_entry(struct trace_array *tr,
struct trace_array_cpu *data);

Expand Down Expand Up @@ -720,4 +726,30 @@ static inline void trace_branch_disable(void)
}
#endif /* CONFIG_BRANCH_TRACER */

/* trace event type bit fields, not numeric */
enum {
TRACE_EVENT_TYPE_PRINTF = 1,
TRACE_EVENT_TYPE_RAW = 2,
};

struct ftrace_event_call {
char *name;
char *system;
struct dentry *dir;
int enabled;
int (*regfunc)(void);
void (*unregfunc)(void);
int id;
struct dentry *raw_dir;
int raw_enabled;
int type;
int (*raw_init)(void);
int (*raw_reg)(void);
void (*raw_unreg)(void);
};

void event_trace_printk(unsigned long ip, const char *fmt, ...);
extern struct ftrace_event_call __start_ftrace_events[];
extern struct ftrace_event_call __stop_ftrace_events[];

#endif /* _LINUX_KERNEL_TRACE_H */
Loading

0 comments on commit acdb2c2

Please sign in to comment.