This patch only provides the implementation of the method. Later we will used it in a combination with a new option for function tracing.
Signed-off-by: Yordan Karadzhov (VMware) <y.kar...@gmail.com> --- kernel/trace/trace.c | 26 ++++++++++++++++++++++++++ kernel/trace/trace.h | 4 ++++ kernel/trace/trace_entries.h | 6 ++++++ 3 files changed, 36 insertions(+) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 82833be07c1e..bbc57cf3bda4 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3117,6 +3117,32 @@ static void ftrace_trace_userstack(struct trace_array *tr, #endif /* CONFIG_STACKTRACE */ +void trace_last_func_repeats(struct trace_array *tr, + struct trace_func_repeats *last_info, + unsigned int trace_ctx) +{ + struct trace_buffer *buffer = tr->array_buffer.buffer; + struct func_repeats_entry *entry; + struct ring_buffer_event *event; + u64 delta; + + event = __trace_buffer_lock_reserve(buffer, TRACE_FUNC_REPEATS, + sizeof(*entry), trace_ctx); + if (!event) + return; + + delta = ring_buffer_event_time_stamp(buffer, event) - + last_info->ts_last_call; + + entry = ring_buffer_event_data(event); + entry->ip = last_info->ip; + entry->parent_ip = last_info->parent_ip; + entry->count = last_info->count; + FUNC_REPEATS_SET_DELTA_TS(entry, delta) + + __buffer_unlock_commit(buffer, event); +} + /* created for use with alloc_percpu */ struct trace_buffer_struct { int nesting; diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 1cd4da7ba769..e1f34119c036 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -701,6 +701,10 @@ static inline void __trace_stack(struct trace_array *tr, unsigned int trace_ctx, } #endif /* CONFIG_STACKTRACE */ +void trace_last_func_repeats(struct trace_array *tr, + struct trace_func_repeats *last_info, + unsigned int trace_ctx); + extern u64 ftrace_now(int cpu); extern void trace_find_cmdline(int pid, char comm[]); diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index fdd022a7aecf..5e9dc56af4b1 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h @@ -342,6 +342,12 @@ FTRACE_ENTRY(hwlat, hwlat_entry, #define FUNC_REPEATS_GET_DELTA_TS(entry) \ (((u64)entry->top_delta_ts << 32) | entry->bottom_delta_ts) \ +#define FUNC_REPEATS_SET_DELTA_TS(entry, delta) \ + do { \ + entry->bottom_delta_ts = delta & U32_MAX; \ + entry->top_delta_ts = (delta >> 32); \ + } while (0); \ + FTRACE_ENTRY(func_repeats, func_repeats_entry, TRACE_FUNC_REPEATS, -- 2.25.1