Merge tag 'trace-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing fixes from Steven Rostedt: - Use correct timestamp variable for ring buffer write stamp update - Fix up before stamp and write stamp when crossing ring buffer sub buffers - Keep a zero delta in ring buffer in slow path if cmpxchg fails - Fix trace_printk static buffer for archs that care - Fix ftrace record accounting for ftrace ops with trampolines - Fix DYNAMIC_FTRACE_WITH_DIRECT_CALLS dependency - Remove WARN_ON in hwlat tracer that triggers on something that is OK - Make "my_tramp" trampoline in ftrace direct sample code global - Fixes in the bootconfig tool for better alignment management * tag 'trace-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: ring-buffer: Always check to put back before stamp when crossing pages ftrace: Fix DYNAMIC_FTRACE_WITH_DIRECT_CALLS dependency ftrace: Fix updating FTRACE_FL_TRAMP tracing: Fix alignment of static buffer tracing: Remove WARN_ON in start_thread() samples/ftrace: Mark my_tramp[12]? global ring-buffer: Set the right timestamp in the slow path of __rb_reserve_next() ring-buffer: Update write stamp with the correct ts docs: bootconfig: Update file format on initrd image tools/bootconfig: Align the bootconfig applied initrd image size to 4 tools/bootconfig: Fix to check the write failure correctly tools/bootconfig: Fix errno reference after printf()
This commit is contained in:
@@ -202,7 +202,7 @@ config DYNAMIC_FTRACE_WITH_REGS
|
||||
|
||||
config DYNAMIC_FTRACE_WITH_DIRECT_CALLS
|
||||
def_bool y
|
||||
depends on DYNAMIC_FTRACE
|
||||
depends on DYNAMIC_FTRACE_WITH_REGS
|
||||
depends on HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
|
||||
|
||||
config FUNCTION_PROFILER
|
||||
|
||||
+21
-1
@@ -1629,6 +1629,8 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec)
|
||||
static struct ftrace_ops *
|
||||
ftrace_find_tramp_ops_any(struct dyn_ftrace *rec);
|
||||
static struct ftrace_ops *
|
||||
ftrace_find_tramp_ops_any_other(struct dyn_ftrace *rec, struct ftrace_ops *op_exclude);
|
||||
static struct ftrace_ops *
|
||||
ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops);
|
||||
|
||||
static bool __ftrace_hash_rec_update(struct ftrace_ops *ops,
|
||||
@@ -1778,7 +1780,7 @@ static bool __ftrace_hash_rec_update(struct ftrace_ops *ops,
|
||||
* to it.
|
||||
*/
|
||||
if (ftrace_rec_count(rec) == 1 &&
|
||||
ftrace_find_tramp_ops_any(rec))
|
||||
ftrace_find_tramp_ops_any_other(rec, ops))
|
||||
rec->flags |= FTRACE_FL_TRAMP;
|
||||
else
|
||||
rec->flags &= ~FTRACE_FL_TRAMP;
|
||||
@@ -2244,6 +2246,24 @@ ftrace_find_tramp_ops_any(struct dyn_ftrace *rec)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct ftrace_ops *
|
||||
ftrace_find_tramp_ops_any_other(struct dyn_ftrace *rec, struct ftrace_ops *op_exclude)
|
||||
{
|
||||
struct ftrace_ops *op;
|
||||
unsigned long ip = rec->ip;
|
||||
|
||||
do_for_each_ftrace_op(op, ftrace_ops_list) {
|
||||
|
||||
if (op == op_exclude || !op->trampoline)
|
||||
continue;
|
||||
|
||||
if (hash_contains_ip(ip, op->func_hash))
|
||||
return op;
|
||||
} while_for_each_ftrace_op(op);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct ftrace_ops *
|
||||
ftrace_find_tramp_ops_next(struct dyn_ftrace *rec,
|
||||
struct ftrace_ops *op)
|
||||
|
||||
@@ -3234,14 +3234,12 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
|
||||
/* See if we shot pass the end of this buffer page */
|
||||
if (unlikely(write > BUF_PAGE_SIZE)) {
|
||||
if (tail != w) {
|
||||
/* before and after may now different, fix it up*/
|
||||
b_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before);
|
||||
a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after);
|
||||
if (a_ok && b_ok && info->before != info->after)
|
||||
(void)rb_time_cmpxchg(&cpu_buffer->before_stamp,
|
||||
info->before, info->after);
|
||||
}
|
||||
/* before and after may now different, fix it up*/
|
||||
b_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before);
|
||||
a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after);
|
||||
if (a_ok && b_ok && info->before != info->after)
|
||||
(void)rb_time_cmpxchg(&cpu_buffer->before_stamp,
|
||||
info->before, info->after);
|
||||
return rb_move_tail(cpu_buffer, tail, info);
|
||||
}
|
||||
|
||||
@@ -3287,11 +3285,11 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
ts = rb_time_stamp(cpu_buffer->buffer);
|
||||
barrier();
|
||||
/*E*/ if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) &&
|
||||
info->after < ts) {
|
||||
info->after < ts &&
|
||||
rb_time_cmpxchg(&cpu_buffer->write_stamp,
|
||||
info->after, ts)) {
|
||||
/* Nothing came after this event between C and E */
|
||||
info->delta = ts - info->after;
|
||||
(void)rb_time_cmpxchg(&cpu_buffer->write_stamp,
|
||||
info->after, info->ts);
|
||||
info->ts = ts;
|
||||
} else {
|
||||
/*
|
||||
|
||||
@@ -3534,7 +3534,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,
|
||||
}
|
||||
|
||||
#define STATIC_TEMP_BUF_SIZE 128
|
||||
static char static_temp_buf[STATIC_TEMP_BUF_SIZE];
|
||||
static char static_temp_buf[STATIC_TEMP_BUF_SIZE] __aligned(4);
|
||||
|
||||
/* Find the next real entry, without updating the iterator itself */
|
||||
struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
|
||||
|
||||
@@ -368,7 +368,7 @@ static int start_kthread(struct trace_array *tr)
|
||||
struct task_struct *kthread;
|
||||
int next_cpu;
|
||||
|
||||
if (WARN_ON(hwlat_kthread))
|
||||
if (hwlat_kthread)
|
||||
return 0;
|
||||
|
||||
/* Just pick the first CPU on first iteration */
|
||||
|
||||
Reference in New Issue
Block a user