Skip to content

Commit

Permalink
trace: judicious error checking of trace_seq results
Browse files Browse the repository at this point in the history
Impact: bugfix and cleanup

Some callsites were returning either TRACE_ITER_PARTIAL_LINE if the
trace_seq routines (trace_seq_printf, etc) returned 0 meaning its buffer
was full, or zero otherwise.

But...

/* Return values for print_line callback */
enum print_line_t {
        TRACE_TYPE_PARTIAL_LINE = 0,    /* Retry after flushing the seq */
        TRACE_TYPE_HANDLED      = 1,
        TRACE_TYPE_UNHANDLED    = 2     /* Relay to other output functions */
};

In other cases the return value was not being relayed at all.

Most of the time it didn't hurt because the page wasn't get filled, but
for correctness sake, handle the return values everywhere.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Arnaldo Carvalho de Melo authored and Ingo Molnar committed Feb 4, 2009
1 parent ce70a0b commit d9793bd
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 115 deletions.
2 changes: 1 addition & 1 deletion block/blktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1165,7 +1165,7 @@ static int blk_trace_event_print(struct trace_iterator *iter, int flags)
const u16 what = t->action & ((1 << BLK_TC_SHIFT) - 1);
int ret;

if (trace_print_context(iter))
if (!trace_print_context(iter))
return TRACE_TYPE_PARTIAL_LINE;

if (unlikely(what == 0 || what > ARRAY_SIZE(what2act)))
Expand Down
75 changes: 34 additions & 41 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1402,27 +1402,25 @@ static enum print_line_t print_lat_fmt(struct trace_iterator *iter)
unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
struct trace_event *event;
struct trace_entry *entry = iter->ent;
int ret;

test_cpu_buff_start(iter);

event = ftrace_find_event(entry->type);

if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
ret = trace_print_lat_context(iter);
if (ret)
return ret;
if (!trace_print_lat_context(iter))
goto partial;
}

if (event && event->latency_trace) {
ret = event->latency_trace(iter, sym_flags);
if (ret)
return ret;
return TRACE_TYPE_HANDLED;
}
if (event && event->latency_trace)
return event->latency_trace(iter, sym_flags);

if (!trace_seq_printf(s, "Unknown type %d\n", entry->type))
goto partial;

trace_seq_printf(s, "Unknown type %d\n", entry->type);
return TRACE_TYPE_HANDLED;
partial:
return TRACE_TYPE_PARTIAL_LINE;
}

static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
Expand All @@ -1431,7 +1429,6 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
struct trace_entry *entry;
struct trace_event *event;
int ret;

entry = iter->ent;

Expand All @@ -1440,52 +1437,45 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
event = ftrace_find_event(entry->type);

if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
ret = trace_print_context(iter);
if (ret)
return ret;
if (!trace_print_context(iter))
goto partial;
}

if (event && event->trace) {
ret = event->trace(iter, sym_flags);
if (ret)
return ret;
return TRACE_TYPE_HANDLED;
}
ret = trace_seq_printf(s, "Unknown type %d\n", entry->type);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;
if (event && event->trace)
return event->trace(iter, sym_flags);

if (!trace_seq_printf(s, "Unknown type %d\n", entry->type))
goto partial;

return TRACE_TYPE_HANDLED;
partial:
return TRACE_TYPE_PARTIAL_LINE;
}

static enum print_line_t print_raw_fmt(struct trace_iterator *iter)
{
struct trace_seq *s = &iter->seq;
struct trace_entry *entry;
struct trace_event *event;
int ret;

entry = iter->ent;

if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
ret = trace_seq_printf(s, "%d %d %llu ",
entry->pid, iter->cpu, iter->ts);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;
if (!trace_seq_printf(s, "%d %d %llu ",
entry->pid, iter->cpu, iter->ts))
goto partial;
}

event = ftrace_find_event(entry->type);
if (event && event->raw) {
ret = event->raw(iter, 0);
if (ret)
return ret;
return TRACE_TYPE_HANDLED;
}
ret = trace_seq_printf(s, "%d ?\n", entry->type);
if (!ret)
return TRACE_TYPE_PARTIAL_LINE;
if (event && event->raw)
return event->raw(iter, 0);

if (!trace_seq_printf(s, "%d ?\n", entry->type))
goto partial;

return TRACE_TYPE_HANDLED;
partial:
return TRACE_TYPE_PARTIAL_LINE;
}

static enum print_line_t print_hex_fmt(struct trace_iterator *iter)
Expand All @@ -1504,8 +1494,11 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)
}

event = ftrace_find_event(entry->type);
if (event && event->hex)
event->hex(iter, 0);
if (event && event->hex) {
int ret = event->hex(iter, 0);
if (ret != TRACE_TYPE_HANDLED)
return ret;
}

SEQ_PUT_FIELD_RET(s, newline);

Expand Down Expand Up @@ -1544,7 +1537,7 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter)

event = ftrace_find_event(entry->type);
if (event && event->binary)
event->binary(iter, 0);
return event->binary(iter, 0);

return TRACE_TYPE_HANDLED;
}
Expand Down
2 changes: 1 addition & 1 deletion kernel/trace/trace_branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ static int trace_branch_print(struct trace_iterator *iter, int flags)
field->line))
return TRACE_TYPE_PARTIAL_LINE;

return 0;
return TRACE_TYPE_HANDLED;
}


Expand Down
Loading

0 comments on commit d9793bd

Please sign in to comment.