Skip to content

Commit

Permalink
tracing: Make __buffer_unlock_commit() always_inline
Browse files Browse the repository at this point in the history
The function __buffer_unlock_commit() is called in a few places outside of
trace.c. But for the most part, it should really be inlined, as it is in the
hot path of the trace_events. For the callers outside of trace.c, create a
new function trace_buffer_unlock_commit_nostack(), as the reason it was used
was to avoid the stack tracing that trace_buffer_unlock_commit() could do.

Link: http://lkml.kernel.org/r/[email protected]

Reported-by: Andi Kleen <[email protected]>
Signed-off-by: Steven Rostedt <[email protected]>
  • Loading branch information
rostedt committed Nov 24, 2016
1 parent 4239174 commit 52ffabe
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 21 deletions.
41 changes: 26 additions & 15 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,22 @@ void tracing_on(void)
}
EXPORT_SYMBOL_GPL(tracing_on);


static __always_inline void
__buffer_unlock_commit(struct ring_buffer *buffer, struct ring_buffer_event *event)
{
__this_cpu_write(trace_cmdline_save, true);

/* If this is the temp buffer, we need to commit fully */
if (this_cpu_read(trace_buffered_event) == event) {
/* Length is in event->array[0] */
ring_buffer_write(buffer, event->array[0], &event->array[1]);
/* Release the temp buffer */
this_cpu_dec(trace_buffered_event_cnt);
} else
ring_buffer_unlock_commit(buffer, event);
}

/**
* __trace_puts - write a constant string into the trace buffer.
* @ip: The address of the caller
Expand Down Expand Up @@ -2059,21 +2075,6 @@ void trace_buffered_event_disable(void)
preempt_enable();
}

void
__buffer_unlock_commit(struct ring_buffer *buffer, struct ring_buffer_event *event)
{
__this_cpu_write(trace_cmdline_save, true);

/* If this is the temp buffer, we need to commit fully */
if (this_cpu_read(trace_buffered_event) == event) {
/* Length is in event->array[0] */
ring_buffer_write(buffer, event->array[0], &event->array[1]);
/* Release the temp buffer */
this_cpu_dec(trace_buffered_event_cnt);
} else
ring_buffer_unlock_commit(buffer, event);
}

static struct ring_buffer *temp_buffer;

struct ring_buffer_event *
Expand Down Expand Up @@ -2214,6 +2215,16 @@ void trace_buffer_unlock_commit_regs(struct trace_array *tr,
ftrace_trace_userstack(buffer, flags, pc);
}

/*
* Similar to trace_buffer_unlock_commit_regs() but do not dump stack.
*/
void
trace_buffer_unlock_commit_nostack(struct ring_buffer *buffer,
struct ring_buffer_event *event)
{
__buffer_unlock_commit(buffer, event);
}

static void
trace_process_export(struct trace_export *export,
struct ring_buffer_event *event)
Expand Down
4 changes: 2 additions & 2 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -602,8 +602,8 @@ struct trace_entry *tracing_get_trace_entry(struct trace_array *tr,
struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
int *ent_cpu, u64 *ent_ts);

void __buffer_unlock_commit(struct ring_buffer *buffer,
struct ring_buffer_event *event);
void trace_buffer_unlock_commit_nostack(struct ring_buffer *buffer,
struct ring_buffer_event *event);

int trace_empty(struct trace_iterator *iter);

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 @@ -81,7 +81,7 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect)
entry->correct = val == expect;

if (!call_filter_check_discard(call, entry, buffer, event))
__buffer_unlock_commit(buffer, event);
trace_buffer_unlock_commit_nostack(buffer, event);

out:
current->trace_recursion &= ~TRACE_BRANCH_BIT;
Expand Down
4 changes: 2 additions & 2 deletions kernel/trace/trace_functions_graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ int __trace_graph_entry(struct trace_array *tr,
entry = ring_buffer_event_data(event);
entry->graph_ent = *trace;
if (!call_filter_check_discard(call, entry, buffer, event))
__buffer_unlock_commit(buffer, event);
trace_buffer_unlock_commit_nostack(buffer, event);

return 1;
}
Expand Down Expand Up @@ -469,7 +469,7 @@ void __trace_graph_return(struct trace_array *tr,
entry = ring_buffer_event_data(event);
entry->ret = *trace;
if (!call_filter_check_discard(call, entry, buffer, event))
__buffer_unlock_commit(buffer, event);
trace_buffer_unlock_commit_nostack(buffer, event);
}

void trace_graph_return(struct ftrace_graph_ret *trace)
Expand Down
2 changes: 1 addition & 1 deletion kernel/trace/trace_hwlat.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ static void trace_hwlat_sample(struct hwlat_sample *sample)
entry->nmi_count = sample->nmi_count;

if (!call_filter_check_discard(call, entry, buffer, event))
__buffer_unlock_commit(buffer, event);
trace_buffer_unlock_commit_nostack(buffer, event);
}

/* Macros to encapsulate the time capturing infrastructure */
Expand Down

0 comments on commit 52ffabe

Please sign in to comment.