Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 116664
b: refs/heads/master
c: 7104f30
h: refs/heads/master
v: v3
  • Loading branch information
Steven Rostedt authored and Ingo Molnar committed Oct 14, 2008
1 parent d316e4f commit 703669e
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 797d3712a9dd75c720558612be05f42c031a7bb5
refs/heads/master: 7104f300c5a69b46dda00d898034dd05c9f21739
85 changes: 60 additions & 25 deletions trunk/kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1350,7 +1350,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
}
switch (entry->type) {
case TRACE_FN: {
struct ftrace_entry *field = (struct ftrace_entry *)entry;
struct ftrace_entry *field;

trace_assign_type(field, entry);

seq_print_ip_sym(s, field->ip, sym_flags);
trace_seq_puts(s, " (");
Expand All @@ -1363,8 +1365,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
}
case TRACE_CTX:
case TRACE_WAKE: {
struct ctx_switch_entry *field =
(struct ctx_switch_entry *)entry;
struct ctx_switch_entry *field;

trace_assign_type(field, entry);

T = field->next_state < sizeof(state_to_char) ?
state_to_char[field->next_state] : 'X';
Expand All @@ -1384,7 +1387,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
break;
}
case TRACE_SPECIAL: {
struct special_entry *field = (struct special_entry *)entry;
struct special_entry *field;

trace_assign_type(field, entry);

trace_seq_printf(s, "# %ld %ld %ld\n",
field->arg1,
Expand All @@ -1393,7 +1398,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
break;
}
case TRACE_STACK: {
struct stack_entry *field = (struct stack_entry *)entry;
struct stack_entry *field;

trace_assign_type(field, entry);

for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
if (i)
Expand All @@ -1404,7 +1411,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
break;
}
case TRACE_PRINT: {
struct print_entry *field = (struct print_entry *)entry;
struct print_entry *field;

trace_assign_type(field, entry);

seq_print_ip_sym(s, field->ip, sym_flags);
trace_seq_printf(s, ": %s", field->buf);
Expand Down Expand Up @@ -1454,7 +1463,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)

switch (entry->type) {
case TRACE_FN: {
struct ftrace_entry *field = (struct ftrace_entry *)entry;
struct ftrace_entry *field;

trace_assign_type(field, entry);

ret = seq_print_ip_sym(s, field->ip, sym_flags);
if (!ret)
Expand All @@ -1480,8 +1491,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
}
case TRACE_CTX:
case TRACE_WAKE: {
struct ctx_switch_entry *field =
(struct ctx_switch_entry *)entry;
struct ctx_switch_entry *field;

trace_assign_type(field, entry);

S = field->prev_state < sizeof(state_to_char) ?
state_to_char[field->prev_state] : 'X';
Expand All @@ -1501,7 +1513,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
break;
}
case TRACE_SPECIAL: {
struct special_entry *field = (struct special_entry *)entry;
struct special_entry *field;

trace_assign_type(field, entry);

ret = trace_seq_printf(s, "# %ld %ld %ld\n",
field->arg1,
Expand All @@ -1512,7 +1526,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
break;
}
case TRACE_STACK: {
struct stack_entry *field = (struct stack_entry *)entry;
struct stack_entry *field;

trace_assign_type(field, entry);

for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
if (i) {
Expand All @@ -1531,7 +1547,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
break;
}
case TRACE_PRINT: {
struct print_entry *field = (struct print_entry *)entry;
struct print_entry *field;

trace_assign_type(field, entry);

seq_print_ip_sym(s, field->ip, sym_flags);
trace_seq_printf(s, ": %s", field->buf);
Expand Down Expand Up @@ -1562,7 +1580,9 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)

switch (entry->type) {
case TRACE_FN: {
struct ftrace_entry *field = (struct ftrace_entry *)entry;
struct ftrace_entry *field;

trace_assign_type(field, entry);

ret = trace_seq_printf(s, "%x %x\n",
field->ip,
Expand All @@ -1573,8 +1593,9 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)
}
case TRACE_CTX:
case TRACE_WAKE: {
struct ctx_switch_entry *field =
(struct ctx_switch_entry *)entry;
struct ctx_switch_entry *field;

trace_assign_type(field, entry);

S = field->prev_state < sizeof(state_to_char) ?
state_to_char[field->prev_state] : 'X';
Expand All @@ -1596,7 +1617,9 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)
}
case TRACE_SPECIAL:
case TRACE_STACK: {
struct special_entry *field = (struct special_entry *)entry;
struct special_entry *field;

trace_assign_type(field, entry);

ret = trace_seq_printf(s, "# %ld %ld %ld\n",
field->arg1,
Expand All @@ -1607,7 +1630,9 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)
break;
}
case TRACE_PRINT: {
struct print_entry *field = (struct print_entry *)entry;
struct print_entry *field;

trace_assign_type(field, entry);

trace_seq_printf(s, "# %lx %s", field->ip, field->buf);
if (entry->flags & TRACE_FLAG_CONT)
Expand Down Expand Up @@ -1648,16 +1673,19 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)

switch (entry->type) {
case TRACE_FN: {
struct ftrace_entry *field = (struct ftrace_entry *)entry;
struct ftrace_entry *field;

trace_assign_type(field, entry);

SEQ_PUT_HEX_FIELD_RET(s, field->ip);
SEQ_PUT_HEX_FIELD_RET(s, field->parent_ip);
break;
}
case TRACE_CTX:
case TRACE_WAKE: {
struct ctx_switch_entry *field =
(struct ctx_switch_entry *)entry;
struct ctx_switch_entry *field;

trace_assign_type(field, entry);

S = field->prev_state < sizeof(state_to_char) ?
state_to_char[field->prev_state] : 'X';
Expand All @@ -1676,7 +1704,9 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)
}
case TRACE_SPECIAL:
case TRACE_STACK: {
struct special_entry *field = (struct special_entry *)entry;
struct special_entry *field;

trace_assign_type(field, entry);

SEQ_PUT_HEX_FIELD_RET(s, field->arg1);
SEQ_PUT_HEX_FIELD_RET(s, field->arg2);
Expand Down Expand Up @@ -1705,15 +1735,18 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter)

switch (entry->type) {
case TRACE_FN: {
struct ftrace_entry *field = (struct ftrace_entry *)entry;
struct ftrace_entry *field;

trace_assign_type(field, entry);

SEQ_PUT_FIELD_RET(s, field->ip);
SEQ_PUT_FIELD_RET(s, field->parent_ip);
break;
}
case TRACE_CTX: {
struct ctx_switch_entry *field =
(struct ctx_switch_entry *)entry;
struct ctx_switch_entry *field;

trace_assign_type(field, entry);

SEQ_PUT_FIELD_RET(s, field->prev_pid);
SEQ_PUT_FIELD_RET(s, field->prev_prio);
Expand All @@ -1725,7 +1758,9 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter)
}
case TRACE_SPECIAL:
case TRACE_STACK: {
struct special_entry *field = (struct special_entry *)entry;
struct special_entry *field;

trace_assign_type(field, entry);

SEQ_PUT_FIELD_RET(s, field->arg1);
SEQ_PUT_FIELD_RET(s, field->arg2);
Expand Down
42 changes: 42 additions & 0 deletions trunk/kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,48 @@ struct trace_array {
struct trace_array_cpu *data[NR_CPUS];
};

#define FTRACE_CMP_TYPE(var, type) \
__builtin_types_compatible_p(typeof(var), type *)

#undef IF_ASSIGN
#define IF_ASSIGN(var, entry, etype, id) \
if (FTRACE_CMP_TYPE(var, etype)) { \
var = (typeof(var))(entry); \
WARN_ON(id && (entry)->type != id); \
break; \
}

/* Will cause compile errors if type is not found. */
extern void __ftrace_bad_type(void);

/*
* The trace_assign_type is a verifier that the entry type is
* the same as the type being assigned. To add new types simply
* add a line with the following format:
*
* IF_ASSIGN(var, ent, type, id);
*
* Where "type" is the trace type that includes the trace_entry
* as the "ent" item. And "id" is the trace identifier that is
* used in the trace_type enum.
*
* If the type can have more than one id, then use zero.
*/
#define trace_assign_type(var, ent) \
do { \
IF_ASSIGN(var, ent, struct ftrace_entry, TRACE_FN); \
IF_ASSIGN(var, ent, struct ctx_switch_entry, 0); \
IF_ASSIGN(var, ent, struct trace_field_cont, TRACE_CONT); \
IF_ASSIGN(var, ent, struct stack_entry, TRACE_STACK); \
IF_ASSIGN(var, ent, struct print_entry, TRACE_PRINT); \
IF_ASSIGN(var, ent, struct special_entry, 0); \
IF_ASSIGN(var, ent, struct trace_mmiotrace_rw, \
TRACE_MMIO_RW); \
IF_ASSIGN(var, ent, struct trace_mmiotrace_map, \
TRACE_MMIO_MAP); \
IF_ASSIGN(var, ent, struct trace_boot, TRACE_BOOT); \
__ftrace_bad_type(); \
} while (0)

/* Return values for print_line callback */
enum print_line_t {
Expand Down
14 changes: 10 additions & 4 deletions trunk/kernel/trace/trace_mmiotrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,17 @@ static ssize_t mmio_read(struct trace_iterator *iter, struct file *filp,
static enum print_line_t mmio_print_rw(struct trace_iterator *iter)
{
struct trace_entry *entry = iter->ent;
struct trace_mmiotrace_rw *field =
(struct trace_mmiotrace_rw *)entry;
struct mmiotrace_rw *rw = &field->rw;
struct trace_mmiotrace_rw *field;
struct mmiotrace_rw *rw;
struct trace_seq *s = &iter->seq;
unsigned long long t = ns2usecs(iter->ts);
unsigned long usec_rem = do_div(t, 1000000ULL);
unsigned secs = (unsigned long)t;
int ret = 1;

trace_assign_type(field, entry);
rw = &field->rw;

switch (rw->opcode) {
case MMIO_READ:
ret = trace_seq_printf(s,
Expand Down Expand Up @@ -222,13 +224,17 @@ static enum print_line_t mmio_print_rw(struct trace_iterator *iter)
static enum print_line_t mmio_print_map(struct trace_iterator *iter)
{
struct trace_entry *entry = iter->ent;
struct mmiotrace_map *m = (struct mmiotrace_map *)entry;
struct trace_mmiotrace_map *field;
struct mmiotrace_map *m;
struct trace_seq *s = &iter->seq;
unsigned long long t = ns2usecs(iter->ts);
unsigned long usec_rem = do_div(t, 1000000ULL);
unsigned secs = (unsigned long)t;
int ret;

trace_assign_type(field, entry);
m = &field->map;

switch (m->opcode) {
case MMIO_PROBE:
ret = trace_seq_printf(s,
Expand Down

0 comments on commit 703669e

Please sign in to comment.