lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <CAP-5=fVaUFDwcP9s8aAtxFtRWQnBqRBrZYkKxAxzog_pmicsRQ@mail.gmail.com> Date: Wed, 23 Nov 2022 15:31:26 -0800 From: Ian Rogers <irogers@...gle.com> To: Namhyung Kim <namhyung@...nel.org> Cc: Arnaldo Carvalho de Melo <acme@...nel.org>, Jiri Olsa <jolsa@...nel.org>, Ingo Molnar <mingo@...nel.org>, Peter Zijlstra <peterz@...radead.org>, LKML <linux-kernel@...r.kernel.org>, Adrian Hunter <adrian.hunter@...el.com>, linux-perf-users@...r.kernel.org, Kan Liang <kan.liang@...ux.intel.com>, Zhengjun Xing <zhengjun.xing@...ux.intel.com>, James Clark <james.clark@....com>, Athira Jajeev <atrajeev@...ux.vnet.ibm.com> Subject: Re: [PATCH 15/15] perf stat: Tidy up JSON metric-only output when no metrics On Wed, Nov 23, 2022 at 10:02 AM Namhyung Kim <namhyung@...nel.org> wrote: > > It printed empty strings for each metric. I guess it's needed for CSV > output to match the column number. We could just ignore the empty > metrics in JSON but it ended up with a broken JSON object with a > trailing comma. > > So I added a dummy '"metric-value" : "none"' part. To do that, it > needs to pass struct outstate to print_metric_end() to check if any > metric value is printed or not. > > Before: > # perf stat -aj --metric-only --per-socket --for-each-cgroup system.slice true > {"socket" : "S0", "cpu-count" : 8, "cgroup" : "system.slice", "" : "", "" : "", "" : "", "" : "", "" : "", "" : "", "" : "", "" : ""} > > After: > # perf stat -aj --metric-only --per-socket --for-each-cgroup system.slice true > {"socket" : "S0", "cpu-count" : 8, "cgroup" : "system.slice", "metric-value" : "none"} > > Signed-off-by: Namhyung Kim <namhyung@...nel.org> Acked-by: Ian Rogers <irogers@...gle.com> Thanks, Ian > --- > tools/perf/util/stat-display.c | 27 +++++++++++++++++---------- > 1 file changed, 17 insertions(+), 10 deletions(-) > > diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c > index 7a39a1a7261d..847acdb5dc40 100644 > --- a/tools/perf/util/stat-display.c > +++ b/tools/perf/util/stat-display.c > @@ -532,6 +532,8 @@ static void print_metric_only_json(struct perf_stat_config *config __maybe_unuse > while (isdigit(*ends) || *ends == '.') > ends++; > *ends = 0; > + if (!unit[0] || !vals[0]) > + return; > fprintf(out, "%s\"%s\" : \"%s\"", os->first ? "" : ", ", unit, vals); > os->first = false; > } > @@ -864,14 +866,19 @@ static void print_metric_begin(struct perf_stat_config *config, > print_cgroup(config, os->cgrp ? : evsel->cgrp); > } > > -static void print_metric_end(struct perf_stat_config *config) > +static void print_metric_end(struct perf_stat_config *config, struct outstate *os) > { > + FILE *output = config->output; > + > if (!config->metric_only) > return; > > - if (config->json_output) > - fputc('}', config->output); > - fputc('\n', config->output); > + if (config->json_output) { > + if (os->first) > + fputs("\"metric-value\" : \"none\"", output); > + fputc('}', output); > + } > + fputc('\n', output); > } > > static void print_aggr(struct perf_stat_config *config, > @@ -897,7 +904,7 @@ static void print_aggr(struct perf_stat_config *config, > > print_counter_aggrdata(config, counter, s, os); > } > - print_metric_end(config); > + print_metric_end(config, os); > } > } > > @@ -929,7 +936,7 @@ static void print_aggr_cgroup(struct perf_stat_config *config, > > print_counter_aggrdata(config, counter, s, os); > } > - print_metric_end(config); > + print_metric_end(config, os); > } > } > } > @@ -985,7 +992,7 @@ static void print_no_aggr_metric(struct perf_stat_config *config, > printout(config, os, uval, run, ena, 1.0, counter_idx); > } > if (!first) > - print_metric_end(config); > + print_metric_end(config, os); > } > } > > @@ -1348,7 +1355,7 @@ static void print_cgroup_counter(struct perf_stat_config *config, struct evlist > evlist__for_each_entry(evlist, counter) { > if (os->cgrp != counter->cgrp) { > if (os->cgrp != NULL) > - print_metric_end(config); > + print_metric_end(config, os); > > os->cgrp = counter->cgrp; > print_metric_begin(config, evlist, os, /*aggr_idx=*/0); > @@ -1357,7 +1364,7 @@ static void print_cgroup_counter(struct perf_stat_config *config, struct evlist > print_counter(config, counter, os); > } > if (os->cgrp) > - print_metric_end(config); > + print_metric_end(config, os); > } > > void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config, > @@ -1405,7 +1412,7 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf > evlist__for_each_entry(evlist, counter) { > print_counter(config, counter, &os); > } > - print_metric_end(config); > + print_metric_end(config, &os); > } > break; > case AGGR_NONE: > -- > 2.38.1.584.g0f3c55d4c2-goog >
Powered by blists - more mailing lists