From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93DD0ECAAD5 for ; Sun, 4 Sep 2022 04:12:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231550AbiIDEMg (ORCPT ); Sun, 4 Sep 2022 00:12:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229687AbiIDEM3 (ORCPT ); Sun, 4 Sep 2022 00:12:29 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE6994AD58 for ; Sat, 3 Sep 2022 21:12:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 34FDBCE0AD5 for ; Sun, 4 Sep 2022 04:12:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C7D4C433D6; Sun, 4 Sep 2022 04:12:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264744; bh=6h0q3HLOupjIluOvt0WI/JeaJ5DW/jOkFgt32sgYqnQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H0kO4P5TT9M5mNvpGzXPq0MCEHF17YwCSFMnNrqbnvw+MLrxPzhNKLtIpLKVWXAiG v3DMvlczv2mFxnG/X6nnLfbp/zbtzpIUrve2ovXra2DAZzJeiO0gllBxGdD53IgQHy CUn5a+paP/+QCwBPJcdx4oJTryQhRa63NwF2Sv8TO6kIuQqQ8J+Wxs6Wj2GJ2Q4T3H jArrreGWNcIxhPy3vcJtWkbHWA9fnMWCgD2b/oOExJg2Zb4xjQYjZ1NwlbNk4i94Y2 iuLqHlW4jH1fEwK4Dk+ymjUO0K6Wvjrk8Zf3jbZPdRsQbDPzl0wpXdO+kn84fgkyqC KomlgA9r2e51g== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 1/6] tracing: Allow multiple hitcount values in histograms Date: Sun, 4 Sep 2022 13:12:20 +0900 Message-Id: <166226474055.223837.13947085068863989044.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tom Zanussi The hitcount is treated specially in the histograms - since it's always expected to be there regardless of whether the user specified anything or not, it's always added as the first histogram value. Currently the code doesn't allow it to be added more than once as a value, which is inconsistent with all the other possible values. It would seem to be a pointless thing to want to do, but other features being added such as percent and graph modifiers don't work properly with the current hitcount restrictions. Fix this by allowing multiple hitcounts to be added. Signed-off-by: Tom Zanussi Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi --- Changes in v4: - Initialize n_hitcount. --- kernel/trace/trace_events_hist.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index 92fbd72b6408..e80a41e380bb 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -1356,6 +1356,8 @@ static const char *hist_field_name(struct hist_field = *field, field_name =3D field->name; } else if (field->flags & HIST_FIELD_FL_TIMESTAMP) field_name =3D "common_timestamp"; + else if (field->flags & HIST_FIELD_FL_HITCOUNT) + field_name =3D "hitcount"; =20 if (field_name =3D=3D NULL) field_name =3D ""; @@ -2328,6 +2330,8 @@ parse_field(struct hist_trigger_data *hist_data, stru= ct trace_event_file *file, hist_data->attrs->ts_in_usecs =3D true; } else if (strcmp(field_name, "common_cpu") =3D=3D 0) *flags |=3D HIST_FIELD_FL_CPU; + else if (strcmp(field_name, "hitcount") =3D=3D 0) + *flags |=3D HIST_FIELD_FL_HITCOUNT; else { field =3D trace_find_event_field(file->event_call, field_name); if (!field || !field->size) { @@ -4328,8 +4332,8 @@ static int create_var_field(struct hist_trigger_data = *hist_data, static int create_val_fields(struct hist_trigger_data *hist_data, struct trace_event_file *file) { + unsigned int i, j =3D 1, n_hitcount =3D 0; char *fields_str, *field_str; - unsigned int i, j =3D 1; int ret; =20 ret =3D create_hitcount_val(hist_data); @@ -4346,8 +4350,10 @@ static int create_val_fields(struct hist_trigger_dat= a *hist_data, if (!field_str) break; =20 - if (strcmp(field_str, "hitcount") =3D=3D 0) - continue; + if (strcmp(field_str, "hitcount") =3D=3D 0) { + if (!n_hitcount++) + continue; + } =20 ret =3D create_val_field(hist_data, j++, file, field_str); if (ret) From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D70B6ECAAD3 for ; Sun, 4 Sep 2022 04:12:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229564AbiIDEMr (ORCPT ); Sun, 4 Sep 2022 00:12:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230320AbiIDEMh (ORCPT ); Sun, 4 Sep 2022 00:12:37 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8846A4AD5C for ; Sat, 3 Sep 2022 21:12:36 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 148FFB80C9E for ; Sun, 4 Sep 2022 04:12:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 889B9C433D6; Sun, 4 Sep 2022 04:12:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264753; bh=tu/uBFTcTkD8ciezaLIOud2OqZdulEjwj2vtD/px5uc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h3krUUwZyDHVYmtOAfdpwCbD3cNTV7riPHLvp+r5I/xkefZHN5pr/kebn6G7QHhCV xgvlp7TTcQ8G+wAk48cFInW/bzYJNPFjZi7ksEr+afZQIzLmsSRjnHhpsQOrjQ27PS SbotkMUUImvErJmgpf0ogxvq7BMk7TErbkA9sbM1vFTXTjolIkXHuiCpf4MJ+etlfG HbiqICGUfaciYjo+8+RFL5nzEEU8Gp2tRTeSCqTmgXU//EnFVAXJ6EkbelyzE0Vp5J H2TNwpbU+EBE+AQODjpb3YGU+J/AIG8FwUDpfB92rUHq0Z5biN0CBDySQa5qIGXYzJ lhYTGOyYqTArQ== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 2/6] tracing: Fix to check event_mutex is held while accessing trigger list Date: Sun, 4 Sep 2022 13:12:29 +0900 Message-Id: <166226474977.223837.1992182913048377113.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu (Google) Since the check_user_trigger() is called outside of RCU read lock, this list_for_each_entry_rcu() caused a suspicious RCU usage warning. # echo hist:keys=3Dpid > events/sched/sched_stat_runtime/trigger # cat events/sched/sched_stat_runtime/trigger [ 43.167032] [ 43.167418] =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D [ 43.167992] WARNING: suspicious RCU usage [ 43.168567] 5.19.0-rc5-00029-g19ebe4651abf #59 Not tainted [ 43.169283] ----------------------------- [ 43.169863] kernel/trace/trace_events_trigger.c:145 RCU-list traversed i= n non-reader section!! ... However, this file->triggers list is safe when it is accessed under event_mutex is held. To fix this warning, adds a lockdep_is_held check to the list_for_each_entry_rcu(). Fixes: 7491e2c44278 ("tracing: Add a probe that attaches to trace events") Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi --- kernel/trace/trace_events_trigger.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_event= s_trigger.c index cb866c3141af..918730d74932 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -142,7 +142,8 @@ static bool check_user_trigger(struct trace_event_file = *file) { struct event_trigger_data *data; =20 - list_for_each_entry_rcu(data, &file->triggers, list) { + list_for_each_entry_rcu(data, &file->triggers, list, + lockdep_is_held(&event_mutex)) { if (data->flags & EVENT_TRIGGER_FL_PROBE) continue; return true; From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B83B5ECAAD5 for ; Sun, 4 Sep 2022 04:12:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229680AbiIDEMu (ORCPT ); Sun, 4 Sep 2022 00:12:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37806 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232014AbiIDEMp (ORCPT ); Sun, 4 Sep 2022 00:12:45 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 03B6F4AD79 for ; Sat, 3 Sep 2022 21:12:44 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 8D59A60EA6 for ; Sun, 4 Sep 2022 04:12:43 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0E58C433C1; Sun, 4 Sep 2022 04:12:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264763; bh=XSHUEMROafhiwqOPJ9+GeA4iG5g0bTInya8CRzegI70=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cxGZFfW7k/44SOg2qWmowee+Xa1UsJagZfs45Vd6W0HcshDn6Puj7mwfaw6IUOPS4 7meoWbCvfRUaZ45BlyZO+ck8xMJz83iNG7psZBPYF+VWm57BUoYwHjvvqkwWi8YY5R mAxpKObTUufVIM7JjBcJEF8NI1ci9WyczDyfBcUX9D4PwWFo3Q90mpPZyEi8AeEOCq tIN5Ysp+DYfNOK002nqJviGU6/qNAe2oNCGvm5JPnSVHlxCIWnmh4Md/qRcIbhLq3U Mfi7mSp3u1aAsxEhvNP+rGGhlkTz3MfM4QrEarn3lVwk5Os/8yz/gdWhLXeez8xvdj fZpiBFKgkjk/g== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 3/6] tracing: Add .percent suffix option to histogram values Date: Sun, 4 Sep 2022 13:12:39 +0900 Message-Id: <166226475913.223837.6289430121343122141.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu (Google) Add .percent suffix option to show the histogram values in percentage. This feature is useful when we need yo undersntand the overall trend for the histograms of large values. E.g. this shows the runtime percentage for each tasks. Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi ------ # cd /sys/kernel/debug/tracing/ # echo hist:keys=3Dpid:vals=3Dhitcount,runtime.percent:sort=3Dpid > \ events/sched/sched_stat_runtime/trigger # sleep 10 # cat events/sched/sched_stat_runtime/hist # event histogram # # trigger info: hist:keys=3Dpid:vals=3Dhitcount,runtime.percent:sort=3Dpid= :size=3D2048 [active] # { pid: 8 } hitcount: 7 runtime (%): 4.14 { pid: 14 } hitcount: 5 runtime (%): 3.69 { pid: 16 } hitcount: 11 runtime (%): 3.41 { pid: 61 } hitcount: 41 runtime (%): 19.75 { pid: 65 } hitcount: 4 runtime (%): 1.48 { pid: 70 } hitcount: 6 runtime (%): 3.60 { pid: 72 } hitcount: 2 runtime (%): 1.10 { pid: 144 } hitcount: 10 runtime (%): 32.01 { pid: 151 } hitcount: 8 runtime (%): 22.66 { pid: 152 } hitcount: 2 runtime (%): 8.10 Totals: Hits: 96 Entries: 10 Dropped: 0 ----- Signed-off-by: Masami Hiramatsu (Google) --- Changes in v5: - Show raw hitcount value always even if hitcount.percent is specified. Changes in v4: - Port on the Tom's hitcount patch. Changes in v3: - Show "(%)" in the field name. - Return div0 error only if the value is not zero. - Simplify the print code with hist_trigger_print_val(). - Show hitcount percentage correctly. Changes in v2: - Use div64_*(). - Show an error when failing to calculate the percentage. --- kernel/trace/trace.c | 3 + kernel/trace/trace_events_hist.c | 90 ++++++++++++++++++++++++++++++++--= ---- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d3005279165d..5e5efc550ac4 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5700,7 +5700,8 @@ static const char readme_msg[] =3D "\t .syscall display a syscall id as a syscall name\n" "\t .log2 display log2 value rather than raw number\n" "\t .buckets=3Dsize display values in groups of size rather t= han raw number\n" - "\t .usecs display a common_timestamp in microseconds\n\n" + "\t .usecs display a common_timestamp in microseconds\n" + "\t .percent display a number of percentage value\n\n" "\t The 'pause' parameter can be used to pause an existing hist\n" "\t trigger or to start a hist trigger but not log any events\n" "\t until told to do so. 'continue' can be used to start or\n" diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index e80a41e380bb..053b23e10c48 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -506,6 +506,7 @@ enum hist_field_flags { HIST_FIELD_FL_ALIAS =3D 1 << 16, HIST_FIELD_FL_BUCKET =3D 1 << 17, HIST_FIELD_FL_CONST =3D 1 << 18, + HIST_FIELD_FL_PERCENT =3D 1 << 19, }; =20 struct var_defs { @@ -1707,6 +1708,8 @@ static const char *get_hist_field_flags(struct hist_f= ield *hist_field) flags_str =3D "buckets"; else if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP_USECS) flags_str =3D "usecs"; + else if (hist_field->flags & HIST_FIELD_FL_PERCENT) + flags_str =3D "percent"; =20 return flags_str; } @@ -2315,6 +2318,10 @@ parse_field(struct hist_trigger_data *hist_data, str= uct trace_event_file *file, if (ret || !(*buckets)) goto error; *flags |=3D HIST_FIELD_FL_BUCKET; + } else if (strncmp(modifier, "percent", 7) =3D=3D 0) { + if (*flags & (HIST_FIELD_FL_VAR | HIST_FIELD_FL_KEY)) + goto error; + *flags |=3D HIST_FIELD_FL_PERCENT; } else { error: hist_err(tr, HIST_ERR_BAD_FIELD_MODIFIER, errpos(modifier)); @@ -5288,33 +5295,69 @@ static void hist_trigger_print_key(struct seq_file = *m, seq_puts(m, "}"); } =20 +/* Get the 100 times of the percentage of @val in @total */ +static inline unsigned int __get_percentage(u64 val, u64 total) +{ + if (!total) + goto div0; + + if (val < (U64_MAX / 10000)) + return (unsigned int)div64_ul(val * 10000, total); + + total =3D div64_u64(total, 10000); + if (!total) + goto div0; + + return (unsigned int)div64_ul(val, total); +div0: + return val ? UINT_MAX : 0; +} + +static void hist_trigger_print_val(struct seq_file *m, unsigned int idx, + const char *field_name, unsigned long flags, + u64 *totals, struct tracing_map_elt *elt) +{ + u64 val =3D tracing_map_read_sum(elt, idx); + unsigned int pc; + + if (flags & HIST_FIELD_FL_PERCENT) { + pc =3D __get_percentage(val, totals[idx]); + if (pc =3D=3D UINT_MAX) + seq_printf(m, " %s (%%):[ERROR]", field_name); + else + seq_printf(m, " %s (%%): %3u.%02u", field_name, + pc / 100, pc % 100); + } else if (flags & HIST_FIELD_FL_HEX) { + seq_printf(m, " %s: %10llx", field_name, val); + } else { + seq_printf(m, " %s: %10llu", field_name, val); + } +} + static void hist_trigger_entry_print(struct seq_file *m, struct hist_trigger_data *hist_data, + u64 *totals, void *key, struct tracing_map_elt *elt) { const char *field_name; - unsigned int i; + unsigned int i =3D HITCOUNT_IDX; + unsigned long flags; =20 hist_trigger_print_key(m, hist_data, key, elt); =20 - seq_printf(m, " hitcount: %10llu", - tracing_map_read_sum(elt, HITCOUNT_IDX)); + /* At first, show the raw hitcount always */ + hist_trigger_print_val(m, i, "hitcount", 0, totals, elt); =20 for (i =3D 1; i < hist_data->n_vals; i++) { field_name =3D hist_field_name(hist_data->fields[i], 0); + flags =3D hist_data->fields[i]->flags; =20 - if (hist_data->fields[i]->flags & HIST_FIELD_FL_VAR || - hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR) + if (flags & HIST_FIELD_FL_VAR || flags & HIST_FIELD_FL_EXPR) continue; =20 - if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { - seq_printf(m, " %s: %10llx", field_name, - tracing_map_read_sum(elt, i)); - } else { - seq_printf(m, " %s: %10llu", field_name, - tracing_map_read_sum(elt, i)); - } + seq_puts(m, " "); + hist_trigger_print_val(m, i, field_name, flags, totals, elt); } =20 print_actions(m, hist_data, elt); @@ -5327,7 +5370,8 @@ static int print_entries(struct seq_file *m, { struct tracing_map_sort_entry **sort_entries =3D NULL; struct tracing_map *map =3D hist_data->map; - int i, n_entries; + int i, j, n_entries; + u64 *totals =3D NULL; =20 n_entries =3D tracing_map_sort_entries(map, hist_data->sort_keys, hist_data->n_sort_keys, @@ -5335,11 +5379,29 @@ static int print_entries(struct seq_file *m, if (n_entries < 0) return n_entries; =20 + for (j =3D 0; j < hist_data->n_vals; j++) { + if (!(hist_data->fields[j]->flags & HIST_FIELD_FL_PERCENT)) + continue; + if (!totals) { + totals =3D kcalloc(hist_data->n_vals, sizeof(u64), + GFP_KERNEL); + if (!totals) { + n_entries =3D -ENOMEM; + goto out; + } + } + for (i =3D 0; i < n_entries; i++) + totals[j] +=3D tracing_map_read_sum( + sort_entries[i]->elt, j); + } + for (i =3D 0; i < n_entries; i++) - hist_trigger_entry_print(m, hist_data, + hist_trigger_entry_print(m, hist_data, totals, sort_entries[i]->key, sort_entries[i]->elt); =20 + kfree(totals); +out: tracing_map_destroy_sort_entries(sort_entries, n_entries); =20 return n_entries; From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 943CDECAAD5 for ; Sun, 4 Sep 2022 04:13:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232993AbiIDENK (ORCPT ); Sun, 4 Sep 2022 00:13:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232231AbiIDEM4 (ORCPT ); Sun, 4 Sep 2022 00:12:56 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAE6A4AD7F for ; Sat, 3 Sep 2022 21:12:54 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 7D172B80C0A for ; Sun, 4 Sep 2022 04:12:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 08636C433C1; Sun, 4 Sep 2022 04:12:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264772; bh=K/d3vX51mEexmpqHtP3wbEBKnlZkDTKnEblnfizmPOc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KMelVFPK5C2kIcMfaWGhzhyPjw8dmEQsIaH9RETG253AsAybLThN6Kk/8oZTnOdpH ISoznEALqlwumzwDSdtNXCjgNbGoLOIa0NC0ACcUcauSy3iH50pYj7QmnqpjYYnPgE 5Xm1b8HlmaiAvWGMlecJSHIEg8wf0DD0SNnFhvKWp6opTJrN8by8mxNKanxCbFM0Jd q80S2foQBeN2aAgoZFAVhWYxiWTPeGU0JkAqsikvjTrLfr5vZZHwGZd0uCzSzeIvZQ M2I8uoMfsfJCjwrt34M1U94F9WgWgcihcADSuJoCuVpE8jjmy4hYgGq/hmD2Ag8JCN /kNEZ1/L0ilcg== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 4/6] tracing: Add .graph suffix option to histogram value Date: Sun, 4 Sep 2022 13:12:48 +0900 Message-Id: <166226476841.223837.17477492032466945922.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu (Google) Add the .graph suffix which shows the bar graph of the histogram value. For example, the below example shows that the bar graph of the histogram of the runtime for each tasks. Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi ------ # cd /sys/kernel/debug/tracing/ # echo hist:keys=3Dpid:vals=3Druntime.graph:sort=3Dpid > \ events/sched/sched_stat_runtime/trigger # sleep 10 # cat events/sched/sched_stat_runtime/hist # event histogram # # trigger info: hist:keys=3Dpid:vals=3Dhitcount,runtime.graph:sort=3Dpid:s= ize=3D2048 [active] # { pid: 14 } hitcount: 2 runtime: { pid: 16 } hitcount: 8 runtime: { pid: 26 } hitcount: 1 runtime: { pid: 57 } hitcount: 3 runtime: { pid: 61 } hitcount: 20 runtime: ### { pid: 66 } hitcount: 2 runtime: { pid: 70 } hitcount: 3 runtime: { pid: 72 } hitcount: 2 runtime: { pid: 145 } hitcount: 14 runtime: #################### { pid: 152 } hitcount: 5 runtime: ####### { pid: 153 } hitcount: 2 runtime: #### Totals: Hits: 62 Entries: 11 Dropped: 0 ------- Signed-off-by: Masami Hiramatsu (Google) --- Changes in v5: - Show raw hitcount value always even if hitcount.graph is specified. - Update README file Changes in v3: - Show hitcount.graph in trigger info correctly. - Show both hitcount.percent and hitcount.graph on the same histogram. Changes in v2: - Show an error when failing to calculate the percentage. --- kernel/trace/trace.c | 3 + kernel/trace/trace_events_hist.c | 77 ++++++++++++++++++++++++++++++----= ---- 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 5e5efc550ac4..aec092b4ed3e 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5701,7 +5701,8 @@ static const char readme_msg[] =3D "\t .log2 display log2 value rather than raw number\n" "\t .buckets=3Dsize display values in groups of size rather t= han raw number\n" "\t .usecs display a common_timestamp in microseconds\n" - "\t .percent display a number of percentage value\n\n" + "\t .percent display a number of percentage value\n" + "\t .graph display a bar-graph of a value\n\n" "\t The 'pause' parameter can be used to pause an existing hist\n" "\t trigger or to start a hist trigger but not log any events\n" "\t until told to do so. 'continue' can be used to start or\n" diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index 053b23e10c48..753da682d404 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -507,6 +507,7 @@ enum hist_field_flags { HIST_FIELD_FL_BUCKET =3D 1 << 17, HIST_FIELD_FL_CONST =3D 1 << 18, HIST_FIELD_FL_PERCENT =3D 1 << 19, + HIST_FIELD_FL_GRAPH =3D 1 << 20, }; =20 struct var_defs { @@ -1710,6 +1711,8 @@ static const char *get_hist_field_flags(struct hist_f= ield *hist_field) flags_str =3D "usecs"; else if (hist_field->flags & HIST_FIELD_FL_PERCENT) flags_str =3D "percent"; + else if (hist_field->flags & HIST_FIELD_FL_GRAPH) + flags_str =3D "graph"; =20 return flags_str; } @@ -2322,6 +2325,10 @@ parse_field(struct hist_trigger_data *hist_data, str= uct trace_event_file *file, if (*flags & (HIST_FIELD_FL_VAR | HIST_FIELD_FL_KEY)) goto error; *flags |=3D HIST_FIELD_FL_PERCENT; + } else if (strncmp(modifier, "graph", 5) =3D=3D 0) { + if (*flags & (HIST_FIELD_FL_VAR | HIST_FIELD_FL_KEY)) + goto error; + *flags |=3D HIST_FIELD_FL_GRAPH; } else { error: hist_err(tr, HIST_ERR_BAD_FIELD_MODIFIER, errpos(modifier)); @@ -5313,20 +5320,52 @@ static inline unsigned int __get_percentage(u64 val= , u64 total) return val ? UINT_MAX : 0; } =20 +#define BAR_CHAR '#' + +static inline const char *__fill_bar_str(char *buf, int size, u64 val, u64= max) +{ + unsigned int len =3D __get_percentage(val, max); + int i; + + if (len =3D=3D UINT_MAX) { + snprintf(buf, size, "[ERROR]"); + return buf; + } + + len =3D len * size / 10000; + for (i =3D 0; i < len && i < size; i++) + buf[i] =3D BAR_CHAR; + while (i < size) + buf[i++] =3D ' '; + buf[size] =3D '\0'; + + return buf; +} + +struct hist_val_stat { + u64 max; + u64 total; +}; + static void hist_trigger_print_val(struct seq_file *m, unsigned int idx, const char *field_name, unsigned long flags, - u64 *totals, struct tracing_map_elt *elt) + struct hist_val_stat *stats, + struct tracing_map_elt *elt) { u64 val =3D tracing_map_read_sum(elt, idx); unsigned int pc; + char bar[21]; =20 if (flags & HIST_FIELD_FL_PERCENT) { - pc =3D __get_percentage(val, totals[idx]); + pc =3D __get_percentage(val, stats[idx].total); if (pc =3D=3D UINT_MAX) seq_printf(m, " %s (%%):[ERROR]", field_name); else seq_printf(m, " %s (%%): %3u.%02u", field_name, pc / 100, pc % 100); + } else if (flags & HIST_FIELD_FL_GRAPH) { + seq_printf(m, " %s: %20s", field_name, + __fill_bar_str(bar, 20, val, stats[idx].max)); } else if (flags & HIST_FIELD_FL_HEX) { seq_printf(m, " %s: %10llx", field_name, val); } else { @@ -5336,7 +5375,7 @@ static void hist_trigger_print_val(struct seq_file *m= , unsigned int idx, =20 static void hist_trigger_entry_print(struct seq_file *m, struct hist_trigger_data *hist_data, - u64 *totals, + struct hist_val_stat *stats, void *key, struct tracing_map_elt *elt) { @@ -5347,7 +5386,7 @@ static void hist_trigger_entry_print(struct seq_file = *m, hist_trigger_print_key(m, hist_data, key, elt); =20 /* At first, show the raw hitcount always */ - hist_trigger_print_val(m, i, "hitcount", 0, totals, elt); + hist_trigger_print_val(m, i, "hitcount", 0, stats, elt); =20 for (i =3D 1; i < hist_data->n_vals; i++) { field_name =3D hist_field_name(hist_data->fields[i], 0); @@ -5357,7 +5396,7 @@ static void hist_trigger_entry_print(struct seq_file = *m, continue; =20 seq_puts(m, " "); - hist_trigger_print_val(m, i, field_name, flags, totals, elt); + hist_trigger_print_val(m, i, field_name, flags, stats, elt); } =20 print_actions(m, hist_data, elt); @@ -5371,7 +5410,8 @@ static int print_entries(struct seq_file *m, struct tracing_map_sort_entry **sort_entries =3D NULL; struct tracing_map *map =3D hist_data->map; int i, j, n_entries; - u64 *totals =3D NULL; + struct hist_val_stat *stats =3D NULL; + u64 val; =20 n_entries =3D tracing_map_sort_entries(map, hist_data->sort_keys, hist_data->n_sort_keys, @@ -5379,28 +5419,33 @@ static int print_entries(struct seq_file *m, if (n_entries < 0) return n_entries; =20 + /* Calculate the max and the total for each field if needed. */ for (j =3D 0; j < hist_data->n_vals; j++) { - if (!(hist_data->fields[j]->flags & HIST_FIELD_FL_PERCENT)) + if (!(hist_data->fields[j]->flags & + (HIST_FIELD_FL_PERCENT | HIST_FIELD_FL_GRAPH))) continue; - if (!totals) { - totals =3D kcalloc(hist_data->n_vals, sizeof(u64), - GFP_KERNEL); - if (!totals) { + if (!stats) { + stats =3D kcalloc(hist_data->n_vals, sizeof(*stats), + GFP_KERNEL); + if (!stats) { n_entries =3D -ENOMEM; goto out; } } - for (i =3D 0; i < n_entries; i++) - totals[j] +=3D tracing_map_read_sum( - sort_entries[i]->elt, j); + for (i =3D 0; i < n_entries; i++) { + val =3D tracing_map_read_sum(sort_entries[i]->elt, j); + stats[j].total +=3D val; + if (stats[j].max < val) + stats[j].max =3D val; + } } =20 for (i =3D 0; i < n_entries; i++) - hist_trigger_entry_print(m, hist_data, totals, + hist_trigger_entry_print(m, hist_data, stats, sort_entries[i]->key, sort_entries[i]->elt); =20 - kfree(totals); + kfree(stats); out: tracing_map_destroy_sort_entries(sort_entries, n_entries); From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96286ECAAD3 for ; Sun, 4 Sep 2022 04:13:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232470AbiIDENZ (ORCPT ); Sun, 4 Sep 2022 00:13:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38414 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232681AbiIDENI (ORCPT ); Sun, 4 Sep 2022 00:13:08 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 056BD4BA49 for ; Sat, 3 Sep 2022 21:13:04 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id AE29CB80C0A for ; Sun, 4 Sep 2022 04:13:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3C9B6C433D6; Sun, 4 Sep 2022 04:13:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264781; bh=Hv2Jx1ndLQnx6xs2OJpYs242JzL+rZSDUvGGhHc/mvw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HHJf/nHL4l43jIHWxdbjy28482FI8xNWbcHrt61HiOKR5t6ZSF+zq5uYXFGxS+DUi sM7m9dNXYjGXXqDoGRuRZm++D1VGbA0gIb+85sTX7uCNLvXwqn5hBHmqz1D4L3+DO0 etn6TT72UvZcZ2wWGGnZsb7VuC1JBaKVP4HTnqzX7jBR/q5KO4CkL+kHm/W6VEiQDG ScJf6pkiS+ItJFtU8H2j7FWsTIspmnNXUydiv8hOtsFUeBSAKCYIUUBzqfWsnjPwNd WnsWdkK0vjcEjUySz7wKl+vP5IETMP+lQHI1SJ1N4JDVuaGO3fQ5SOBR5S4ancH17d dhsM59gno7VeA== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 5/6] tracing: Add nohitcount option for suppressing display of raw hitcount Date: Sun, 4 Sep 2022 13:12:57 +0900 Message-Id: <166226477757.223837.8207996579689008539.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu (Google) Add 'nohitcount' ('NOHC' for short) option for suppressing display of the raw hitcount column in the histogram. Note that you must specify at least one value except raw 'hitcount' when you specify this nohitcount option. # cd /sys/kernel/debug/tracing/ # echo hist:keys=3Dpid:vals=3Druntime.percent,runtime.graph:sort=3Dpid:NO= HC > \ events/sched/sched_stat_runtime/trigger # sleep 10 # cat events/sched/sched_stat_runtime/hist # event histogram # # trigger info: hist:keys=3Dpid:vals=3Druntime.percent,runtime.graph:sort= =3Dpid:size=3D2048:nohitcount [active] # { pid: 8 } runtime (%): 3.02 runtime: # { pid: 14 } runtime (%): 2.25 runtime: { pid: 16 } runtime (%): 2.25 runtime: { pid: 26 } runtime (%): 0.17 runtime: { pid: 61 } runtime (%): 11.52 runtime: #### { pid: 67 } runtime (%): 1.56 runtime: { pid: 68 } runtime (%): 0.84 runtime: { pid: 76 } runtime (%): 0.92 runtime: { pid: 117 } runtime (%): 2.50 runtime: # { pid: 146 } runtime (%): 49.88 runtime: #################### { pid: 157 } runtime (%): 16.63 runtime: ###### { pid: 158 } runtime (%): 8.38 runtime: ### Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi --- Changes in v5: - Add nohitcount and NOHC option to avoid showing hitcount. --- kernel/trace/trace.c | 3 +++ kernel/trace/trace_events_hist.c | 34 ++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index aec092b4ed3e..e39d3d3b64ac 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5654,6 +5654,7 @@ static const char readme_msg[] =3D "\t [:size=3D#entries]\n" "\t [:pause][:continue][:clear]\n" "\t [:name=3Dhistname1]\n" + "\t [:nohitcount]\n" "\t [:.]\n" "\t [if ]\n\n" "\t Note, special fields can be used as well:\n" @@ -5710,6 +5711,8 @@ static const char readme_msg[] =3D "\t The 'clear' parameter will clear the contents of a running\n" "\t hist trigger and leave its current paused/active state\n" "\t unchanged.\n\n" + "\t The 'nohitcount' (or NOHC) parameter will suppress display of\n" + "\t raw hitcount in the histogram.\n\n" "\t The enable_hist and disable_hist triggers can be used to\n" "\t have one event conditionally start and stop another event's\n" "\t already-attached hist trigger. The syntax is analogous to\n" diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index 753da682d404..8d1db056766f 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -69,7 +69,8 @@ C(INVALID_STR_OPERAND, "String type can not be an operand in expression")= , \ C(EXPECT_NUMBER, "Expecting numeric literal"), \ C(UNARY_MINUS_SUBEXPR, "Unary minus not supported in sub-expressions"), \ - C(DIVISION_BY_ZERO, "Division by zero"), + C(DIVISION_BY_ZERO, "Division by zero"), \ + C(NEED_NOHC_VAL, "Non-hitcount value is required for 'nohitcount'"), =20 #undef C #define C(a, b) HIST_ERR_##a @@ -526,6 +527,7 @@ struct hist_trigger_attrs { bool cont; bool clear; bool ts_in_usecs; + bool no_hitcount; unsigned int map_bits; =20 char *assignment_str[TRACING_MAP_VARS_MAX]; @@ -1550,7 +1552,10 @@ parse_hist_trigger_attrs(struct trace_array *tr, cha= r *trigger_str) ret =3D parse_assignment(tr, str, attrs); if (ret) goto free; - } else if (strcmp(str, "pause") =3D=3D 0) + } else if (strcmp(str, "nohitcount") =3D=3D 0 || + strcmp(str, "NOHC") =3D=3D 0) + attrs->no_hitcount =3D true; + else if (strcmp(str, "pause") =3D=3D 0) attrs->pause =3D true; else if ((strcmp(str, "cont") =3D=3D 0) || (strcmp(str, "continue") =3D=3D 0)) @@ -4377,6 +4382,12 @@ static int create_val_fields(struct hist_trigger_dat= a *hist_data, if (fields_str && (strcmp(fields_str, "hitcount") !=3D 0)) ret =3D -EINVAL; out: + /* There is only raw hitcount but nohitcount suppresses it. */ + if (j =3D=3D 1 && hist_data->attrs->no_hitcount) { + hist_err(hist_data->event_file->tr, HIST_ERR_NEED_NOHC_VAL, 0); + ret =3D -ENOENT; + } + return ret; } =20 @@ -5385,13 +5396,13 @@ static void hist_trigger_entry_print(struct seq_fil= e *m, =20 hist_trigger_print_key(m, hist_data, key, elt); =20 - /* At first, show the raw hitcount always */ - hist_trigger_print_val(m, i, "hitcount", 0, stats, elt); + /* At first, show the raw hitcount if !nohitcount */ + if (!hist_data->attrs->no_hitcount) + hist_trigger_print_val(m, i, "hitcount", 0, stats, elt); =20 for (i =3D 1; i < hist_data->n_vals; i++) { field_name =3D hist_field_name(hist_data->fields[i], 0); flags =3D hist_data->fields[i]->flags; - if (flags & HIST_FIELD_FL_VAR || flags & HIST_FIELD_FL_EXPR) continue; =20 @@ -5836,6 +5847,7 @@ static int event_hist_trigger_print(struct seq_file *= m, struct hist_trigger_data *hist_data =3D data->private_data; struct hist_field *field; bool have_var =3D false; + bool show_val =3D false; unsigned int i; =20 seq_puts(m, HIST_PREFIX); @@ -5866,12 +5878,16 @@ static int event_hist_trigger_print(struct seq_file= *m, continue; } =20 - if (i =3D=3D HITCOUNT_IDX) + if (i =3D=3D HITCOUNT_IDX) { + if (hist_data->attrs->no_hitcount) + continue; seq_puts(m, "hitcount"); - else { - seq_puts(m, ","); + } else { + if (show_val) + seq_puts(m, ","); hist_field_print(m, field); } + show_val =3D true; } =20 if (have_var) { @@ -5922,6 +5938,8 @@ static int event_hist_trigger_print(struct seq_file *= m, seq_printf(m, ":size=3D%u", (1 << hist_data->map->map_bits)); if (hist_data->enable_timestamps) seq_printf(m, ":clock=3D%s", hist_data->attrs->clock); + if (hist_data->attrs->no_hitcount) + seq_puts(m, ":nohitcount"); =20 print_actions_spec(m, hist_data); From nobody Mon Apr 6 18:41:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17F13ECAAD5 for ; Sun, 4 Sep 2022 04:13:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232659AbiIDEN3 (ORCPT ); Sun, 4 Sep 2022 00:13:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230007AbiIDENM (ORCPT ); Sun, 4 Sep 2022 00:13:12 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9423B4B0F0 for ; Sat, 3 Sep 2022 21:13:11 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2B41160EB6 for ; Sun, 4 Sep 2022 04:13:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 72AD1C433C1; Sun, 4 Sep 2022 04:13:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1662264790; bh=ni3Yz/4/kEi9dOdY50RYTd5QBFLAF1RixEvI/QkYAGI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Rwn15yEtyP36eV5ett75rLcqrTsAFJUo5xT4fCFANXauF0Ayx+jhS0jx+Cf+GjxlP yyzSyujB5HTSwj1n0m7I7yThkABul5jpuayfXP2Pz7TEYZIbGXv8vhX6mnYP6G+vST CFmwWRTWhGb8bDYoy8b/zyAAk5hGpyl/pXldPbq1mRVLxuuaoa8hk2CQvTfM9U7m6X fKYyftT+iiUcVDHk+4xrhrXk9f+rYVYZcS+A7i/M5Mf1X9WcVeFlVhdTABQdNf1OOh xiRBM6MW/jy4gSFq9CSZyj4xEFYl8iD7VRpgwTbxGknQkVu1WbBIJSgTEQsExMjhLO Bo0+da9Hcy4pg== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Tom Zanussi , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v5 6/6] tracing: docs: Update histogram doc for .percent/.graph and 'nohitcount' Date: Sun, 4 Sep 2022 13:13:07 +0900 Message-Id: <166226478684.223837.9677310927556736590.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <166226473132.223837.9011128463174539022.stgit@devnote2> References: <166226473132.223837.9011128463174539022.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu (Google) Update histogram document for .percent/.graph suffixes and 'nohitcount' option. Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi Tested-by: Tom Zanussi --- Documentation/trace/histogram.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Documentation/trace/histogram.rst b/Documentation/trace/histog= ram.rst index 859fd1b76c63..b2da4e9c62e8 100644 --- a/Documentation/trace/histogram.rst +++ b/Documentation/trace/histogram.rst @@ -25,7 +25,7 @@ Documentation written by Tom Zanussi =20 hist:keys=3D[:values=3D] [:sort=3D][:size=3D#entries][:pause][:conti= nue] - [:clear][:name=3Dhistname1][:.] [if ] + [:clear][:name=3Dhistname1][:nohitcount][:.] [i= f ] =20 When a matching event is hit, an entry is added to a hash table using the key(s) and value(s) named. Keys and values correspond to @@ -79,6 +79,8 @@ Documentation written by Tom Zanussi .log2 display log2 value rather than raw number .buckets=3Dsize display grouping of values rather than raw number .usecs display a common_timestamp in microseconds + .percent display a number of percentage value + .graph display a bar-graph of a value =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Note that in general the semantics of a given field aren't @@ -137,6 +139,12 @@ Documentation written by Tom Zanussi existing trigger, rather than via the '>' operator, which will cause the trigger to be removed through truncation. =20 + The 'nohitcount' (or NOHC) parameter will suppress display of + raw hitcount in the histogram. This option requires at least one + value field which is not a 'raw hitcount'. For example, + 'hist:...:vals=3Dhitcount:nohitcount' is rejected, but + 'hist:...:vals=3Dhitcount.percent:nohitcount' is OK. + - enable_hist/disable_hist =20 The enable_hist and disable_hist triggers can be used to have one