You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'trace-v4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing updates from Steven Rostedt:
"Not much new with tracing for this release. Mostly just clean ups and
minor fixes.
Here's what else is new:
- A new TRACE_EVENT_FN_COND macro, combining both _FN and _COND for
those that want both.
- New selftest to test the instance create and delete
- Better debug output when ftrace fails"
* tag 'trace-v4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (24 commits)
ftrace: Fix the race between ftrace and insmod
ftrace: Add infrastructure for delayed enabling of module functions
x86: ftrace: Fix the comments for ftrace_modify_code_direct()
tracing: Fix comment to use tracing_on over tracing_enable
metag: ftrace: Fix the comments for ftrace_modify_code
sh: ftrace: Fix the comments for ftrace_modify_code()
ia64: ftrace: Fix the comments for ftrace_modify_code()
ftrace: Clean up ftrace_module_init() code
ftrace: Join functions ftrace_module_init() and ftrace_init_module()
tracing: Introduce TRACE_EVENT_FN_COND macro
tracing: Use seq_buf_used() in seq_buf_to_user() instead of len
bpf: Constify bpf_verifier_ops structure
ftrace: Have ftrace_ops_get_func() handle RCU and PER_CPU flags too
ftrace: Remove use of control list and ops
ftrace: Fix output of enabled_functions for showing tramp
ftrace: Fix a typo in comment
ftrace: Show all tramps registered to a record on ftrace_bug()
ftrace: Add variable ftrace_expected for archs to show expected code
ftrace: Add new type to distinguish what kind of ftrace_bug()
tracing: Update cond flag when enabling or disabling a trigger
...
This commit is contained in:
@@ -316,7 +316,7 @@ static bool kprobe_prog_is_valid_access(int off, int size, enum bpf_access_type
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct bpf_verifier_ops kprobe_prog_ops = {
|
||||
static const struct bpf_verifier_ops kprobe_prog_ops = {
|
||||
.get_func_proto = kprobe_prog_func_proto,
|
||||
.is_valid_access = kprobe_prog_is_valid_access,
|
||||
};
|
||||
|
||||
+265
-188
File diff suppressed because it is too large
Load Diff
+26
-31
@@ -1001,17 +1001,13 @@ static int rb_head_page_replace(struct buffer_page *old,
|
||||
|
||||
/*
|
||||
* rb_tail_page_update - move the tail page forward
|
||||
*
|
||||
* Returns 1 if moved tail page, 0 if someone else did.
|
||||
*/
|
||||
static int rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
static void rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
struct buffer_page *tail_page,
|
||||
struct buffer_page *next_page)
|
||||
{
|
||||
struct buffer_page *old_tail;
|
||||
unsigned long old_entries;
|
||||
unsigned long old_write;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* The tail page now needs to be moved forward.
|
||||
@@ -1036,7 +1032,7 @@ static int rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
* it is, then it is up to us to update the tail
|
||||
* pointer.
|
||||
*/
|
||||
if (tail_page == cpu_buffer->tail_page) {
|
||||
if (tail_page == READ_ONCE(cpu_buffer->tail_page)) {
|
||||
/* Zero the write counter */
|
||||
unsigned long val = old_write & ~RB_WRITE_MASK;
|
||||
unsigned long eval = old_entries & ~RB_WRITE_MASK;
|
||||
@@ -1061,14 +1057,9 @@ static int rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
*/
|
||||
local_set(&next_page->page->commit, 0);
|
||||
|
||||
old_tail = cmpxchg(&cpu_buffer->tail_page,
|
||||
tail_page, next_page);
|
||||
|
||||
if (old_tail == tail_page)
|
||||
ret = 1;
|
||||
/* Again, either we update tail_page or an interrupt does */
|
||||
(void)cmpxchg(&cpu_buffer->tail_page, tail_page, next_page);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rb_check_bpage(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
@@ -2036,12 +2027,15 @@ rb_handle_head_page(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
* the tail page would have moved.
|
||||
*/
|
||||
if (ret == RB_PAGE_NORMAL) {
|
||||
struct buffer_page *buffer_tail_page;
|
||||
|
||||
buffer_tail_page = READ_ONCE(cpu_buffer->tail_page);
|
||||
/*
|
||||
* If the tail had moved passed next, then we need
|
||||
* to reset the pointer.
|
||||
*/
|
||||
if (cpu_buffer->tail_page != tail_page &&
|
||||
cpu_buffer->tail_page != next_page)
|
||||
if (buffer_tail_page != tail_page &&
|
||||
buffer_tail_page != next_page)
|
||||
rb_head_page_set_normal(cpu_buffer, new_head,
|
||||
next_page,
|
||||
RB_PAGE_HEAD);
|
||||
@@ -2135,6 +2129,8 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
local_sub(length, &tail_page->write);
|
||||
}
|
||||
|
||||
static inline void rb_end_commit(struct ring_buffer_per_cpu *cpu_buffer);
|
||||
|
||||
/*
|
||||
* This is the slow path, force gcc not to inline it.
|
||||
*/
|
||||
@@ -2147,7 +2143,6 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
struct ring_buffer *buffer = cpu_buffer->buffer;
|
||||
struct buffer_page *next_page;
|
||||
int ret;
|
||||
u64 ts;
|
||||
|
||||
next_page = tail_page;
|
||||
|
||||
@@ -2221,20 +2216,17 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
}
|
||||
}
|
||||
|
||||
ret = rb_tail_page_update(cpu_buffer, tail_page, next_page);
|
||||
if (ret) {
|
||||
/*
|
||||
* Nested commits always have zero deltas, so
|
||||
* just reread the time stamp
|
||||
*/
|
||||
ts = rb_time_stamp(buffer);
|
||||
next_page->page->time_stamp = ts;
|
||||
}
|
||||
rb_tail_page_update(cpu_buffer, tail_page, next_page);
|
||||
|
||||
out_again:
|
||||
|
||||
rb_reset_tail(cpu_buffer, tail, info);
|
||||
|
||||
/* Commit what we have for now. */
|
||||
rb_end_commit(cpu_buffer);
|
||||
/* rb_end_commit() decs committing */
|
||||
local_inc(&cpu_buffer->committing);
|
||||
|
||||
/* fail and let the caller try again */
|
||||
return ERR_PTR(-EAGAIN);
|
||||
|
||||
@@ -2362,7 +2354,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
addr = (unsigned long)event;
|
||||
addr &= PAGE_MASK;
|
||||
|
||||
bpage = cpu_buffer->tail_page;
|
||||
bpage = READ_ONCE(cpu_buffer->tail_page);
|
||||
|
||||
if (bpage->page == (void *)addr && rb_page_write(bpage) == old_index) {
|
||||
unsigned long write_mask =
|
||||
@@ -2410,7 +2402,7 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
again:
|
||||
max_count = cpu_buffer->nr_pages * 100;
|
||||
|
||||
while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
|
||||
while (cpu_buffer->commit_page != READ_ONCE(cpu_buffer->tail_page)) {
|
||||
if (RB_WARN_ON(cpu_buffer, !(--max_count)))
|
||||
return;
|
||||
if (RB_WARN_ON(cpu_buffer,
|
||||
@@ -2419,8 +2411,10 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
local_set(&cpu_buffer->commit_page->page->commit,
|
||||
rb_page_write(cpu_buffer->commit_page));
|
||||
rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
|
||||
cpu_buffer->write_stamp =
|
||||
cpu_buffer->commit_page->page->time_stamp;
|
||||
/* Only update the write stamp if the page has an event */
|
||||
if (rb_page_write(cpu_buffer->commit_page))
|
||||
cpu_buffer->write_stamp =
|
||||
cpu_buffer->commit_page->page->time_stamp;
|
||||
/* add barrier to keep gcc from optimizing too much */
|
||||
barrier();
|
||||
}
|
||||
@@ -2443,7 +2437,7 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
* and pushed the tail page forward, we will be left with
|
||||
* a dangling commit that will never go forward.
|
||||
*/
|
||||
if (unlikely(cpu_buffer->commit_page != cpu_buffer->tail_page))
|
||||
if (unlikely(cpu_buffer->commit_page != READ_ONCE(cpu_buffer->tail_page)))
|
||||
goto again;
|
||||
}
|
||||
|
||||
@@ -2699,7 +2693,8 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
if (unlikely(info->add_timestamp))
|
||||
info->length += RB_LEN_TIME_EXTEND;
|
||||
|
||||
tail_page = info->tail_page = cpu_buffer->tail_page;
|
||||
/* Don't let the compiler play games with cpu_buffer->tail_page */
|
||||
tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page);
|
||||
write = local_add_return(info->length, &tail_page->write);
|
||||
|
||||
/* set write to only the index of the write */
|
||||
|
||||
@@ -363,8 +363,8 @@ struct trace_option_dentry {
|
||||
* @name: the name chosen to select it on the available_tracers file
|
||||
* @init: called when one switches to this tracer (echo name > current_tracer)
|
||||
* @reset: called when one switches to another tracer
|
||||
* @start: called when tracing is unpaused (echo 1 > tracing_enabled)
|
||||
* @stop: called when tracing is paused (echo 0 > tracing_enabled)
|
||||
* @start: called when tracing is unpaused (echo 1 > tracing_on)
|
||||
* @stop: called when tracing is paused (echo 0 > tracing_on)
|
||||
* @update_thresh: called when tracing_thresh is updated
|
||||
* @open: called when the trace file is opened
|
||||
* @pipe_open: called when the trace_pipe file is opened
|
||||
@@ -467,8 +467,6 @@ enum {
|
||||
TRACE_INTERNAL_IRQ_BIT,
|
||||
TRACE_INTERNAL_SIRQ_BIT,
|
||||
|
||||
TRACE_CONTROL_BIT,
|
||||
|
||||
TRACE_BRANCH_BIT,
|
||||
/*
|
||||
* Abuse of the trace_recursion.
|
||||
|
||||
@@ -334,7 +334,7 @@ static int perf_ftrace_function_register(struct perf_event *event)
|
||||
{
|
||||
struct ftrace_ops *ops = &event->ftrace_ops;
|
||||
|
||||
ops->flags |= FTRACE_OPS_FL_CONTROL;
|
||||
ops->flags |= FTRACE_OPS_FL_PER_CPU | FTRACE_OPS_FL_RCU;
|
||||
ops->func = perf_ftrace_function_call;
|
||||
return register_ftrace_function(ops);
|
||||
}
|
||||
|
||||
@@ -538,11 +538,12 @@ static int register_trigger(char *glob, struct event_trigger_ops *ops,
|
||||
list_add_rcu(&data->list, &file->triggers);
|
||||
ret++;
|
||||
|
||||
update_cond_flag(file);
|
||||
if (trace_event_trigger_enable_disable(file, 1) < 0) {
|
||||
list_del_rcu(&data->list);
|
||||
update_cond_flag(file);
|
||||
ret--;
|
||||
}
|
||||
update_cond_flag(file);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -570,8 +571,8 @@ static void unregister_trigger(char *glob, struct event_trigger_ops *ops,
|
||||
if (data->cmd_ops->trigger_type == test->cmd_ops->trigger_type) {
|
||||
unregistered = true;
|
||||
list_del_rcu(&data->list);
|
||||
update_cond_flag(file);
|
||||
trace_event_trigger_enable_disable(file, 0);
|
||||
update_cond_flag(file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1314,11 +1315,12 @@ static int event_enable_register_trigger(char *glob,
|
||||
list_add_rcu(&data->list, &file->triggers);
|
||||
ret++;
|
||||
|
||||
update_cond_flag(file);
|
||||
if (trace_event_trigger_enable_disable(file, 1) < 0) {
|
||||
list_del_rcu(&data->list);
|
||||
update_cond_flag(file);
|
||||
ret--;
|
||||
}
|
||||
update_cond_flag(file);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -1339,8 +1341,8 @@ static void event_enable_unregister_trigger(char *glob,
|
||||
(enable_data->file == test_enable_data->file)) {
|
||||
unregistered = true;
|
||||
list_del_rcu(&data->list);
|
||||
update_cond_flag(file);
|
||||
trace_event_trigger_enable_disable(file, 0);
|
||||
update_cond_flag(file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user