From: Ivan Lazaric <ivan.lazaric1@gmail.com>
To: namhyung@kernel.org
Cc: linux-perf-users@vger.kernel.org, irogers@google.com,
Ivan Lazaric <ivan.lazaric1@gmail.com>
Subject: [PATCH v2] perf stat: reject --field-separator and --json-output combination
Date: Wed, 8 Jul 2026 15:14:01 +0200 [thread overview]
Message-ID: <20260708131359.71732-3-ivan.lazaric1@gmail.com> (raw)
In-Reply-To: <ak3scJT4MfbAg0G4@google.com>
Specifying --field-separator option is stating you want CSV output.
Passing both --field-separator and --json-output is then stating
you want output to be in CSV and JSON format at same time.
Currently this combination is not rejected, and the outcome
is a malformed combination of CSV and JSON output.
This is because of inconsistencies in various printing functions,
some of them have if-else chains that start with
"Should I print JSON?", and some start with "Should I print CSV?".
Example of current output:
$ tools/perf/perf stat -x , -j -e cpu-migrations true
{"counter-value" : "0.000000", "unit" : "", "event" : "cpu-migrations", "event-runtime" : 474817, "pcnt-running" : 100.00,,
Instead reject the option combination,
with a helpful error message and non-zero exit code.
Example of new output:
$ tools/perf/perf stat -x , -j true
cannot use both --field-separator and --json-output
Usage: perf stat [<options>] [<command>]
-x, --field-separator <separator>
print counts with custom separator
-j, --json-output print counts in JSON format
Signed-off-by: Ivan Lazaric <ivan.lazaric1@gmail.com>
---
Changes since v1
- Rebase on top of perf-tools-next
I was working off of master base branch mistakenly.
Applying the patch `perf build: Fix compiler errors with old capstone` to fix the build
(link: https://lore.kernel.org/linux-perf-users/20260706234836.815254-1-namhyung@kernel.org/ ),
this builds and passes the test shell/stat.sh (currently number 121). I have not tested other tests.
tools/perf/builtin-stat.c | 7 +++++++
tools/perf/tests/shell/stat.sh | 12 ++++++++++++
2 files changed, 19 insertions(+)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 92cdb2df7285..3f685beba384 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -2655,6 +2655,13 @@ int cmd_stat(int argc, const char **argv)
stat_config.aggr_mode = opt_aggr_mode_to_aggr_mode(&opt_mode);
+ if (stat_config.csv_sep && stat_config.json_output) {
+ fprintf(stderr, "cannot use both --field-separator and --json-output\n");
+ parse_options_usage(stat_usage, stat_options, "x", 1);
+ parse_options_usage(NULL, stat_options, "j", 1);
+ goto out;
+ }
+
if (stat_config.csv_sep) {
stat_config.csv_output = true;
if (!strcmp(stat_config.csv_sep, "\\t"))
diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh
index 1e17bee026bd..649de1166fed 100755
--- a/tools/perf/tests/shell/stat.sh
+++ b/tools/perf/tests/shell/stat.sh
@@ -535,6 +535,17 @@ test_stat_delay() {
echo "stat -D test [Success]"
}
+test_csv_json_fail() {
+ echo "stat -x <sep> -j test"
+ if perf stat -x , -j true > /dev/null 2>&1
+ then
+ echo "stat -x <sep> -j test [Failed - command should have errored]"
+ err=1
+ else
+ echo "stat -x <sep> -j test [Success]"
+ fi
+}
+
test_default_stat
test_null_stat
test_offline_cpu_stat
@@ -551,6 +562,7 @@ test_stat_detailed
test_stat_repeat
test_stat_pid
test_stat_delay
+test_csv_json_fail
cleanup
exit $err
--
2.43.0
next prev parent reply other threads:[~2026-07-08 13:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-05 0:58 [PATCH] perf stat: reject --field-separator and --json-output combination Ivan Lazaric
2026-07-08 6:21 ` Namhyung Kim
2026-07-08 13:14 ` Ivan Lazaric [this message]
2026-07-08 13:36 ` [PATCH v2] " sashiko-bot
2026-07-08 23:43 ` Namhyung Kim
2026-07-10 0:41 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260708131359.71732-3-ivan.lazaric1@gmail.com \
--to=ivan.lazaric1@gmail.com \
--cc=irogers@google.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.