From nobody Sat Feb 7 08:42:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B35E433F8DF; Wed, 22 Oct 2025 15:38:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761147486; cv=none; b=S3mtt09SkcOU4Q6mKJmItsB4pEtOzmlbQ/TXtifelSEBwqXMsYpCsdwr9YE37ZbuYA8mgu515fLS6Z2N4K/3hE/Z6bqGfEFtjw1pz6Jw9YkpoIu7fElpH0oahWo7X/r/xkVVaVeUhJLK4h3NnVmCoF0xTlnwYD3ccUfJsNwhylQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761147486; c=relaxed/simple; bh=V6kdlYECVXwuBlP+IV92jR4Zumr2ocw67uyGI/EFTcw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ua6e8TQlPjW16/TGmSDSLbf8+zw0zlTtLMTkCACsUhUb4K0IKQpmfZFozEtscn52+Rc0neAKmVcFTVOOhtAAnlt6aJMVawKtfDSIbcW9TT13LCKTDqKOTc3K5EPX64M/ZlWDIwM2NfF7ux4A0zVz2Ewfg4Rc5YrCNRELhm/B0fU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XEUqUb5Z; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XEUqUb5Z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 39DDCC4CEF5; Wed, 22 Oct 2025 15:38:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761147486; bh=V6kdlYECVXwuBlP+IV92jR4Zumr2ocw67uyGI/EFTcw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XEUqUb5Zsd1y23wP3mQ+UvT1lHDvPIHyn5aCYPOI6I87aoZjqNJslLPuoMXdHv6uC ea7c4b56RmcT9uaWRd428bxYmfmCXN/WY+PGTLF8vJ56u41AfFZmwMYPdi+e0SPObX MDYAP7KYAL+Y2jWiC/i5emYbDSMx9+xz2jub3Mx9A8FBohquSJPvScwE+iecDJzN+v QAGrHK8Ryh5KQY2Nq1U/rmhKyabK8jwoHt4hGBmIxbRUbb4qYVn+zuzaNyIUDMt6qQ pLuiwdBGWqFdWk9A4ykJSwDPeB2YgcLveZWQ4r+o5tt025RuEFvWhV2JXsm1H96KBC yy0QfGMxdxUcA== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v5 1/2] tracing: Allow tracer to add more than 32 options Date: Thu, 23 Oct 2025 00:38:01 +0900 Message-ID: <176114748146.315239.12880807804845075466.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <176114747153.315239.6863821259073466010.stgit@devnote2> References: <176114747153.315239.6863821259073466010.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Since enum trace_iterator_flags is 32bit, the max number of the option flags is limited to 32 and it is fully used now. To add a new option, we need to expand it. So replace the TRACE_ITER_##flag with TRACE_ITER(flag) macro which is 64bit bitmask. Signed-off-by: Masami Hiramatsu (Google) --- Changes in v5: - Use TRACE_ITER() macro. Changes in v4: - Use enum ... : type {} instead of const variables. Changes in v3: - Make TRACE_ITER_* to global. --- kernel/trace/blktrace.c | 6 + kernel/trace/trace.c | 151 +++++++++++++++++-------------= ---- kernel/trace/trace.h | 29 +++---- kernel/trace/trace_events.c | 4 - kernel/trace/trace_events_synth.c | 2=20 kernel/trace/trace_fprobe.c | 6 + kernel/trace/trace_functions_graph.c | 18 ++-- kernel/trace/trace_irqsoff.c | 30 +++---- kernel/trace/trace_kdb.c | 2=20 kernel/trace/trace_kprobe.c | 6 + kernel/trace/trace_output.c | 18 ++-- kernel/trace/trace_sched_wakeup.c | 24 +++-- kernel/trace/trace_syscalls.c | 2=20 13 files changed, 148 insertions(+), 150 deletions(-) diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 6941145b5058..e21176f396d5 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -1452,7 +1452,7 @@ static enum print_line_t print_one_line(struct trace_= iterator *iter, =20 t =3D te_blk_io_trace(iter->ent); what =3D (t->action & ((1 << BLK_TC_SHIFT) - 1)) & ~__BLK_TA_CGROUP; - long_act =3D !!(tr->trace_flags & TRACE_ITER_VERBOSE); + long_act =3D !!(tr->trace_flags & TRACE_ITER(VERBOSE)); log_action =3D classic ? &blk_log_action_classic : &blk_log_action; has_cg =3D t->action & __BLK_TA_CGROUP; =20 @@ -1517,9 +1517,9 @@ blk_tracer_set_flag(struct trace_array *tr, u32 old_f= lags, u32 bit, int set) /* don't output context-info for blk_classic output */ if (bit =3D=3D TRACE_BLK_OPT_CLASSIC) { if (set) - tr->trace_flags &=3D ~TRACE_ITER_CONTEXT_INFO; + tr->trace_flags &=3D ~TRACE_ITER(CONTEXT_INFO); else - tr->trace_flags |=3D TRACE_ITER_CONTEXT_INFO; + tr->trace_flags |=3D TRACE_ITER(CONTEXT_INFO); } return 0; } diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4283ed4e8f59..bc7d56e8b920 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -513,21 +513,21 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_export); /* trace_flags holds trace_options default values */ #define TRACE_DEFAULT_FLAGS \ (FUNCTION_DEFAULT_FLAGS | \ - TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK | \ - TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO | \ - TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE | \ - TRACE_ITER_IRQ_INFO | TRACE_ITER_MARKERS | \ - TRACE_ITER_HASH_PTR | TRACE_ITER_TRACE_PRINTK | \ - TRACE_ITER_COPY_MARKER) + TRACE_ITER(PRINT_PARENT) | TRACE_ITER(PRINTK) | \ + TRACE_ITER(ANNOTATE) | TRACE_ITER(CONTEXT_INFO) | \ + TRACE_ITER(RECORD_CMD) | TRACE_ITER(OVERWRITE) | \ + TRACE_ITER(IRQ_INFO) | TRACE_ITER(MARKERS) | \ + TRACE_ITER(HASH_PTR) | TRACE_ITER(TRACE_PRINTK) | \ + TRACE_ITER(COPY_MARKER)) =20 /* trace_options that are only supported by global_trace */ -#define TOP_LEVEL_TRACE_FLAGS (TRACE_ITER_PRINTK | \ - TRACE_ITER_PRINTK_MSGONLY | TRACE_ITER_RECORD_CMD) +#define TOP_LEVEL_TRACE_FLAGS (TRACE_ITER(PRINTK) | \ + TRACE_ITER(PRINTK_MSGONLY) | TRACE_ITER(RECORD_CMD)) =20 /* trace_flags that are default zero for instances */ #define ZEROED_TRACE_FLAGS \ - (TRACE_ITER_EVENT_FORK | TRACE_ITER_FUNC_FORK | TRACE_ITER_TRACE_PRINTK |= \ - TRACE_ITER_COPY_MARKER) + (TRACE_ITER(EVENT_FORK) | TRACE_ITER(FUNC_FORK) | TRACE_ITER(TRACE_PRINTK= ) | \ + TRACE_ITER(COPY_MARKER)) =20 /* * The global_trace is the descriptor that holds the top-level tracing @@ -558,9 +558,9 @@ static void update_printk_trace(struct trace_array *tr) if (printk_trace =3D=3D tr) return; =20 - printk_trace->trace_flags &=3D ~TRACE_ITER_TRACE_PRINTK; + printk_trace->trace_flags &=3D ~TRACE_ITER(TRACE_PRINTK); printk_trace =3D tr; - tr->trace_flags |=3D TRACE_ITER_TRACE_PRINTK; + tr->trace_flags |=3D TRACE_ITER(TRACE_PRINTK); } =20 /* Returns true if the status of tr changed */ @@ -573,7 +573,7 @@ static bool update_marker_trace(struct trace_array *tr,= int enabled) return false; =20 list_add_rcu(&tr->marker_list, &marker_copies); - tr->trace_flags |=3D TRACE_ITER_COPY_MARKER; + tr->trace_flags |=3D TRACE_ITER(COPY_MARKER); return true; } =20 @@ -581,7 +581,7 @@ static bool update_marker_trace(struct trace_array *tr,= int enabled) return false; =20 list_del_init(&tr->marker_list); - tr->trace_flags &=3D ~TRACE_ITER_COPY_MARKER; + tr->trace_flags &=3D ~TRACE_ITER(COPY_MARKER); return true; } =20 @@ -1135,7 +1135,7 @@ int __trace_array_puts(struct trace_array *tr, unsign= ed long ip, unsigned int trace_ctx; int alloc; =20 - if (!(tr->trace_flags & TRACE_ITER_PRINTK)) + if (!(tr->trace_flags & TRACE_ITER(PRINTK))) return 0; =20 if (unlikely(tracing_selftest_running && tr =3D=3D &global_trace)) @@ -1201,7 +1201,7 @@ int __trace_bputs(unsigned long ip, const char *str) if (!printk_binsafe(tr)) return __trace_puts(ip, str, strlen(str)); =20 - if (!(tr->trace_flags & TRACE_ITER_PRINTK)) + if (!(tr->trace_flags & TRACE_ITER(PRINTK))) return 0; =20 if (unlikely(tracing_selftest_running || tracing_disabled)) @@ -3068,7 +3068,7 @@ static inline void ftrace_trace_stack(struct trace_ar= ray *tr, unsigned int trace_ctx, int skip, struct pt_regs *regs) { - if (!(tr->trace_flags & TRACE_ITER_STACKTRACE)) + if (!(tr->trace_flags & TRACE_ITER(STACKTRACE))) return; =20 __ftrace_trace_stack(tr, buffer, trace_ctx, skip, regs); @@ -3129,7 +3129,7 @@ ftrace_trace_userstack(struct trace_array *tr, struct ring_buffer_event *event; struct userstack_entry *entry; =20 - if (!(tr->trace_flags & TRACE_ITER_USERSTACKTRACE)) + if (!(tr->trace_flags & TRACE_ITER(USERSTACKTRACE))) return; =20 /* @@ -3474,7 +3474,7 @@ int trace_array_printk(struct trace_array *tr, if (tr =3D=3D &global_trace) return 0; =20 - if (!(tr->trace_flags & TRACE_ITER_PRINTK)) + if (!(tr->trace_flags & TRACE_ITER(PRINTK))) return 0; =20 va_start(ap, fmt); @@ -3511,7 +3511,7 @@ int trace_array_printk_buf(struct trace_buffer *buffe= r, int ret; va_list ap; =20 - if (!(printk_trace->trace_flags & TRACE_ITER_PRINTK)) + if (!(printk_trace->trace_flags & TRACE_ITER(PRINTK))) return 0; =20 va_start(ap, fmt); @@ -3781,7 +3781,7 @@ const char *trace_event_format(struct trace_iterator = *iter, const char *fmt) if (WARN_ON_ONCE(!fmt)) return fmt; =20 - if (!iter->tr || iter->tr->trace_flags & TRACE_ITER_HASH_PTR) + if (!iter->tr || iter->tr->trace_flags & TRACE_ITER(HASH_PTR)) return fmt; =20 p =3D fmt; @@ -4103,7 +4103,7 @@ static void print_event_info(struct array_buffer *buf= , struct seq_file *m) static void print_func_help_header(struct array_buffer *buf, struct seq_fi= le *m, unsigned int flags) { - bool tgid =3D flags & TRACE_ITER_RECORD_TGID; + bool tgid =3D flags & TRACE_ITER(RECORD_TGID); =20 print_event_info(buf, m); =20 @@ -4114,7 +4114,7 @@ static void print_func_help_header(struct array_buffe= r *buf, struct seq_file *m, static void print_func_help_header_irq(struct array_buffer *buf, struct se= q_file *m, unsigned int flags) { - bool tgid =3D flags & TRACE_ITER_RECORD_TGID; + bool tgid =3D flags & TRACE_ITER(RECORD_TGID); static const char space[] =3D " "; int prec =3D tgid ? 12 : 2; =20 @@ -4187,7 +4187,7 @@ static void test_cpu_buff_start(struct trace_iterator= *iter) struct trace_seq *s =3D &iter->seq; struct trace_array *tr =3D iter->tr; =20 - if (!(tr->trace_flags & TRACE_ITER_ANNOTATE)) + if (!(tr->trace_flags & TRACE_ITER(ANNOTATE))) return; =20 if (!(iter->iter_flags & TRACE_FILE_ANNOTATE)) @@ -4223,7 +4223,7 @@ static enum print_line_t print_trace_fmt(struct trace= _iterator *iter) =20 event =3D ftrace_find_event(entry->type); =20 - if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { + if (tr->trace_flags & TRACE_ITER(CONTEXT_INFO)) { if (iter->iter_flags & TRACE_FILE_LAT_FMT) trace_print_lat_context(iter); else @@ -4234,7 +4234,7 @@ static enum print_line_t print_trace_fmt(struct trace= _iterator *iter) return TRACE_TYPE_PARTIAL_LINE; =20 if (event) { - if (tr->trace_flags & TRACE_ITER_FIELDS) + if (tr->trace_flags & TRACE_ITER(FIELDS)) return print_event_fields(iter, event); /* * For TRACE_EVENT() events, the print_fmt is not @@ -4262,7 +4262,7 @@ static enum print_line_t print_raw_fmt(struct trace_i= terator *iter) =20 entry =3D iter->ent; =20 - if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) + if (tr->trace_flags & TRACE_ITER(CONTEXT_INFO)) trace_seq_printf(s, "%d %d %llu ", entry->pid, iter->cpu, iter->ts); =20 @@ -4288,7 +4288,7 @@ static enum print_line_t print_hex_fmt(struct trace_i= terator *iter) =20 entry =3D iter->ent; =20 - if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { + if (tr->trace_flags & TRACE_ITER(CONTEXT_INFO)) { SEQ_PUT_HEX_FIELD(s, entry->pid); SEQ_PUT_HEX_FIELD(s, iter->cpu); SEQ_PUT_HEX_FIELD(s, iter->ts); @@ -4317,7 +4317,7 @@ static enum print_line_t print_bin_fmt(struct trace_i= terator *iter) =20 entry =3D iter->ent; =20 - if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { + if (tr->trace_flags & TRACE_ITER(CONTEXT_INFO)) { SEQ_PUT_FIELD(s, entry->pid); SEQ_PUT_FIELD(s, iter->cpu); SEQ_PUT_FIELD(s, iter->ts); @@ -4388,27 +4388,27 @@ enum print_line_t print_trace_line(struct trace_ite= rator *iter) } =20 if (iter->ent->type =3D=3D TRACE_BPUTS && - trace_flags & TRACE_ITER_PRINTK && - trace_flags & TRACE_ITER_PRINTK_MSGONLY) + trace_flags & TRACE_ITER(PRINTK) && + trace_flags & TRACE_ITER(PRINTK_MSGONLY)) return trace_print_bputs_msg_only(iter); =20 if (iter->ent->type =3D=3D TRACE_BPRINT && - trace_flags & TRACE_ITER_PRINTK && - trace_flags & TRACE_ITER_PRINTK_MSGONLY) + trace_flags & TRACE_ITER(PRINTK) && + trace_flags & TRACE_ITER(PRINTK_MSGONLY)) return trace_print_bprintk_msg_only(iter); =20 if (iter->ent->type =3D=3D TRACE_PRINT && - trace_flags & TRACE_ITER_PRINTK && - trace_flags & TRACE_ITER_PRINTK_MSGONLY) + trace_flags & TRACE_ITER(PRINTK) && + trace_flags & TRACE_ITER(PRINTK_MSGONLY)) return trace_print_printk_msg_only(iter); =20 - if (trace_flags & TRACE_ITER_BIN) + if (trace_flags & TRACE_ITER(BIN)) return print_bin_fmt(iter); =20 - if (trace_flags & TRACE_ITER_HEX) + if (trace_flags & TRACE_ITER(HEX)) return print_hex_fmt(iter); =20 - if (trace_flags & TRACE_ITER_RAW) + if (trace_flags & TRACE_ITER(RAW)) return print_raw_fmt(iter); =20 return print_trace_fmt(iter); @@ -4426,7 +4426,7 @@ void trace_latency_header(struct seq_file *m) if (iter->iter_flags & TRACE_FILE_LAT_FMT) print_trace_header(m, iter); =20 - if (!(tr->trace_flags & TRACE_ITER_VERBOSE)) + if (!(tr->trace_flags & TRACE_ITER(VERBOSE))) print_lat_help_header(m); } =20 @@ -4436,7 +4436,7 @@ void trace_default_header(struct seq_file *m) struct trace_array *tr =3D iter->tr; unsigned long trace_flags =3D tr->trace_flags; =20 - if (!(trace_flags & TRACE_ITER_CONTEXT_INFO)) + if (!(trace_flags & TRACE_ITER(CONTEXT_INFO))) return; =20 if (iter->iter_flags & TRACE_FILE_LAT_FMT) { @@ -4444,11 +4444,11 @@ void trace_default_header(struct seq_file *m) if (trace_empty(iter)) return; print_trace_header(m, iter); - if (!(trace_flags & TRACE_ITER_VERBOSE)) + if (!(trace_flags & TRACE_ITER(VERBOSE))) print_lat_help_header(m); } else { - if (!(trace_flags & TRACE_ITER_VERBOSE)) { - if (trace_flags & TRACE_ITER_IRQ_INFO) + if (!(trace_flags & TRACE_ITER(VERBOSE))) { + if (trace_flags & TRACE_ITER(IRQ_INFO)) print_func_help_header_irq(iter->array_buffer, m, trace_flags); else @@ -4672,7 +4672,7 @@ __tracing_open(struct inode *inode, struct file *file= , bool snapshot) * If pause-on-trace is enabled, then stop the trace while * dumping, unless this is the "snapshot" file */ - if (!iter->snapshot && (tr->trace_flags & TRACE_ITER_PAUSE_ON_TRACE)) + if (!iter->snapshot && (tr->trace_flags & TRACE_ITER(PAUSE_ON_TRACE))) tracing_stop_tr(tr); =20 if (iter->cpu_file =3D=3D RING_BUFFER_ALL_CPUS) { @@ -4872,7 +4872,7 @@ static int tracing_open(struct inode *inode, struct f= ile *file) iter =3D __tracing_open(inode, file, false); if (IS_ERR(iter)) ret =3D PTR_ERR(iter); - else if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) + else if (tr->trace_flags & TRACE_ITER(LATENCY_FMT)) iter->iter_flags |=3D TRACE_FILE_LAT_FMT; } =20 @@ -5144,7 +5144,7 @@ static int tracing_trace_options_show(struct seq_file= *m, void *v) trace_opts =3D tr->current_trace->flags->opts; =20 for (i =3D 0; trace_options[i]; i++) { - if (tr->trace_flags & (1 << i)) + if (tr->trace_flags & (1ULL << i)) seq_printf(m, "%s\n", trace_options[i]); else seq_printf(m, "no%s\n", trace_options[i]); @@ -5197,20 +5197,20 @@ static int set_tracer_option(struct trace_array *tr= , char *cmp, int neg) } =20 /* Some tracers require overwrite to stay enabled */ -int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) +int trace_keep_overwrite(struct tracer *tracer, u64 mask, int set) { - if (tracer->enabled && (mask & TRACE_ITER_OVERWRITE) && !set) + if (tracer->enabled && (mask & TRACE_ITER(OVERWRITE)) && !set) return -1; =20 return 0; } =20 -int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) +int set_tracer_flag(struct trace_array *tr, u64 mask, int enabled) { - if ((mask =3D=3D TRACE_ITER_RECORD_TGID) || - (mask =3D=3D TRACE_ITER_RECORD_CMD) || - (mask =3D=3D TRACE_ITER_TRACE_PRINTK) || - (mask =3D=3D TRACE_ITER_COPY_MARKER)) + if ((mask =3D=3D TRACE_ITER(RECORD_TGID)) || + (mask =3D=3D TRACE_ITER(RECORD_CMD)) || + (mask =3D=3D TRACE_ITER(TRACE_PRINTK)) || + (mask =3D=3D TRACE_ITER(COPY_MARKER))) lockdep_assert_held(&event_mutex); =20 /* do nothing if flag is already set */ @@ -5222,7 +5222,7 @@ int set_tracer_flag(struct trace_array *tr, unsigned = int mask, int enabled) if (tr->current_trace->flag_changed(tr, mask, !!enabled)) return -EINVAL; =20 - if (mask =3D=3D TRACE_ITER_TRACE_PRINTK) { + if (mask =3D=3D TRACE_ITER(TRACE_PRINTK)) { if (enabled) { update_printk_trace(tr); } else { @@ -5241,7 +5241,7 @@ int set_tracer_flag(struct trace_array *tr, unsigned = int mask, int enabled) } } =20 - if (mask =3D=3D TRACE_ITER_COPY_MARKER) + if (mask =3D=3D TRACE_ITER(COPY_MARKER)) update_marker_trace(tr, enabled); =20 if (enabled) @@ -5249,33 +5249,33 @@ int set_tracer_flag(struct trace_array *tr, unsigne= d int mask, int enabled) else tr->trace_flags &=3D ~mask; =20 - if (mask =3D=3D TRACE_ITER_RECORD_CMD) + if (mask =3D=3D TRACE_ITER(RECORD_CMD)) trace_event_enable_cmd_record(enabled); =20 - if (mask =3D=3D TRACE_ITER_RECORD_TGID) { + if (mask =3D=3D TRACE_ITER(RECORD_TGID)) { =20 if (trace_alloc_tgid_map() < 0) { - tr->trace_flags &=3D ~TRACE_ITER_RECORD_TGID; + tr->trace_flags &=3D ~TRACE_ITER(RECORD_TGID); return -ENOMEM; } =20 trace_event_enable_tgid_record(enabled); } =20 - if (mask =3D=3D TRACE_ITER_EVENT_FORK) + if (mask =3D=3D TRACE_ITER(EVENT_FORK)) trace_event_follow_fork(tr, enabled); =20 - if (mask =3D=3D TRACE_ITER_FUNC_FORK) + if (mask =3D=3D TRACE_ITER(FUNC_FORK)) ftrace_pid_follow_fork(tr, enabled); =20 - if (mask =3D=3D TRACE_ITER_OVERWRITE) { + if (mask =3D=3D TRACE_ITER(OVERWRITE)) { ring_buffer_change_overwrite(tr->array_buffer.buffer, enabled); #ifdef CONFIG_TRACER_MAX_TRACE ring_buffer_change_overwrite(tr->max_buffer.buffer, enabled); #endif } =20 - if (mask =3D=3D TRACE_ITER_PRINTK) { + if (mask =3D=3D TRACE_ITER(PRINTK)) { trace_printk_start_stop_comm(enabled); trace_printk_control(enabled); } @@ -5307,7 +5307,7 @@ int trace_set_options(struct trace_array *tr, char *o= ption) if (ret < 0) ret =3D set_tracer_option(tr, cmp, neg); else - ret =3D set_tracer_flag(tr, 1 << ret, !neg); + ret =3D set_tracer_flag(tr, 1ULL << ret, !neg); =20 mutex_unlock(&trace_types_lock); mutex_unlock(&event_mutex); @@ -6528,7 +6528,7 @@ static int tracing_open_pipe(struct inode *inode, str= uct file *filp) /* trace pipe does not show start of buffer */ cpumask_setall(iter->started); =20 - if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) + if (tr->trace_flags & TRACE_ITER(LATENCY_FMT)) iter->iter_flags |=3D TRACE_FILE_LAT_FMT; =20 /* Output in nanoseconds only if we are using a clock in nanoseconds. */ @@ -6589,7 +6589,7 @@ trace_poll(struct trace_iterator *iter, struct file *= filp, poll_table *poll_tabl if (trace_buffer_iter(iter, iter->cpu_file)) return EPOLLIN | EPOLLRDNORM; =20 - if (tr->trace_flags & TRACE_ITER_BLOCK) + if (tr->trace_flags & TRACE_ITER(BLOCK)) /* * Always select as readable when in blocking mode */ @@ -7141,7 +7141,7 @@ tracing_free_buffer_release(struct inode *inode, stru= ct file *filp) struct trace_array *tr =3D inode->i_private; =20 /* disable tracing ? */ - if (tr->trace_flags & TRACE_ITER_STOP_ON_FREE) + if (tr->trace_flags & TRACE_ITER(STOP_ON_FREE)) tracer_tracing_off(tr); /* resize the ring buffer to 0 */ tracing_resize_ring_buffer(tr, 0, RING_BUFFER_ALL_CPUS); @@ -7244,7 +7244,7 @@ tracing_mark_write(struct file *filp, const char __us= er *ubuf, if (tracing_disabled) return -EINVAL; =20 - if (!(tr->trace_flags & TRACE_ITER_MARKERS)) + if (!(tr->trace_flags & TRACE_ITER(MARKERS))) return -EINVAL; =20 if ((ssize_t)cnt < 0) @@ -7325,7 +7325,7 @@ tracing_mark_raw_write(struct file *filp, const char = __user *ubuf, if (tracing_disabled) return -EINVAL; =20 - if (!(tr->trace_flags & TRACE_ITER_MARKERS)) + if (!(tr->trace_flags & TRACE_ITER(MARKERS))) return -EINVAL; =20 /* The marker must at least have a tag id */ @@ -9119,7 +9119,7 @@ trace_options_core_read(struct file *filp, char __use= r *ubuf, size_t cnt, =20 get_tr_index(tr_index, &tr, &index); =20 - if (tr->trace_flags & (1 << index)) + if (tr->trace_flags & (1ULL << index)) buf =3D "1\n"; else buf =3D "0\n"; @@ -9148,7 +9148,7 @@ trace_options_core_write(struct file *filp, const cha= r __user *ubuf, size_t cnt, =20 mutex_lock(&event_mutex); mutex_lock(&trace_types_lock); - ret =3D set_tracer_flag(tr, 1 << index, val); + ret =3D set_tracer_flag(tr, 1ULL << index, val); mutex_unlock(&trace_types_lock); mutex_unlock(&event_mutex); =20 @@ -9312,8 +9312,9 @@ static void create_trace_options_dir(struct trace_arr= ay *tr) =20 for (i =3D 0; trace_options[i]; i++) { if (top_level || - !((1 << i) & TOP_LEVEL_TRACE_FLAGS)) + !((1ULL << i) & TOP_LEVEL_TRACE_FLAGS)) { create_trace_option_core_file(tr, trace_options[i], i); + } } } =20 @@ -9634,7 +9635,7 @@ allocate_trace_buffer(struct trace_array *tr, struct = array_buffer *buf, int size struct trace_scratch *tscratch; unsigned int scratch_size =3D 0; =20 - rb_flags =3D tr->trace_flags & TRACE_ITER_OVERWRITE ? RB_FL_OVERWRITE : 0; + rb_flags =3D tr->trace_flags & TRACE_ITER(OVERWRITE) ? RB_FL_OVERWRITE : = 0; =20 buf->tr =3D tr; =20 @@ -9997,7 +9998,7 @@ static int __remove_instance(struct trace_array *tr) /* Disable all the flags that were enabled coming in */ for (i =3D 0; i < TRACE_FLAGS_MAX_SIZE; i++) { if ((1 << i) & ZEROED_TRACE_FLAGS) - set_tracer_flag(tr, 1 << i, 0); + set_tracer_flag(tr, 1ULL << i, 0); } =20 if (printk_trace =3D=3D tr) @@ -10588,10 +10589,10 @@ static void ftrace_dump_one(struct trace_array *t= r, enum ftrace_dump_mode dump_m /* While dumping, do not allow the buffer to be enable */ tracer_tracing_disable(tr); =20 - old_userobj =3D tr->trace_flags & TRACE_ITER_SYM_USEROBJ; + old_userobj =3D tr->trace_flags & TRACE_ITER(SYM_USEROBJ); =20 /* don't look at user memory in panic mode */ - tr->trace_flags &=3D ~TRACE_ITER_SYM_USEROBJ; + tr->trace_flags &=3D ~TRACE_ITER(SYM_USEROBJ); =20 if (dump_mode =3D=3D DUMP_ORIG) iter.cpu_file =3D raw_smp_processor_id(); diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 1dbf1d3cf2f1..50b4c06e37f0 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -216,7 +216,7 @@ struct array_buffer { int cpu; }; =20 -#define TRACE_FLAGS_MAX_SIZE 32 +#define TRACE_FLAGS_MAX_SIZE 64 =20 struct trace_options { struct tracer *tracer; @@ -390,7 +390,7 @@ struct trace_array { int buffer_percent; unsigned int n_err_log_entries; struct tracer *current_trace; - unsigned int trace_flags; + u64 trace_flags; unsigned char trace_flags_index[TRACE_FLAGS_MAX_SIZE]; unsigned int flags; raw_spinlock_t start_lock; @@ -631,7 +631,7 @@ struct tracer { u32 old_flags, u32 bit, int set); /* Return 0 if OK with change, else return non-zero */ int (*flag_changed)(struct trace_array *tr, - u32 mask, int set); + u64 mask, int set); struct tracer *next; struct tracer_flags *flags; int enabled; @@ -1339,11 +1339,11 @@ extern int trace_get_user(struct trace_parser *pars= er, const char __user *ubuf, # define FUNCTION_FLAGS \ C(FUNCTION, "function-trace"), \ C(FUNC_FORK, "function-fork"), -# define FUNCTION_DEFAULT_FLAGS TRACE_ITER_FUNCTION +# define FUNCTION_DEFAULT_FLAGS TRACE_ITER(FUNCTION) #else # define FUNCTION_FLAGS # define FUNCTION_DEFAULT_FLAGS 0UL -# define TRACE_ITER_FUNC_FORK 0UL +# define TRACE_ITER_FUNC_FORK_BIT -1 #endif =20 #ifdef CONFIG_STACKTRACE @@ -1385,7 +1385,7 @@ extern int trace_get_user(struct trace_parser *parser= , const char __user *ubuf, C(MARKERS, "markers"), \ C(EVENT_FORK, "event-fork"), \ C(TRACE_PRINTK, "trace_printk_dest"), \ - C(COPY_MARKER, "copy_trace_marker"),\ + C(COPY_MARKER, "copy_trace_marker"), \ C(PAUSE_ON_TRACE, "pause-on-trace"), \ C(HASH_PTR, "hash-ptr"), /* Print hashed pointer */ \ FUNCTION_FLAGS \ @@ -1407,20 +1407,17 @@ enum trace_iterator_bits { }; =20 /* - * By redefining C, we can make TRACE_FLAGS a list of masks that - * use the bits as defined above. + * And use TRACE_ITER(flag) to define the bit masks. */ -#undef C -#define C(a, b) TRACE_ITER_##a =3D (1 << TRACE_ITER_##a##_BIT) - -enum trace_iterator_flags { TRACE_FLAGS }; +#define TRACE_ITER(flag) \ + (TRACE_ITER_##flag##_BIT < 0 ? 0 : 1ULL << (TRACE_ITER_##flag##_BIT)) =20 /* * TRACE_ITER_SYM_MASK masks the options in trace_flags that * control the output of kernel symbols. */ #define TRACE_ITER_SYM_MASK \ - (TRACE_ITER_PRINT_PARENT|TRACE_ITER_SYM_OFFSET|TRACE_ITER_SYM_ADDR) + (TRACE_ITER(PRINT_PARENT)|TRACE_ITER(SYM_OFFSET)|TRACE_ITER(SYM_ADDR)) =20 extern struct tracer nop_trace; =20 @@ -1429,7 +1426,7 @@ extern int enable_branch_tracing(struct trace_array *= tr); extern void disable_branch_tracing(void); static inline int trace_branch_enable(struct trace_array *tr) { - if (tr->trace_flags & TRACE_ITER_BRANCH) + if (tr->trace_flags & TRACE_ITER(BRANCH)) return enable_branch_tracing(tr); return 0; } @@ -2058,8 +2055,8 @@ extern const char *__stop___tracepoint_str[]; =20 void trace_printk_control(bool enabled); void trace_printk_start_comm(void); -int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set); -int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled= ); +int trace_keep_overwrite(struct tracer *tracer, u64 mask, int set); +int set_tracer_flag(struct trace_array *tr, u64 mask, int enabled); =20 /* Used from boot time tracer */ extern int trace_set_options(struct trace_array *tr, char *option); diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 9f3e9537417d..5dc239b91d13 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -845,13 +845,13 @@ static int __ftrace_event_enable_disable(struct trace= _event_file *file, if (soft_disable) set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags); =20 - if (tr->trace_flags & TRACE_ITER_RECORD_CMD) { + if (tr->trace_flags & TRACE_ITER(RECORD_CMD)) { cmd =3D true; tracing_start_cmdline_record(); set_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags); } =20 - if (tr->trace_flags & TRACE_ITER_RECORD_TGID) { + if (tr->trace_flags & TRACE_ITER(RECORD_TGID)) { tgid =3D true; tracing_start_tgid_record(); set_bit(EVENT_FILE_FL_RECORDED_TGID_BIT, &file->flags); diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_= synth.c index f24ee61f8884..2f19bbe73d27 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -359,7 +359,7 @@ static enum print_line_t print_synth_event(struct trace= _iterator *iter, fmt =3D synth_field_fmt(se->fields[i]->type); =20 /* parameter types */ - if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) + if (tr && tr->trace_flags & TRACE_ITER(VERBOSE)) trace_seq_printf(s, "%s ", fmt); =20 snprintf(print_fmt, sizeof(print_fmt), "%%s=3D%s%%s", fmt); diff --git a/kernel/trace/trace_fprobe.c b/kernel/trace/trace_fprobe.c index b36ade43d4b3..76b504ad7b4a 100644 --- a/kernel/trace/trace_fprobe.c +++ b/kernel/trace/trace_fprobe.c @@ -629,7 +629,7 @@ print_fentry_event(struct trace_iterator *iter, int fla= gs, =20 trace_seq_printf(s, "%s: (", trace_probe_name(tp)); =20 - if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_putc(s, ')'); @@ -659,12 +659,12 @@ print_fexit_event(struct trace_iterator *iter, int fl= ags, =20 trace_seq_printf(s, "%s: (", trace_probe_name(tp)); =20 - if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_puts(s, " <- "); =20 - if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_putc(s, ')'); diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_func= tions_graph.c index 66e1a527cf1a..2006cd24ef46 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -693,7 +693,7 @@ print_graph_irq(struct trace_iterator *iter, unsigned l= ong addr, addr >=3D (unsigned long)__irqentry_text_end) return; =20 - if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { + if (tr->trace_flags & TRACE_ITER(CONTEXT_INFO)) { /* Absolute time */ if (flags & TRACE_GRAPH_PRINT_ABS_TIME) print_graph_abs_time(iter->ts, s); @@ -713,7 +713,7 @@ print_graph_irq(struct trace_iterator *iter, unsigned l= ong addr, } =20 /* Latency format */ - if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) + if (tr->trace_flags & TRACE_ITER(LATENCY_FMT)) print_graph_lat_fmt(s, ent); } =20 @@ -767,7 +767,7 @@ print_graph_duration(struct trace_array *tr, unsigned l= ong long duration, struct trace_seq *s, u32 flags) { if (!(flags & TRACE_GRAPH_PRINT_DURATION) || - !(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) + !(tr->trace_flags & TRACE_ITER(CONTEXT_INFO))) return; =20 /* No real adata, just filling the column with spaces */ @@ -808,7 +808,7 @@ static void print_graph_retaddr(struct trace_seq *s, st= ruct fgraph_retaddr_ent_e trace_seq_puts(s, " /*"); =20 trace_seq_puts(s, " <-"); - seq_print_ip_sym(s, entry->graph_ent.retaddr, trace_flags | TRACE_ITER_SY= M_OFFSET); + seq_print_ip_sym(s, entry->graph_ent.retaddr, trace_flags | TRACE_ITER(SY= M_OFFSET)); =20 if (comment) trace_seq_puts(s, " */"); @@ -1044,7 +1044,7 @@ print_graph_prologue(struct trace_iterator *iter, str= uct trace_seq *s, /* Interrupt */ print_graph_irq(iter, addr, type, cpu, ent->pid, flags); =20 - if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) + if (!(tr->trace_flags & TRACE_ITER(CONTEXT_INFO))) return; =20 /* Absolute time */ @@ -1066,7 +1066,7 @@ print_graph_prologue(struct trace_iterator *iter, str= uct trace_seq *s, } =20 /* Latency format */ - if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) + if (tr->trace_flags & TRACE_ITER(LATENCY_FMT)) print_graph_lat_fmt(s, ent); =20 return; @@ -1485,7 +1485,7 @@ static void print_lat_header(struct seq_file *s, u32 = flags) static void __print_graph_headers_flags(struct trace_array *tr, struct seq_file *s, u32 flags) { - int lat =3D tr->trace_flags & TRACE_ITER_LATENCY_FMT; + int lat =3D tr->trace_flags & TRACE_ITER(LATENCY_FMT); =20 if (lat) print_lat_header(s, flags); @@ -1533,10 +1533,10 @@ void print_graph_headers_flags(struct seq_file *s, = u32 flags) struct trace_iterator *iter =3D s->private; struct trace_array *tr =3D iter->tr; =20 - if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) + if (!(tr->trace_flags & TRACE_ITER(CONTEXT_INFO))) return; =20 - if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) { + if (tr->trace_flags & TRACE_ITER(LATENCY_FMT)) { /* print nothing if the buffers are empty */ if (trace_empty(iter)) return; diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c index 5496758b6c76..6fdf6ee07ebc 100644 --- a/kernel/trace/trace_irqsoff.c +++ b/kernel/trace/trace_irqsoff.c @@ -63,7 +63,7 @@ irq_trace(void) =20 #ifdef CONFIG_FUNCTION_GRAPH_TRACER static int irqsoff_display_graph(struct trace_array *tr, int set); -# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER_DISPLAY_GRAPH) +# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER(DISPLAY_GRAPH)) #else static inline int irqsoff_display_graph(struct trace_array *tr, int set) { @@ -488,8 +488,8 @@ static int register_irqsoff_function(struct trace_array= *tr, int graph, int set) { int ret; =20 - /* 'set' is set if TRACE_ITER_FUNCTION is about to be set */ - if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER_FUNCTION)= )) + /* 'set' is set if TRACE_ITER(FUNCTION) is about to be set */ + if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER(FUNCTION)= ))) return 0; =20 if (graph) @@ -518,7 +518,7 @@ static void unregister_irqsoff_function(struct trace_ar= ray *tr, int graph) =20 static int irqsoff_function_set(struct trace_array *tr, u32 mask, int set) { - if (!(mask & TRACE_ITER_FUNCTION)) + if (!(mask & TRACE_ITER(FUNCTION))) return 0; =20 if (set) @@ -539,7 +539,7 @@ static inline int irqsoff_function_set(struct trace_arr= ay *tr, u32 mask, int set } #endif /* CONFIG_FUNCTION_TRACER */ =20 -static int irqsoff_flag_changed(struct trace_array *tr, u32 mask, int set) +static int irqsoff_flag_changed(struct trace_array *tr, u64 mask, int set) { struct tracer *tracer =3D tr->current_trace; =20 @@ -547,7 +547,7 @@ static int irqsoff_flag_changed(struct trace_array *tr,= u32 mask, int set) return 0; =20 #ifdef CONFIG_FUNCTION_GRAPH_TRACER - if (mask & TRACE_ITER_DISPLAY_GRAPH) + if (mask & TRACE_ITER(DISPLAY_GRAPH)) return irqsoff_display_graph(tr, set); #endif =20 @@ -585,10 +585,10 @@ static int __irqsoff_tracer_init(struct trace_array *= tr) save_flags =3D tr->trace_flags; =20 /* non overwrite screws up the latency tracers */ - set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1); - set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1); + set_tracer_flag(tr, TRACE_ITER(OVERWRITE), 1); + set_tracer_flag(tr, TRACE_ITER(LATENCY_FMT), 1); /* without pause, we will produce garbage if another latency occurs */ - set_tracer_flag(tr, TRACE_ITER_PAUSE_ON_TRACE, 1); + set_tracer_flag(tr, TRACE_ITER(PAUSE_ON_TRACE), 1); =20 tr->max_latency =3D 0; irqsoff_trace =3D tr; @@ -608,15 +608,15 @@ static int __irqsoff_tracer_init(struct trace_array *= tr) =20 static void __irqsoff_tracer_reset(struct trace_array *tr) { - int lat_flag =3D save_flags & TRACE_ITER_LATENCY_FMT; - int overwrite_flag =3D save_flags & TRACE_ITER_OVERWRITE; - int pause_flag =3D save_flags & TRACE_ITER_PAUSE_ON_TRACE; + int lat_flag =3D save_flags & TRACE_ITER(LATENCY_FMT); + int overwrite_flag =3D save_flags & TRACE_ITER(OVERWRITE); + int pause_flag =3D save_flags & TRACE_ITER(PAUSE_ON_TRACE); =20 stop_irqsoff_tracer(tr, is_graph(tr)); =20 - set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag); - set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag); - set_tracer_flag(tr, TRACE_ITER_PAUSE_ON_TRACE, pause_flag); + set_tracer_flag(tr, TRACE_ITER(LATENCY_FMT), lat_flag); + set_tracer_flag(tr, TRACE_ITER(OVERWRITE), overwrite_flag); + set_tracer_flag(tr, TRACE_ITER(PAUSE_ON_TRACE), pause_flag); ftrace_reset_array_ops(tr); =20 irqsoff_busy =3D false; diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c index 896ff78b8349..b30795f34079 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c @@ -31,7 +31,7 @@ static void ftrace_dump_buf(int skip_entries, long cpu_fi= le) old_userobj =3D tr->trace_flags; =20 /* don't look at user memory in panic mode */ - tr->trace_flags &=3D ~TRACE_ITER_SYM_USEROBJ; + tr->trace_flags &=3D ~TRACE_ITER(SYM_USEROBJ); =20 kdb_printf("Dumping ftrace buffer:\n"); if (skip_entries) diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index ccae62d4fb91..2871e42180da 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -1582,7 +1582,7 @@ print_kprobe_event(struct trace_iterator *iter, int f= lags, =20 trace_seq_printf(s, "%s: (", trace_probe_name(tp)); =20 - if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_putc(s, ')'); @@ -1612,12 +1612,12 @@ print_kretprobe_event(struct trace_iterator *iter, = int flags, =20 trace_seq_printf(s, "%s: (", trace_probe_name(tp)); =20 - if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_puts(s, " <- "); =20 - if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET)) + if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER(SYM_OFFSET))) goto out; =20 trace_seq_putc(s, ')'); diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 97db0b0ccf3e..a2403d8f7c39 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -420,7 +420,7 @@ static int seq_print_user_ip(struct trace_seq *s, struc= t mm_struct *mm, } mmap_read_unlock(mm); } - if (ret && ((sym_flags & TRACE_ITER_SYM_ADDR) || !file)) + if (ret && ((sym_flags & TRACE_ITER(SYM_ADDR)) || !file)) trace_seq_printf(s, " <" IP_FMT ">", ip); return !trace_seq_has_overflowed(s); } @@ -433,9 +433,9 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip,= unsigned long sym_flags) goto out; } =20 - trace_seq_print_sym(s, ip, sym_flags & TRACE_ITER_SYM_OFFSET); + trace_seq_print_sym(s, ip, sym_flags & TRACE_ITER(SYM_OFFSET)); =20 - if (sym_flags & TRACE_ITER_SYM_ADDR) + if (sym_flags & TRACE_ITER(SYM_ADDR)) trace_seq_printf(s, " <" IP_FMT ">", ip); =20 out: @@ -569,7 +569,7 @@ static int lat_print_timestamp(struct trace_iterator *iter, u64 next_ts) { struct trace_array *tr =3D iter->tr; - unsigned long verbose =3D tr->trace_flags & TRACE_ITER_VERBOSE; + unsigned long verbose =3D tr->trace_flags & TRACE_ITER(VERBOSE); unsigned long in_ns =3D iter->iter_flags & TRACE_FILE_TIME_IN_NS; unsigned long long abs_ts =3D iter->ts - iter->array_buffer->time_start; unsigned long long rel_ts =3D next_ts - iter->ts; @@ -636,7 +636,7 @@ int trace_print_context(struct trace_iterator *iter) =20 trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid); =20 - if (tr->trace_flags & TRACE_ITER_RECORD_TGID) { + if (tr->trace_flags & TRACE_ITER(RECORD_TGID)) { unsigned int tgid =3D trace_find_tgid(entry->pid); =20 if (!tgid) @@ -647,7 +647,7 @@ int trace_print_context(struct trace_iterator *iter) =20 trace_seq_printf(s, "[%03d] ", iter->cpu); =20 - if (tr->trace_flags & TRACE_ITER_IRQ_INFO) + if (tr->trace_flags & TRACE_ITER(IRQ_INFO)) trace_print_lat_fmt(s, entry); =20 trace_print_time(s, iter, iter->ts); @@ -661,7 +661,7 @@ int trace_print_lat_context(struct trace_iterator *iter) struct trace_entry *entry, *next_entry; struct trace_array *tr =3D iter->tr; struct trace_seq *s =3D &iter->seq; - unsigned long verbose =3D (tr->trace_flags & TRACE_ITER_VERBOSE); + unsigned long verbose =3D (tr->trace_flags & TRACE_ITER(VERBOSE)); u64 next_ts; =20 next_entry =3D trace_find_next_entry(iter, NULL, &next_ts); @@ -1127,7 +1127,7 @@ static void print_fn_trace(struct trace_seq *s, unsig= ned long ip, if (args) print_function_args(s, args, ip); =20 - if ((flags & TRACE_ITER_PRINT_PARENT) && parent_ip) { + if ((flags & TRACE_ITER(PRINT_PARENT)) && parent_ip) { trace_seq_puts(s, " <-"); seq_print_ip_sym(s, parent_ip, flags); } @@ -1417,7 +1417,7 @@ static enum print_line_t trace_user_stack_print(struc= t trace_iterator *iter, =20 trace_seq_puts(s, "\n"); =20 - if (tr->trace_flags & TRACE_ITER_SYM_USEROBJ) { + if (tr->trace_flags & TRACE_ITER(SYM_USEROBJ)) { struct task_struct *task; /* * we do the lookup on the thread group leader, diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_w= akeup.c index bf1cb80742ae..9f5faee1f39c 100644 --- a/kernel/trace/trace_sched_wakeup.c +++ b/kernel/trace/trace_sched_wakeup.c @@ -41,7 +41,7 @@ static void stop_func_tracer(struct trace_array *tr, int = graph); static int save_flags; =20 #ifdef CONFIG_FUNCTION_GRAPH_TRACER -# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER_DISPLAY_GRAPH) +# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER(DISPLAY_GRAPH)) #else # define is_graph(tr) false #endif @@ -251,8 +251,8 @@ static int register_wakeup_function(struct trace_array = *tr, int graph, int set) { int ret; =20 - /* 'set' is set if TRACE_ITER_FUNCTION is about to be set */ - if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER_FUNCTION)= )) + /* 'set' is set if TRACE_ITER(FUNCTION) is about to be set */ + if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER(FUNCTION)= ))) return 0; =20 if (graph) @@ -281,7 +281,7 @@ static void unregister_wakeup_function(struct trace_arr= ay *tr, int graph) =20 static int wakeup_function_set(struct trace_array *tr, u32 mask, int set) { - if (!(mask & TRACE_ITER_FUNCTION)) + if (!(mask & TRACE_ITER(FUNCTION))) return 0; =20 if (set) @@ -328,7 +328,7 @@ __trace_function(struct trace_array *tr, trace_function(tr, ip, parent_ip, trace_ctx, NULL); } =20 -static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set) +static int wakeup_flag_changed(struct trace_array *tr, u64 mask, int set) { struct tracer *tracer =3D tr->current_trace; =20 @@ -336,7 +336,7 @@ static int wakeup_flag_changed(struct trace_array *tr, = u32 mask, int set) return 0; =20 #ifdef CONFIG_FUNCTION_GRAPH_TRACER - if (mask & TRACE_ITER_DISPLAY_GRAPH) + if (mask & TRACE_ITER(DISPLAY_GRAPH)) return wakeup_display_graph(tr, set); #endif =20 @@ -685,8 +685,8 @@ static int __wakeup_tracer_init(struct trace_array *tr) save_flags =3D tr->trace_flags; =20 /* non overwrite screws up the latency tracers */ - set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1); - set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1); + set_tracer_flag(tr, TRACE_ITER(OVERWRITE), 1); + set_tracer_flag(tr, TRACE_ITER(LATENCY_FMT), 1); =20 tr->max_latency =3D 0; wakeup_trace =3D tr; @@ -729,15 +729,15 @@ static int wakeup_dl_tracer_init(struct trace_array *= tr) =20 static void wakeup_tracer_reset(struct trace_array *tr) { - int lat_flag =3D save_flags & TRACE_ITER_LATENCY_FMT; - int overwrite_flag =3D save_flags & TRACE_ITER_OVERWRITE; + int lat_flag =3D save_flags & TRACE_ITER(LATENCY_FMT); + int overwrite_flag =3D save_flags & TRACE_ITER(OVERWRITE); =20 stop_wakeup_tracer(tr); /* make sure we put back any tasks we are tracing */ wakeup_reset(tr); =20 - set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag); - set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag); + set_tracer_flag(tr, TRACE_ITER(LATENCY_FMT), lat_flag); + set_tracer_flag(tr, TRACE_ITER(OVERWRITE), overwrite_flag); ftrace_reset_array_ops(tr); wakeup_busy =3D false; } diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 46aab0ab9350..332df9a7c388 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -154,7 +154,7 @@ print_syscall_enter(struct trace_iterator *iter, int fl= ags, goto end; =20 /* parameter types */ - if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) + if (tr && tr->trace_flags & TRACE_ITER(VERBOSE)) trace_seq_printf(s, "%s ", entry->types[i]); =20 /* parameter values */ From nobody Sat Feb 7 08:42:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBB6734B1B9; Wed, 22 Oct 2025 15:38:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761147496; cv=none; b=dOxEOFpfT8tu6Yt5X7DkHppYXG36gW2daHAWn2EByoja22FoJ0z5Un5ozMxphFuRObjAy/D74q5w5yaoCY/PD+w/RWTw0SdyuGd2QNqmKFTgNr+YjS29j+iy7MyqtCZ8rd5Cmr8ciV4Lb0oteGz0ZnQ/5RSFKC5OwEtjqzWRmEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761147496; c=relaxed/simple; bh=5j3VT4KbSbX3c/BR4MZ9uVywTdekrN/AOdAmM6O2aew=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DzvMnBfGrue3f8Zvv6HP4te6jkEPChXva0tIwU2QKYkkPQl6DGfbfqtW6ba0+3wwvswEHvcOSKG7RgcZqJllVqpbhSXOv0jCfebxYzM7miTUKwTawo34yEWQdt9CV3wKcL6ZSw9vwOvOrtb/XbsCh/zBbTMC5PpdmypnuDEmRew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vMg9BSYN; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vMg9BSYN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D29D6C4CEF5; Wed, 22 Oct 2025 15:38:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761147495; bh=5j3VT4KbSbX3c/BR4MZ9uVywTdekrN/AOdAmM6O2aew=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vMg9BSYN2/xNd1NB2O35nlZOiUKGC3V0NTHE0nJggna/uwMALGS+GIFJFYzMX0xX4 YgBgoGjasV9BRmYoSblhaP0lsP97EKl0qYulUw94Quy+x9ikm9M79ICmFf08ZHwg+r U2ITffkpWaVNVSmDQXufTSuTWqqW6gEcz3UjppVhe/O8l42OvpHRg50OUN4c5ASZt0 kzV+ZaNXOzmg4L2s+OaDKEctAvtSqLNDYbrX7R6WVINUvNkp1r2XR38foPckR70lxN InYJh+zAqY2Tl9M03YIEAzhH1b2zi2+/B+iDyE2ysrxVch9fxlaDx5DvAn4wPSxaQd ixfBBk3euuvxQ== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v5 2/2] tracing: Add an option to show symbols in _text+offset for function profiler Date: Thu, 23 Oct 2025 00:38:11 +0900 Message-ID: <176114749146.315239.7968358300215825393.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <176114747153.315239.6863821259073466010.stgit@devnote2> References: <176114747153.315239.6863821259073466010.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Function profiler shows the hit count of each function using its symbol name. However, there are some same-name local symbols, which we can not distinguish. To solve this issue, this introduces an option to show the symbols in "_text+OFFSET" format. This can avoid exposing the random shift of KASLR. The functions in modules are shown as "MODNAME+OFFSET" where the offset is from ".text". E.g. for the kernel text symbols, specify vmlinux and the output to addr2line, you can find the actual function and source info; $ addr2line -fie vmlinux _text+3078208 __balance_callbacks kernel/sched/core.c:5064 for modules, specify the module file and .text+OFFSET; $ addr2line -fie samples/trace_events/trace-events-sample.ko .text+8224 do_simple_thread_func samples/trace_events/trace-events-sample.c:23 Suggested-by: Steven Rostedt (Google) Signed-off-by: Masami Hiramatsu (Google) --- Changes in v5: - Update dummy flag according to new macros. Changes in v2: - Define a dummy TRACE_ITER_PROF_TEXT_OFFSET if CONFIG_FUNCTION_PROFILER= =3Dn. --- kernel/trace/ftrace.c | 26 +++++++++++++++++++++++++- kernel/trace/trace.c | 5 +++-- kernel/trace/trace.h | 11 ++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 00b76d450a89..a9ea2795506a 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -534,7 +534,9 @@ static int function_stat_headers(struct seq_file *m) =20 static int function_stat_show(struct seq_file *m, void *v) { + struct trace_array *tr =3D trace_get_global_array(); struct ftrace_profile *rec =3D v; + const char *refsymbol =3D NULL; char str[KSYM_SYMBOL_LEN]; #ifdef CONFIG_FUNCTION_GRAPH_TRACER static struct trace_seq s; @@ -554,7 +556,29 @@ static int function_stat_show(struct seq_file *m, void= *v) return 0; #endif =20 - kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); + if (tr->trace_flags & TRACE_ITER(PROF_TEXT_OFFSET)) { + long offset; + + if (core_kernel_text(rec->ip)) { + refsymbol =3D "_text"; + offset =3D rec->ip - (unsigned long)_text; + } else { + struct module *mod; + + guard(rcu)(); + mod =3D __module_text_address(rec->ip); + if (mod) { + refsymbol =3D mod->name; + /* Calculate offset from module's text entry address. */ + offset =3D rec->ip - (unsigned long)mod->mem[MOD_TEXT].base; + } + } + if (refsymbol) + snprintf(str, sizeof(str), " %s%+ld", refsymbol, offset); + } + if (!refsymbol) + kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); + seq_printf(m, " %-30.30s %10lu", str, rec->counter); =20 #ifdef CONFIG_FUNCTION_GRAPH_TRACER diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index bc7d56e8b920..08b9abc90182 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -522,7 +522,8 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_export); =20 /* trace_options that are only supported by global_trace */ #define TOP_LEVEL_TRACE_FLAGS (TRACE_ITER(PRINTK) | \ - TRACE_ITER(PRINTK_MSGONLY) | TRACE_ITER(RECORD_CMD)) + TRACE_ITER(PRINTK_MSGONLY) | TRACE_ITER(RECORD_CMD) | \ + TRACE_ITER(PROF_TEXT_OFFSET)) =20 /* trace_flags that are default zero for instances */ #define ZEROED_TRACE_FLAGS \ @@ -11106,7 +11107,7 @@ __init static int tracer_alloc_buffers(void) =20 #ifdef CONFIG_FUNCTION_TRACER /* Used to set module cached ftrace filtering at boot up */ -__init struct trace_array *trace_get_global_array(void) +struct trace_array *trace_get_global_array(void) { return &global_trace; } diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 50b4c06e37f0..49992026801d 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1353,6 +1353,14 @@ extern int trace_get_user(struct trace_parser *parse= r, const char __user *ubuf, # define STACK_FLAGS #endif =20 +#ifdef CONFIG_FUNCTION_PROFILER +# define PROFILER_FLAGS \ + C(PROF_TEXT_OFFSET, "prof-text-offset"), +#else +# define PROFILER_FLAGS +# define TRACE_ITER_PROF_TEXT_OFFSET_BIT -1 +#endif + /* * trace_iterator_flags is an enumeration that defines bit * positions into trace_flags that controls the output. @@ -1391,7 +1399,8 @@ extern int trace_get_user(struct trace_parser *parser= , const char __user *ubuf, FUNCTION_FLAGS \ FGRAPH_FLAGS \ STACK_FLAGS \ - BRANCH_FLAGS + BRANCH_FLAGS \ + PROFILER_FLAGS =20 /* * By defining C, we can make TRACE_FLAGS a list of bit names