Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1255213 > unrolled thread

[PATCH 1/4] perf tools: Improve ambiguous option help message

Started byNamhyung Kim <namhyung@kernel.org>
First post2015-10-24 17:50 +0200
Last post2015-10-29 10:50 +0100
Articles 14 — 5 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/4] perf tools: Improve ambiguous option help message Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
    [PATCH 2/4] perf report: Rename to --show-cpu-utilization Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
      Re: [PATCH 2/4] perf report: Rename to --show-cpu-utilization Ingo Molnar <mingo@kernel.org> - 2015-10-25 10:00 +0100
      [tip:perf/core] perf report: Rename to --show-cpu-utilization tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
    [PATCH 4/4] perf tools: Introduce usage_with_options_msg() Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
      Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 18:20 +0100
      RE: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-10-27 00:20 +0100
        Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 13:40 +0100
      [tip:perf/core] perf tools: Introduce usage_with_options_msg() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
    [PATCH 3/4] perf tools: Setup pager when printing usage and help Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
      Re: [PATCH 3/4] perf tools: Setup pager when printing usage and help Ingo Molnar <mingo@kernel.org> - 2015-10-25 10:10 +0100
      [tip:perf/core] perf tools:   Setup pager when printing usage and help tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
    Re: [PATCH 1/4] perf tools: Improve ambiguous option help message Ingo Molnar <mingo@kernel.org> - 2015-10-25 09:50 +0100
    [tip:perf/core] perf tools: Improve ambiguous option help message tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100

#1255213 — [PATCH 1/4] perf tools: Improve ambiguous option help message

FromNamhyung Kim <namhyung@kernel.org>
Date2015-10-24 17:50 +0200
Subject[PATCH 1/4] perf tools: Improve ambiguous option help message
Message-ID<qn9eV-4A2-3@gated-at.bofh.it>
Currently if an option name is ambiguous it only prints first two
matched option names but no help.  It'd be better it could show all
possible names and help messages too.

Before:
  $ perf report --show
    Error: Ambiguous option: show (could be --show-total-period or
                                            --show-ref-call-graph)
   Usage: perf report [<options>]

After:
  $ perf report --show
    Error: Ambiguous option: show (could be --show-total-period or
                                            --show-ref-call-graph)
   Usage: perf report [<options>]

      -n, --show-nr-samples
                              Show a column with the number of samples
          --showcpuutilization
                              Show sample percentage for different cpu modes
      -I, --show-info         Display extended information about perf.data file
          --show-total-period
                              Show a column with the sum of periods
          --show-ref-call-graph
                              Show callgraph from reference event

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/parse-options.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 22c2806bda98..b8d98229a8af 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -770,24 +770,23 @@ int parse_options_usage(const char * const *usagestr,
 opt:
 	for (  ; opts->type != OPTION_END; opts++) {
 		if (short_opt) {
-			if (opts->short_name == *optstr)
+			if (opts->short_name == *optstr) {
+				print_option_help(opts, 0);
 				break;
+			}
 			continue;
 		}
 
 		if (opts->long_name == NULL)
 			continue;
 
-		if (!prefixcmp(optstr, opts->long_name))
-			break;
-		if (!prefixcmp(optstr, "no-") &&
-		    !prefixcmp(optstr + 3, opts->long_name))
-			break;
+		if (!prefixcmp(opts->long_name, optstr))
+			print_option_help(opts, 0);
+		if (!prefixcmp("no-", optstr) &&
+		    !prefixcmp(opts->long_name, optstr + 3))
+			print_option_help(opts, 0);
 	}
 
-	if (opts->type != OPTION_END)
-		print_option_help(opts, 0);
-
 	return PARSE_OPT_HELP;
 }
 
-- 
2.6.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1255214 — [PATCH 2/4] perf report: Rename to --show-cpu-utilization

FromNamhyung Kim <namhyung@kernel.org>
Date2015-10-24 17:50 +0200
Subject[PATCH 2/4] perf report: Rename to --show-cpu-utilization
Message-ID<qn9eV-4A2-7@gated-at.bofh.it>
In reply to#1255213
So that it can be more consistent with other --show-* options.  The old
name (--showcpuutilization) is provided only for compatibility.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/Documentation/perf-report.txt | 2 +-
 tools/perf/builtin-report.c              | 4 +++-
 tools/perf/util/parse-options.h          | 1 +
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index ab1fd64e3627..5ce8da1e1256 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -29,7 +29,7 @@ OPTIONS
 --show-nr-samples::
 	Show the number of samples for each symbol
 
---showcpuutilization::
+--show-cpu-utilization::
         Show sample percentage for different cpu modes.
 
 -T::
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 50dd4d3d8667..2853ad2bd435 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -699,8 +699,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 		   " Please refer the man page for the complete list."),
 	OPT_STRING('F', "fields", &field_order, "key[,keys...]",
 		   "output field(s): overhead, period, sample plus all of sort keys"),
-	OPT_BOOLEAN(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+	OPT_BOOLEAN(0, "show-cpu-utilization", &symbol_conf.show_cpu_utilization,
 		    "Show sample percentage for different cpu modes"),
+	OPT_BOOLEAN_FLAG(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+		    "Show sample percentage for different cpu modes", PARSE_OPT_HIDDEN),
 	OPT_STRING('p', "parent", &parent_pattern, "regex",
 		   "regex filter to identify parent, see: '--sort parent'"),
 	OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 367d8b816cc7..182c86099330 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -111,6 +111,7 @@ struct option {
 #define OPT_GROUP(h)                { .type = OPTION_GROUP, .help = (h) }
 #define OPT_BIT(s, l, v, h, b)      { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
 #define OPT_BOOLEAN(s, l, v, h)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h) }
+#define OPT_BOOLEAN_FLAG(s, l, v, h, f)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h), .flags = (f) }
 #define OPT_BOOLEAN_SET(s, l, v, os, h) \
 	{ .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), \
 	.value = check_vtype(v, bool *), .help = (h), \
-- 
2.6.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1255313 — Re: [PATCH 2/4] perf report: Rename to --show-cpu-utilization

FromIngo Molnar <mingo@kernel.org>
Date2015-10-25 10:00 +0100
SubjectRe: [PATCH 2/4] perf report: Rename to --show-cpu-utilization
Message-ID<qnpjI-8sg-1@gated-at.bofh.it>
In reply to#1255214
* Namhyung Kim <namhyung@kernel.org> wrote:

> So that it can be more consistent with other --show-* options.  The old
> name (--showcpuutilization) is provided only for compatibility.

1)

Btw., maybe we could enhance the option parser to strip all (non-leading) dashes 
from long-form option names? That way both variants would work naturally, and if 
someone thinks it's called '--show-cpuutilization' that would work as well.

2)

Also, another enhancement would be to allow partial matches, so that --showcpu 
would match on the first long-form option name that matches.

Right now we do:

  triton:~/tip> perf report -h --showcpu

   Usage: perf report [<options>]


  triton:~/tip> 

Which arguably isn't very helpful! :-)

3)

The only drawback of doing partial matches would be if we introduce new variants - 
but we'd still 'break' safely: if for example --show-cpu-usage is introduced in a 
couple of years, then previous usage of:

   perf report --showcpu

would emit your ambiguous-options warning that you improved in this series. We'd 
output the two options that match and the user could adjust the parameter to 
whichever he meant.

It would still very smooth behavior from a UI ergonomy POV IMHO.

4)

Another possible tweak would be to print a non-fatal info line when a user didn't 
use the canonical form of the option. So writing:

   perf report --showcpu

would result in (stdout) output like this:

   # Option parser: '--showcpu' matched on '--show-cpu-utilization'

The disadvantage of this would be the extra nuisance factor, so I'm not sure we 
want this aspect.

Thanks,

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1258691 — [tip:perf/core] perf report: Rename to --show-cpu-utilization

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-10-29 10:50 +0100
Subject[tip:perf/core] perf report: Rename to --show-cpu-utilization
Message-ID<qoS0i-6Ul-19@gated-at.bofh.it>
In reply to#1255214
Commit-ID:  b272a59d835cd8ca6b45f41c66c61b473996c759
Gitweb:     http://git.kernel.org/tip/b272a59d835cd8ca6b45f41c66c61b473996c759
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:25 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 14:06:04 -0300

perf report: Rename to --show-cpu-utilization

So that it can be more consistent with other --show-* options.  The old
name (--showcpuutilization) is provided only for compatibility.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Documentation/perf-report.txt | 2 +-
 tools/perf/builtin-report.c              | 4 +++-
 tools/perf/util/parse-options.h          | 1 +
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index ab1fd64..5ce8da1 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -29,7 +29,7 @@ OPTIONS
 --show-nr-samples::
 	Show the number of samples for each symbol
 
---showcpuutilization::
+--show-cpu-utilization::
         Show sample percentage for different cpu modes.
 
 -T::
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 50dd4d3..2853ad2 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -699,8 +699,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 		   " Please refer the man page for the complete list."),
 	OPT_STRING('F', "fields", &field_order, "key[,keys...]",
 		   "output field(s): overhead, period, sample plus all of sort keys"),
-	OPT_BOOLEAN(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+	OPT_BOOLEAN(0, "show-cpu-utilization", &symbol_conf.show_cpu_utilization,
 		    "Show sample percentage for different cpu modes"),
+	OPT_BOOLEAN_FLAG(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+		    "Show sample percentage for different cpu modes", PARSE_OPT_HIDDEN),
 	OPT_STRING('p', "parent", &parent_pattern, "regex",
 		   "regex filter to identify parent, see: '--sort parent'"),
 	OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 367d8b8..182c860 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -111,6 +111,7 @@ struct option {
 #define OPT_GROUP(h)                { .type = OPTION_GROUP, .help = (h) }
 #define OPT_BIT(s, l, v, h, b)      { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
 #define OPT_BOOLEAN(s, l, v, h)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h) }
+#define OPT_BOOLEAN_FLAG(s, l, v, h, f)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h), .flags = (f) }
 #define OPT_BOOLEAN_SET(s, l, v, os, h) \
 	{ .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), \
 	.value = check_vtype(v, bool *), .help = (h), \
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1255215 — [PATCH 4/4] perf tools: Introduce usage_with_options_msg()

FromNamhyung Kim <namhyung@kernel.org>
Date2015-10-24 17:50 +0200
Subject[PATCH 4/4] perf tools: Introduce usage_with_options_msg()
Message-ID<qn9eV-4A2-9@gated-at.bofh.it>
In reply to#1255213
Now usage_with_options() setup a pager before printing message so normal
printf() or pr_err() will not be shown.  The usage_with_options_msg()
can be used to print some help message before usage strings.

Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-evlist.c     |  4 ++--
 tools/perf/builtin-probe.c      | 20 ++++++++++++--------
 tools/perf/builtin-record.c     | 11 ++++++-----
 tools/perf/builtin-sched.c      |  4 ++--
 tools/perf/builtin-script.c     |  8 ++++----
 tools/perf/util/parse-options.c | 15 +++++++++++++++
 tools/perf/util/parse-options.h |  4 ++++
 tools/perf/util/strbuf.c        | 22 +++++++++++++++-------
 tools/perf/util/strbuf.h        |  2 ++
 9 files changed, 62 insertions(+), 28 deletions(-)

diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
index 695ec5a50cf2..f4d62510acbb 100644
--- a/tools/perf/builtin-evlist.c
+++ b/tools/perf/builtin-evlist.c
@@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
 		usage_with_options(evlist_usage, options);
 
 	if (details.event_group && (details.verbose || details.freq)) {
-		pr_err("--group option is not compatible with other options\n");
-		usage_with_options(evlist_usage, options);
+		usage_with_options_msg(evlist_usage, options,
+			"--group option is not compatible with other options\n");
 	}
 
 	return __cmd_evlist(input_name, &details);
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 530c3a28a58c..132afc97676c 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 	if (argc > 0) {
 		if (strcmp(argv[0], "-") == 0) {
-			pr_warning("  Error: '-' is not supported.\n");
-			usage_with_options(probe_usage, options);
+			usage_with_options_msg(probe_usage, options,
+				"'-' is not supported.\n");
 		}
 		if (params.command && params.command != 'a') {
-			pr_warning("  Error: another command except --add is set.\n");
-			usage_with_options(probe_usage, options);
+			usage_with_options_msg(probe_usage, options,
+				"another command except --add is set.\n");
 		}
 		ret = parse_probe_event_argv(argc, argv);
 		if (ret < 0) {
@@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 	switch (params.command) {
 	case 'l':
 		if (params.uprobes) {
-			pr_warning("  Error: Don't use --list with --exec.\n");
-			usage_with_options(probe_usage, options);
+			pr_err("  Error: Don't use --list with --exec.\n");
+			parse_options_usage(probe_usage, options, "l", true);
+			parse_options_usage(NULL, options, "x", true);
+			return -EINVAL;
 		}
 		ret = show_perf_probe_events(params.filter);
 		if (ret < 0)
@@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 	case 'a':
 		/* Ensure the last given target is used */
 		if (params.target && !params.target_used) {
-			pr_warning("  Error: -x/-m must follow the probe definitions.\n");
-			usage_with_options(probe_usage, options);
+			pr_err("  Error: -x/-m must follow the probe definitions.\n");
+			parse_options_usage(probe_usage, options, "m", true);
+			parse_options_usage(NULL, options, "x", true);
+			return -EINVAL;
 		}
 
 		ret = perf_add_probe_events(params.events, params.nevents);
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2740d7a82ae8..de02267c73d8 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
 		usage_with_options(record_usage, record_options);
 
 	if (nr_cgroups && !rec->opts.target.system_wide) {
-		ui__error("cgroup monitoring only available in"
-			  " system-wide mode\n");
-		usage_with_options(record_usage, record_options);
+		usage_with_options_msg(record_usage, record_options,
+			"cgroup monitoring only available in system-wide mode");
+
 	}
 	if (rec->opts.record_switch_events &&
 	    !perf_can_record_switch_events()) {
-		ui__error("kernel does not support recording context switch events (--switch-events option)\n");
-		usage_with_options(record_usage, record_options);
+		ui__error("kernel does not support recording context switch events\n");
+		parse_options_usage(record_usage, record_options, "switch-events", 0);
+		return -EINVAL;
 	}
 
 	if (!rec->itr) {
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 33962612a5e9..0ee6d900e100 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
 	for (tok = strtok_r(str, ", ", &tmp);
 			tok; tok = strtok_r(NULL, ", ", &tmp)) {
 		if (sort_dimension__add(tok, &sched->sort_list) < 0) {
-			error("Unknown --sort key: `%s'", tok);
-			usage_with_options(usage_msg, options);
+			usage_with_options_msg(usage_msg, options,
+					"Unknown --sort key: `%s'", tok);
 		}
 	}
 
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 2653c0273b89..278acb22f029 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
 		rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
 
 		if (!rec_script_path && !rep_script_path) {
-			fprintf(stderr, " Couldn't find script %s\n\n See perf"
+			usage_with_options_msg(script_usage, options,
+				"Couldn't find script `%s'\n\n See perf"
 				" script -l for available scripts.\n", argv[0]);
-			usage_with_options(script_usage, options);
 		}
 
 		if (is_top_script(argv[0])) {
@@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
 			rep_args = has_required_arg(rep_script_path);
 			rec_args = (argc - 1) - rep_args;
 			if (rec_args < 0) {
-				fprintf(stderr, " %s script requires options."
+				usage_with_options_msg(script_usage, options,
+					"`%s' script requires options."
 					"\n\n See perf script -l for available "
 					"scripts and options.\n", argv[0]);
-				usage_with_options(script_usage, options);
 			}
 		}
 
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index eeeed98eb26d..230e771407a3 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
 	exit(129);
 }
 
+void usage_with_options_msg(const char * const *usagestr,
+			    const struct option *opts, const char *fmt, ...)
+{
+	va_list ap;
+
+	exit_browser(false);
+
+	va_start(ap, fmt);
+	strbuf_addv(&error_buf, fmt, ap);
+	va_end(ap);
+
+	usage_with_options_internal(usagestr, opts, 0, NULL);
+	exit(129);
+}
+
 int parse_options_usage(const char * const *usagestr,
 			const struct option *opts,
 			const char *optstr, bool short_opt)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 182c86099330..a8e407bc251e 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
 
 extern NORETURN void usage_with_options(const char * const *usagestr,
                                         const struct option *options);
+extern NORETURN __attribute__((format(printf,3,4)))
+void usage_with_options_msg(const char * const *usagestr,
+			    const struct option *options,
+			    const char *fmt, ...);
 
 /*----- incremantal advanced APIs -----*/
 
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index 4abe23550c73..25671fa16618 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
 	strbuf_setlen(sb, sb->len + len);
 }
 
-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
 {
 	int len;
-	va_list ap;
+	va_list ap_saved;
 
 	if (!strbuf_avail(sb))
 		strbuf_grow(sb, 64);
-	va_start(ap, fmt);
+
+	va_copy(ap_saved, ap);
 	len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-	va_end(ap);
 	if (len < 0)
 		die("your vsnprintf is broken");
 	if (len > strbuf_avail(sb)) {
 		strbuf_grow(sb, len);
-		va_start(ap, fmt);
-		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-		va_end(ap);
+		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
+		va_end(ap_saved);
 		if (len > strbuf_avail(sb)) {
 			die("this should not happen, your vsnprintf is broken");
 		}
@@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
 	strbuf_setlen(sb, sb->len + len);
 }
 
+void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+	strbuf_addv(sb, fmt, ap);
+	va_end(ap);
+}
+
 ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
 {
 	size_t oldlen = sb->len;
diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
index 436ac319f6c7..529f2f035249 100644
--- a/tools/perf/util/strbuf.h
+++ b/tools/perf/util/strbuf.h
@@ -39,6 +39,7 @@
  */
 
 #include <assert.h>
+#include <stdarg.h>
 
 extern char strbuf_slopbuf[];
 struct strbuf {
@@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
 
 __attribute__((format(printf,2,3)))
 extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
+extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
 
 /* XXX: if read fails, any partial read is undone */
 extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
-- 
2.6.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1256177 — Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2015-10-26 18:20 +0100
SubjectRe: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()
Message-ID<qnTB8-2zF-13@gated-at.bofh.it>
In reply to#1255215
Em Sun, Oct 25, 2015 at 12:49:27AM +0900, Namhyung Kim escreveu:
> Now usage_with_options() setup a pager before printing message so normal
> printf() or pr_err() will not be shown.  The usage_with_options_msg()
> can be used to print some help message before usage strings.

Haven't tested, but intent looks good, Masami, could you please check if
all is ok and provide an Acked-by and/or Tested-by?

- Arnaldo
 
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/builtin-evlist.c     |  4 ++--
>  tools/perf/builtin-probe.c      | 20 ++++++++++++--------
>  tools/perf/builtin-record.c     | 11 ++++++-----
>  tools/perf/builtin-sched.c      |  4 ++--
>  tools/perf/builtin-script.c     |  8 ++++----
>  tools/perf/util/parse-options.c | 15 +++++++++++++++
>  tools/perf/util/parse-options.h |  4 ++++
>  tools/perf/util/strbuf.c        | 22 +++++++++++++++-------
>  tools/perf/util/strbuf.h        |  2 ++
>  9 files changed, 62 insertions(+), 28 deletions(-)
> 
> diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
> index 695ec5a50cf2..f4d62510acbb 100644
> --- a/tools/perf/builtin-evlist.c
> +++ b/tools/perf/builtin-evlist.c
> @@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
>  		usage_with_options(evlist_usage, options);
>  
>  	if (details.event_group && (details.verbose || details.freq)) {
> -		pr_err("--group option is not compatible with other options\n");
> -		usage_with_options(evlist_usage, options);
> +		usage_with_options_msg(evlist_usage, options,
> +			"--group option is not compatible with other options\n");
>  	}
>  
>  	return __cmd_evlist(input_name, &details);
> diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> index 530c3a28a58c..132afc97676c 100644
> --- a/tools/perf/builtin-probe.c
> +++ b/tools/perf/builtin-probe.c
> @@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  			     PARSE_OPT_STOP_AT_NON_OPTION);
>  	if (argc > 0) {
>  		if (strcmp(argv[0], "-") == 0) {
> -			pr_warning("  Error: '-' is not supported.\n");
> -			usage_with_options(probe_usage, options);
> +			usage_with_options_msg(probe_usage, options,
> +				"'-' is not supported.\n");
>  		}
>  		if (params.command && params.command != 'a') {
> -			pr_warning("  Error: another command except --add is set.\n");
> -			usage_with_options(probe_usage, options);
> +			usage_with_options_msg(probe_usage, options,
> +				"another command except --add is set.\n");
>  		}
>  		ret = parse_probe_event_argv(argc, argv);
>  		if (ret < 0) {
> @@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  	switch (params.command) {
>  	case 'l':
>  		if (params.uprobes) {
> -			pr_warning("  Error: Don't use --list with --exec.\n");
> -			usage_with_options(probe_usage, options);
> +			pr_err("  Error: Don't use --list with --exec.\n");
> +			parse_options_usage(probe_usage, options, "l", true);
> +			parse_options_usage(NULL, options, "x", true);
> +			return -EINVAL;
>  		}
>  		ret = show_perf_probe_events(params.filter);
>  		if (ret < 0)
> @@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  	case 'a':
>  		/* Ensure the last given target is used */
>  		if (params.target && !params.target_used) {
> -			pr_warning("  Error: -x/-m must follow the probe definitions.\n");
> -			usage_with_options(probe_usage, options);
> +			pr_err("  Error: -x/-m must follow the probe definitions.\n");
> +			parse_options_usage(probe_usage, options, "m", true);
> +			parse_options_usage(NULL, options, "x", true);
> +			return -EINVAL;
>  		}
>  
>  		ret = perf_add_probe_events(params.events, params.nevents);
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 2740d7a82ae8..de02267c73d8 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
>  		usage_with_options(record_usage, record_options);
>  
>  	if (nr_cgroups && !rec->opts.target.system_wide) {
> -		ui__error("cgroup monitoring only available in"
> -			  " system-wide mode\n");
> -		usage_with_options(record_usage, record_options);
> +		usage_with_options_msg(record_usage, record_options,
> +			"cgroup monitoring only available in system-wide mode");
> +
>  	}
>  	if (rec->opts.record_switch_events &&
>  	    !perf_can_record_switch_events()) {
> -		ui__error("kernel does not support recording context switch events (--switch-events option)\n");
> -		usage_with_options(record_usage, record_options);
> +		ui__error("kernel does not support recording context switch events\n");
> +		parse_options_usage(record_usage, record_options, "switch-events", 0);
> +		return -EINVAL;
>  	}
>  
>  	if (!rec->itr) {
> diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
> index 33962612a5e9..0ee6d900e100 100644
> --- a/tools/perf/builtin-sched.c
> +++ b/tools/perf/builtin-sched.c
> @@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
>  	for (tok = strtok_r(str, ", ", &tmp);
>  			tok; tok = strtok_r(NULL, ", ", &tmp)) {
>  		if (sort_dimension__add(tok, &sched->sort_list) < 0) {
> -			error("Unknown --sort key: `%s'", tok);
> -			usage_with_options(usage_msg, options);
> +			usage_with_options_msg(usage_msg, options,
> +					"Unknown --sort key: `%s'", tok);
>  		}
>  	}
>  
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 2653c0273b89..278acb22f029 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
>  		rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
>  
>  		if (!rec_script_path && !rep_script_path) {
> -			fprintf(stderr, " Couldn't find script %s\n\n See perf"
> +			usage_with_options_msg(script_usage, options,
> +				"Couldn't find script `%s'\n\n See perf"
>  				" script -l for available scripts.\n", argv[0]);
> -			usage_with_options(script_usage, options);
>  		}
>  
>  		if (is_top_script(argv[0])) {
> @@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
>  			rep_args = has_required_arg(rep_script_path);
>  			rec_args = (argc - 1) - rep_args;
>  			if (rec_args < 0) {
> -				fprintf(stderr, " %s script requires options."
> +				usage_with_options_msg(script_usage, options,
> +					"`%s' script requires options."
>  					"\n\n See perf script -l for available "
>  					"scripts and options.\n", argv[0]);
> -				usage_with_options(script_usage, options);
>  			}
>  		}
>  
> diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
> index eeeed98eb26d..230e771407a3 100644
> --- a/tools/perf/util/parse-options.c
> +++ b/tools/perf/util/parse-options.c
> @@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
>  	exit(129);
>  }
>  
> +void usage_with_options_msg(const char * const *usagestr,
> +			    const struct option *opts, const char *fmt, ...)
> +{
> +	va_list ap;
> +
> +	exit_browser(false);
> +
> +	va_start(ap, fmt);
> +	strbuf_addv(&error_buf, fmt, ap);
> +	va_end(ap);
> +
> +	usage_with_options_internal(usagestr, opts, 0, NULL);
> +	exit(129);
> +}
> +
>  int parse_options_usage(const char * const *usagestr,
>  			const struct option *opts,
>  			const char *optstr, bool short_opt)
> diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
> index 182c86099330..a8e407bc251e 100644
> --- a/tools/perf/util/parse-options.h
> +++ b/tools/perf/util/parse-options.h
> @@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
>  
>  extern NORETURN void usage_with_options(const char * const *usagestr,
>                                          const struct option *options);
> +extern NORETURN __attribute__((format(printf,3,4)))
> +void usage_with_options_msg(const char * const *usagestr,
> +			    const struct option *options,
> +			    const char *fmt, ...);
>  
>  /*----- incremantal advanced APIs -----*/
>  
> diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
> index 4abe23550c73..25671fa16618 100644
> --- a/tools/perf/util/strbuf.c
> +++ b/tools/perf/util/strbuf.c
> @@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
>  	strbuf_setlen(sb, sb->len + len);
>  }
>  
> -void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
> +void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
>  {
>  	int len;
> -	va_list ap;
> +	va_list ap_saved;
>  
>  	if (!strbuf_avail(sb))
>  		strbuf_grow(sb, 64);
> -	va_start(ap, fmt);
> +
> +	va_copy(ap_saved, ap);
>  	len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
> -	va_end(ap);
>  	if (len < 0)
>  		die("your vsnprintf is broken");
>  	if (len > strbuf_avail(sb)) {
>  		strbuf_grow(sb, len);
> -		va_start(ap, fmt);
> -		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
> -		va_end(ap);
> +		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
> +		va_end(ap_saved);
>  		if (len > strbuf_avail(sb)) {
>  			die("this should not happen, your vsnprintf is broken");
>  		}
> @@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
>  	strbuf_setlen(sb, sb->len + len);
>  }
>  
> +void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
> +{
> +	va_list ap;
> +
> +	va_start(ap, fmt);
> +	strbuf_addv(sb, fmt, ap);
> +	va_end(ap);
> +}
> +
>  ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
>  {
>  	size_t oldlen = sb->len;
> diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
> index 436ac319f6c7..529f2f035249 100644
> --- a/tools/perf/util/strbuf.h
> +++ b/tools/perf/util/strbuf.h
> @@ -39,6 +39,7 @@
>   */
>  
>  #include <assert.h>
> +#include <stdarg.h>
>  
>  extern char strbuf_slopbuf[];
>  struct strbuf {
> @@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
>  
>  __attribute__((format(printf,2,3)))
>  extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
> +extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
>  
>  /* XXX: if read fails, any partial read is undone */
>  extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
> -- 
> 2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1256341 — RE: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-10-27 00:20 +0100
SubjectRE: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()
Message-ID<qnZdw-60t-13@gated-at.bofh.it>
In reply to#1255215
PkZyb206IE5hbWh5dW5nIEtpbSBbbWFpbHRvOm5hbWh5dW5nQGdtYWlsLmNvbV0gT24gQmVoYWxm
IE9mIE5hbWh5dW5nIEtpbQ0KPg0KPk5vdyB1c2FnZV93aXRoX29wdGlvbnMoKSBzZXR1cCBhIHBh
Z2VyIGJlZm9yZSBwcmludGluZyBtZXNzYWdlIHNvIG5vcm1hbA0KPnByaW50ZigpIG9yIHByX2Vy
cigpIHdpbGwgbm90IGJlIHNob3duLiAgVGhlIHVzYWdlX3dpdGhfb3B0aW9uc19tc2coKQ0KPmNh
biBiZSB1c2VkIHRvIHByaW50IHNvbWUgaGVscCBtZXNzYWdlIGJlZm9yZSB1c2FnZSBzdHJpbmdz
Lg0KDQpUaGFua3MhIGxvb2tzIGdvb2QgdG8gbWUgIDopDQoNCkFja2VkLWJ5OiBNYXNhbWkgSGly
YW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KDQoNCj4NCj5DYzogTWFz
YW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCj5TaWduZWQt
b2ZmLWJ5OiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5nQGtlcm5lbC5vcmc+DQo+LS0tDQo+IHRvb2xz
L3BlcmYvYnVpbHRpbi1ldmxpc3QuYyAgICAgfCAgNCArKy0tDQo+IHRvb2xzL3BlcmYvYnVpbHRp
bi1wcm9iZS5jICAgICAgfCAyMCArKysrKysrKysrKystLS0tLS0tLQ0KPiB0b29scy9wZXJmL2J1
aWx0aW4tcmVjb3JkLmMgICAgIHwgMTEgKysrKysrLS0tLS0NCj4gdG9vbHMvcGVyZi9idWlsdGlu
LXNjaGVkLmMgICAgICB8ICA0ICsrLS0NCj4gdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jICAg
ICB8ICA4ICsrKystLS0tDQo+IHRvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMgfCAxNSAr
KysrKysrKysrKysrKysNCj4gdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaCB8ICA0ICsr
KysNCj4gdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jICAgICAgICB8IDIyICsrKysrKysrKysrKysr
Ky0tLS0tLS0NCj4gdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oICAgICAgICB8ICAyICsrDQo+IDkg
ZmlsZXMgY2hhbmdlZCwgNjIgaW5zZXJ0aW9ucygrKSwgMjggZGVsZXRpb25zKC0pDQo+DQo+ZGlm
ZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRp
bi1ldmxpc3QuYw0KPmluZGV4IDY5NWVjNWE1MGNmMi4uZjRkNjI1MTBhY2JiIDEwMDY0NA0KPi0t
LSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYw0KPisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRp
bi1ldmxpc3QuYw0KPkBAIC02MSw4ICs2MSw4IEBAIGludCBjbWRfZXZsaXN0KGludCBhcmdjLCBj
b25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJ
CXVzYWdlX3dpdGhfb3B0aW9ucyhldmxpc3RfdXNhZ2UsIG9wdGlvbnMpOw0KPg0KPiAJaWYgKGRl
dGFpbHMuZXZlbnRfZ3JvdXAgJiYgKGRldGFpbHMudmVyYm9zZSB8fCBkZXRhaWxzLmZyZXEpKSB7
DQo+LQkJcHJfZXJyKCItLWdyb3VwIG9wdGlvbiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVy
IG9wdGlvbnNcbiIpOw0KPi0JCXVzYWdlX3dpdGhfb3B0aW9ucyhldmxpc3RfdXNhZ2UsIG9wdGlv
bnMpOw0KPisJCXVzYWdlX3dpdGhfb3B0aW9uc19tc2coZXZsaXN0X3VzYWdlLCBvcHRpb25zLA0K
PisJCQkiLS1ncm91cCBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBvcHRpb25z
XG4iKTsNCj4gCX0NCj4NCj4gCXJldHVybiBfX2NtZF9ldmxpc3QoaW5wdXRfbmFtZSwgJmRldGFp
bHMpOw0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3Bl
cmYvYnVpbHRpbi1wcm9iZS5jDQo+aW5kZXggNTMwYzNhMjhhNThjLi4xMzJhZmM5NzY3NmMgMTAw
NjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMNCj4rKysgYi90b29scy9wZXJm
L2J1aWx0aW4tcHJvYmUuYw0KPkBAIC01MjgsMTIgKzUyOCwxMiBAQCBfX2NtZF9wcm9iZShpbnQg
YXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNl
ZCkNCj4gCQkJICAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsNCj4gCWlmIChhcmdj
ID4gMCkgew0KPiAJCWlmIChzdHJjbXAoYXJndlswXSwgIi0iKSA9PSAwKSB7DQo+LQkJCXByX3dh
cm5pbmcoIiAgRXJyb3I6ICctJyBpcyBub3Qgc3VwcG9ydGVkLlxuIik7DQo+LQkJCXVzYWdlX3dp
dGhfb3B0aW9ucyhwcm9iZV91c2FnZSwgb3B0aW9ucyk7DQo+KwkJCXVzYWdlX3dpdGhfb3B0aW9u
c19tc2cocHJvYmVfdXNhZ2UsIG9wdGlvbnMsDQo+KwkJCQkiJy0nIGlzIG5vdCBzdXBwb3J0ZWQu
XG4iKTsNCj4gCQl9DQo+IAkJaWYgKHBhcmFtcy5jb21tYW5kICYmIHBhcmFtcy5jb21tYW5kICE9
ICdhJykgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9yOiBhbm90aGVyIGNvbW1hbmQgZXhjZXB0
IC0tYWRkIGlzIHNldC5cbiIpOw0KPi0JCQl1c2FnZV93aXRoX29wdGlvbnMocHJvYmVfdXNhZ2Us
IG9wdGlvbnMpOw0KPisJCQl1c2FnZV93aXRoX29wdGlvbnNfbXNnKHByb2JlX3VzYWdlLCBvcHRp
b25zLA0KPisJCQkJImFub3RoZXIgY29tbWFuZCBleGNlcHQgLS1hZGQgaXMgc2V0LlxuIik7DQo+
IAkJfQ0KPiAJCXJldCA9IHBhcnNlX3Byb2JlX2V2ZW50X2FyZ3YoYXJnYywgYXJndik7DQo+IAkJ
aWYgKHJldCA8IDApIHsNCj5AQCAtNTYyLDggKzU2MiwxMCBAQCBfX2NtZF9wcm9iZShpbnQgYXJn
YywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNlZCkN
Cj4gCXN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsNCj4gCWNhc2UgJ2wnOg0KPiAJCWlmIChwYXJh
bXMudXByb2Jlcykgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9yOiBEb24ndCB1c2UgLS1saXN0
IHdpdGggLS1leGVjLlxuIik7DQo+LQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhwcm9iZV91c2FnZSwg
b3B0aW9ucyk7DQo+KwkJCXByX2VycigiICBFcnJvcjogRG9uJ3QgdXNlIC0tbGlzdCB3aXRoIC0t
ZXhlYy5cbiIpOw0KPisJCQlwYXJzZV9vcHRpb25zX3VzYWdlKHByb2JlX3VzYWdlLCBvcHRpb25z
LCAibCIsIHRydWUpOw0KPisJCQlwYXJzZV9vcHRpb25zX3VzYWdlKE5VTEwsIG9wdGlvbnMsICJ4
IiwgdHJ1ZSk7DQo+KwkJCXJldHVybiAtRUlOVkFMOw0KPiAJCX0NCj4gCQlyZXQgPSBzaG93X3Bl
cmZfcHJvYmVfZXZlbnRzKHBhcmFtcy5maWx0ZXIpOw0KPiAJCWlmIChyZXQgPCAwKQ0KPkBAIC02
MDMsOCArNjA1LDEwIEBAIF9fY21kX3Byb2JlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwg
Y29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJY2FzZSAnYSc6DQo+IAkJLyog
RW5zdXJlIHRoZSBsYXN0IGdpdmVuIHRhcmdldCBpcyB1c2VkICovDQo+IAkJaWYgKHBhcmFtcy50
YXJnZXQgJiYgIXBhcmFtcy50YXJnZXRfdXNlZCkgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9y
OiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsNCj4tCQkJdXNh
Z2Vfd2l0aF9vcHRpb25zKHByb2JlX3VzYWdlLCBvcHRpb25zKTsNCj4rCQkJcHJfZXJyKCIgIEVy
cm9yOiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsNCj4rCQkJ
cGFyc2Vfb3B0aW9uc191c2FnZShwcm9iZV91c2FnZSwgb3B0aW9ucywgIm0iLCB0cnVlKTsNCj4r
CQkJcGFyc2Vfb3B0aW9uc191c2FnZShOVUxMLCBvcHRpb25zLCAieCIsIHRydWUpOw0KPisJCQly
ZXR1cm4gLUVJTlZBTDsNCj4gCQl9DQo+DQo+IAkJcmV0ID0gcGVyZl9hZGRfcHJvYmVfZXZlbnRz
KHBhcmFtcy5ldmVudHMsIHBhcmFtcy5uZXZlbnRzKTsNCj5kaWZmIC0tZ2l0IGEvdG9vbHMvcGVy
Zi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jDQo+aW5kZXgg
Mjc0MGQ3YTgyYWU4Li5kZTAyMjY3YzczZDggMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi9idWls
dGluLXJlY29yZC5jDQo+KysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jDQo+QEAgLTEx
MzUsMTQgKzExMzUsMTUgQEAgaW50IGNtZF9yZWNvcmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiph
cmd2LCBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpDQo+IAkJdXNhZ2Vfd2l0aF9v
cHRpb25zKHJlY29yZF91c2FnZSwgcmVjb3JkX29wdGlvbnMpOw0KPg0KPiAJaWYgKG5yX2Nncm91
cHMgJiYgIXJlYy0+b3B0cy50YXJnZXQuc3lzdGVtX3dpZGUpIHsNCj4tCQl1aV9fZXJyb3IoImNn
cm91cCBtb25pdG9yaW5nIG9ubHkgYXZhaWxhYmxlIGluIg0KPi0JCQkgICIgc3lzdGVtLXdpZGUg
bW9kZVxuIik7DQo+LQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlY29yZF91c2FnZSwgcmVjb3JkX29w
dGlvbnMpOw0KPisJCXVzYWdlX3dpdGhfb3B0aW9uc19tc2cocmVjb3JkX3VzYWdlLCByZWNvcmRf
b3B0aW9ucywNCj4rCQkJImNncm91cCBtb25pdG9yaW5nIG9ubHkgYXZhaWxhYmxlIGluIHN5c3Rl
bS13aWRlIG1vZGUiKTsNCj4rDQo+IAl9DQo+IAlpZiAocmVjLT5vcHRzLnJlY29yZF9zd2l0Y2hf
ZXZlbnRzICYmDQo+IAkgICAgIXBlcmZfY2FuX3JlY29yZF9zd2l0Y2hfZXZlbnRzKCkpIHsNCj4t
CQl1aV9fZXJyb3IoImtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHJlY29yZGluZyBjb250ZXh0IHN3
aXRjaCBldmVudHMgKC0tc3dpdGNoLWV2ZW50cyBvcHRpb24pXG4iKTsNCj4tCQl1c2FnZV93aXRo
X29wdGlvbnMocmVjb3JkX3VzYWdlLCByZWNvcmRfb3B0aW9ucyk7DQo+KwkJdWlfX2Vycm9yKCJr
ZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCByZWNvcmRpbmcgY29udGV4dCBzd2l0Y2ggZXZlbnRzXG4i
KTsNCj4rCQlwYXJzZV9vcHRpb25zX3VzYWdlKHJlY29yZF91c2FnZSwgcmVjb3JkX29wdGlvbnMs
ICJzd2l0Y2gtZXZlbnRzIiwgMCk7DQo+KwkJcmV0dXJuIC1FSU5WQUw7DQo+IAl9DQo+DQo+IAlp
ZiAoIXJlYy0+aXRyKSB7DQo+ZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5j
IGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMNCj5pbmRleCAzMzk2MjYxMmE1ZTkuLjBlZTZk
OTAwZTEwMCAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYw0KPisrKyBi
L3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jDQo+QEAgLTE3MjgsOCArMTcyOCw4IEBAIHN0YXRp
YyB2b2lkIHNldHVwX3NvcnRpbmcoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLCBjb25zdCBzdHJ1
Y3Qgb3B0aW9uICpvcHRpb25zDQo+IAlmb3IgKHRvayA9IHN0cnRva19yKHN0ciwgIiwgIiwgJnRt
cCk7DQo+IAkJCXRvazsgdG9rID0gc3RydG9rX3IoTlVMTCwgIiwgIiwgJnRtcCkpIHsNCj4gCQlp
ZiAoc29ydF9kaW1lbnNpb25fX2FkZCh0b2ssICZzY2hlZC0+c29ydF9saXN0KSA8IDApIHsNCj4t
CQkJZXJyb3IoIlVua25vd24gLS1zb3J0IGtleTogYCVzJyIsIHRvayk7DQo+LQkJCXVzYWdlX3dp
dGhfb3B0aW9ucyh1c2FnZV9tc2csIG9wdGlvbnMpOw0KPisJCQl1c2FnZV93aXRoX29wdGlvbnNf
bXNnKHVzYWdlX21zZywgb3B0aW9ucywNCj4rCQkJCQkiVW5rbm93biAtLXNvcnQga2V5OiBgJXMn
IiwgdG9rKTsNCj4gCQl9DQo+IAl9DQo+DQo+ZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRp
bi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYw0KPmluZGV4IDI2NTNjMDI3
M2I4OS4uMjc4YWNiMjJmMDI5IDEwMDY0NA0KPi0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3Jp
cHQuYw0KPisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYw0KPkBAIC0xNzY3LDkgKzE3
NjcsOSBAQCBpbnQgY21kX3NjcmlwdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0
IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNlZCkNCj4gCQlyZXBfc2NyaXB0X3BhdGggPSBnZXRf
c2NyaXB0X3BhdGgoYXJndlswXSwgUkVQT1JUX1NVRkZJWCk7DQo+DQo+IAkJaWYgKCFyZWNfc2Ny
aXB0X3BhdGggJiYgIXJlcF9zY3JpcHRfcGF0aCkgew0KPi0JCQlmcHJpbnRmKHN0ZGVyciwgIiBD
b3VsZG4ndCBmaW5kIHNjcmlwdCAlc1xuXG4gU2VlIHBlcmYiDQo+KwkJCXVzYWdlX3dpdGhfb3B0
aW9uc19tc2coc2NyaXB0X3VzYWdlLCBvcHRpb25zLA0KPisJCQkJIkNvdWxkbid0IGZpbmQgc2Ny
aXB0IGAlcydcblxuIFNlZSBwZXJmIg0KPiAJCQkJIiBzY3JpcHQgLWwgZm9yIGF2YWlsYWJsZSBz
Y3JpcHRzLlxuIiwgYXJndlswXSk7DQo+LQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY3JpcHRfdXNh
Z2UsIG9wdGlvbnMpOw0KPiAJCX0NCj4NCj4gCQlpZiAoaXNfdG9wX3NjcmlwdChhcmd2WzBdKSkg
ew0KPkBAIC0xNzgwLDEwICsxNzgwLDEwIEBAIGludCBjbWRfc2NyaXB0KGludCBhcmdjLCBjb25z
dCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJCQly
ZXBfYXJncyA9IGhhc19yZXF1aXJlZF9hcmcocmVwX3NjcmlwdF9wYXRoKTsNCj4gCQkJcmVjX2Fy
Z3MgPSAoYXJnYyAtIDEpIC0gcmVwX2FyZ3M7DQo+IAkJCWlmIChyZWNfYXJncyA8IDApIHsNCj4t
CQkJCWZwcmludGYoc3RkZXJyLCAiICVzIHNjcmlwdCByZXF1aXJlcyBvcHRpb25zLiINCj4rCQkJ
CXVzYWdlX3dpdGhfb3B0aW9uc19tc2coc2NyaXB0X3VzYWdlLCBvcHRpb25zLA0KPisJCQkJCSJg
JXMnIHNjcmlwdCByZXF1aXJlcyBvcHRpb25zLiINCj4gCQkJCQkiXG5cbiBTZWUgcGVyZiBzY3Jp
cHQgLWwgZm9yIGF2YWlsYWJsZSAiDQo+IAkJCQkJInNjcmlwdHMgYW5kIG9wdGlvbnMuXG4iLCBh
cmd2WzBdKTsNCj4tCQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY3JpcHRfdXNhZ2UsIG9wdGlvbnMp
Ow0KPiAJCQl9DQo+IAkJfQ0KPg0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2Ut
b3B0aW9ucy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYw0KPmluZGV4IGVlZWVk
OThlYjI2ZC4uMjMwZTc3MTQwN2EzIDEwMDY0NA0KPi0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJz
ZS1vcHRpb25zLmMNCj4rKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jDQo+QEAg
LTc2MCw2ICs3NjAsMjEgQEAgdm9pZCB1c2FnZV93aXRoX29wdGlvbnMoY29uc3QgY2hhciAqIGNv
bnN0ICp1c2FnZXN0ciwNCj4gCWV4aXQoMTI5KTsNCj4gfQ0KPg0KPit2b2lkIHVzYWdlX3dpdGhf
b3B0aW9uc19tc2coY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwNCj4rCQkJICAgIGNvbnN0
IHN0cnVjdCBvcHRpb24gKm9wdHMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KPit7DQo+Kwl2YV9s
aXN0IGFwOw0KPisNCj4rCWV4aXRfYnJvd3NlcihmYWxzZSk7DQo+Kw0KPisJdmFfc3RhcnQoYXAs
IGZtdCk7DQo+KwlzdHJidWZfYWRkdigmZXJyb3JfYnVmLCBmbXQsIGFwKTsNCj4rCXZhX2VuZChh
cCk7DQo+Kw0KPisJdXNhZ2Vfd2l0aF9vcHRpb25zX2ludGVybmFsKHVzYWdlc3RyLCBvcHRzLCAw
LCBOVUxMKTsNCj4rCWV4aXQoMTI5KTsNCj4rfQ0KPisNCj4gaW50IHBhcnNlX29wdGlvbnNfdXNh
Z2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwNCj4gCQkJY29uc3Qgc3RydWN0IG9wdGlv
biAqb3B0cywNCj4gCQkJY29uc3QgY2hhciAqb3B0c3RyLCBib29sIHNob3J0X29wdCkNCj5kaWZm
IC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaCBiL3Rvb2xzL3BlcmYvdXRp
bC9wYXJzZS1vcHRpb25zLmgNCj5pbmRleCAxODJjODYwOTkzMzAuLmE4ZTQwN2JjMjUxZSAxMDA2
NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oDQo+KysrIGIvdG9vbHMv
cGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaA0KPkBAIC0xNjEsNiArMTYxLDEwIEBAIGV4dGVybiBp
bnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwN
Cj4NCj4gZXh0ZXJuIE5PUkVUVVJOIHZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zKGNvbnN0IGNoYXIg
KiBjb25zdCAqdXNhZ2VzdHIsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsNCj4rZXh0ZXJuIE5PUkVUVVJOIF9f
YXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMyw0KSkpDQo+K3ZvaWQgdXNhZ2Vfd2l0aF9vcHRp
b25zX21zZyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLA0KPisJCQkgICAgY29uc3Qgc3Ry
dWN0IG9wdGlvbiAqb3B0aW9ucywNCj4rCQkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsNCj4N
Cj4gLyotLS0tLSBpbmNyZW1hbnRhbCBhZHZhbmNlZCBBUElzIC0tLS0tKi8NCj4NCj5kaWZmIC0t
Z2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5j
DQo+aW5kZXggNGFiZTIzNTUwYzczLi4yNTY3MWZhMTY2MTggMTAwNjQ0DQo+LS0tIGEvdG9vbHMv
cGVyZi91dGlsL3N0cmJ1Zi5jDQo+KysrIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jDQo+QEAg
LTgyLDIzICs4MiwyMiBAQCB2b2lkIHN0cmJ1Zl9hZGQoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0
IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pDQo+IAlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsg
bGVuKTsNCj4gfQ0KPg0KPi12b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25z
dCBjaGFyICpmbXQsIC4uLikNCj4rdm9pZCBzdHJidWZfYWRkdihzdHJ1Y3Qgc3RyYnVmICpzYiwg
Y29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQ0KPiB7DQo+IAlpbnQgbGVuOw0KPi0JdmFfbGlz
dCBhcDsNCj4rCXZhX2xpc3QgYXBfc2F2ZWQ7DQo+DQo+IAlpZiAoIXN0cmJ1Zl9hdmFpbChzYikp
DQo+IAkJc3RyYnVmX2dyb3coc2IsIDY0KTsNCj4tCXZhX3N0YXJ0KGFwLCBmbXQpOw0KPisNCj4r
CXZhX2NvcHkoYXBfc2F2ZWQsIGFwKTsNCj4gCWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2It
Pmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwgZm10LCBhcCk7DQo+LQl2YV9lbmQoYXApOw0KPiAJ
aWYgKGxlbiA8IDApDQo+IAkJZGllKCJ5b3VyIHZzbnByaW50ZiBpcyBicm9rZW4iKTsNCj4gCWlm
IChsZW4gPiBzdHJidWZfYXZhaWwoc2IpKSB7DQo+IAkJc3RyYnVmX2dyb3coc2IsIGxlbik7DQo+
LQkJdmFfc3RhcnQoYXAsIGZtdCk7DQo+LQkJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+
bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsNCj4tCQl2YV9lbmQoYXApOw0KPisJ
CWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2ItPmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwg
Zm10LCBhcF9zYXZlZCk7DQo+KwkJdmFfZW5kKGFwX3NhdmVkKTsNCj4gCQlpZiAobGVuID4gc3Ry
YnVmX2F2YWlsKHNiKSkgew0KPiAJCQlkaWUoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHlvdXIg
dnNucHJpbnRmIGlzIGJyb2tlbiIpOw0KPiAJCX0NCj5AQCAtMTA2LDYgKzEwNSwxNSBAQCB2b2lk
IHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikNCj4g
CXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOw0KPiB9DQo+DQo+K3ZvaWQgc3RyYnVm
X2FkZGYoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KPit7DQo+Kwl2
YV9saXN0IGFwOw0KPisNCj4rCXZhX3N0YXJ0KGFwLCBmbXQpOw0KPisJc3RyYnVmX2FkZHYoc2Is
IGZtdCwgYXApOw0KPisJdmFfZW5kKGFwKTsNCj4rfQ0KPisNCj4gc3NpemVfdCBzdHJidWZfcmVh
ZChzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGZkLCBzc2l6ZV90IGhpbnQpDQo+IHsNCj4gCXNpemVf
dCBvbGRsZW4gPSBzYi0+bGVuOw0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3RyYnVm
LmggYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj5pbmRleCA0MzZhYzMxOWY2YzcuLjUyOWYy
ZjAzNTI0OSAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj4rKysgYi90
b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj5AQCAtMzksNiArMzksNyBAQA0KPiAgKi8NCj4NCj4g
I2luY2x1ZGUgPGFzc2VydC5oPg0KPisjaW5jbHVkZSA8c3RkYXJnLmg+DQo+DQo+IGV4dGVybiBj
aGFyIHN0cmJ1Zl9zbG9wYnVmW107DQo+IHN0cnVjdCBzdHJidWYgew0KPkBAIC04NSw2ICs4Niw3
IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkc3RyKHN0cnVjdCBzdHJidWYgKnNiLCBj
b25zdCBjaGFyICpzKSB7DQo+DQo+IF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkp
DQo+IGV4dGVybiB2b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFy
ICpmbXQsIC4uLik7DQo+K2V4dGVybiB2b2lkIHN0cmJ1Zl9hZGR2KHN0cnVjdCBzdHJidWYgKnNi
LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOw0KPg0KPiAvKiBYWFg6IGlmIHJlYWQgZmFp
bHMsIGFueSBwYXJ0aWFsIHJlYWQgaXMgdW5kb25lICovDQo+IGV4dGVybiBzc2l6ZV90IHN0cmJ1
Zl9yZWFkKHN0cnVjdCBzdHJidWYgKiwgaW50IGZkLCBzc2l6ZV90IGhpbnQpOw0KPi0tDQo+Mi42
LjANCg0K
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1256736 — Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2015-10-27 13:40 +0100
SubjectRe: [PATCH 4/4] perf tools: Introduce usage_with_options_msg()
Message-ID<qobHJ-5cG-33@gated-at.bofh.it>
In reply to#1256341
Em Mon, Oct 26, 2015 at 11:13:32PM +0000, 平松雅巳 / HIRAMATU,MASAMI escreveu:
> >From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim
> >
> >Now usage_with_options() setup a pager before printing message so normal
> >printf() or pr_err() will not be shown.  The usage_with_options_msg()
> >can be used to print some help message before usage strings.
> 
> Thanks! looks good to me  :)
> 
> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

Thanks, applied.

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1258700 — [tip:perf/core] perf tools: Introduce usage_with_options_msg()

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-10-29 10:50 +0100
Subject[tip:perf/core] perf tools: Introduce usage_with_options_msg()
Message-ID<qoS0j-6Ul-41@gated-at.bofh.it>
In reply to#1255215
Commit-ID:  c71183697250b356be6c7c1abc2e9a74073e1dca
Gitweb:     http://git.kernel.org/tip/c71183697250b356be6c7c1abc2e9a74073e1dca
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:27 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 27 Oct 2015 09:28:44 -0300

perf tools: Introduce usage_with_options_msg()

Now usage_with_options() setup a pager before printing message so normal
printf() or pr_err() will not be shown.  The usage_with_options_msg()
can be used to print some help message before usage strings.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-evlist.c     |  4 ++--
 tools/perf/builtin-probe.c      | 20 ++++++++++++--------
 tools/perf/builtin-record.c     | 11 ++++++-----
 tools/perf/builtin-sched.c      |  4 ++--
 tools/perf/builtin-script.c     |  8 ++++----
 tools/perf/util/parse-options.c | 15 +++++++++++++++
 tools/perf/util/parse-options.h |  4 ++++
 tools/perf/util/strbuf.c        | 22 +++++++++++++++-------
 tools/perf/util/strbuf.h        |  2 ++
 9 files changed, 62 insertions(+), 28 deletions(-)

diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
index 695ec5a..f4d6251 100644
--- a/tools/perf/builtin-evlist.c
+++ b/tools/perf/builtin-evlist.c
@@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
 		usage_with_options(evlist_usage, options);
 
 	if (details.event_group && (details.verbose || details.freq)) {
-		pr_err("--group option is not compatible with other options\n");
-		usage_with_options(evlist_usage, options);
+		usage_with_options_msg(evlist_usage, options,
+			"--group option is not compatible with other options\n");
 	}
 
 	return __cmd_evlist(input_name, &details);
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 530c3a2..132afc9 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 	if (argc > 0) {
 		if (strcmp(argv[0], "-") == 0) {
-			pr_warning("  Error: '-' is not supported.\n");
-			usage_with_options(probe_usage, options);
+			usage_with_options_msg(probe_usage, options,
+				"'-' is not supported.\n");
 		}
 		if (params.command && params.command != 'a') {
-			pr_warning("  Error: another command except --add is set.\n");
-			usage_with_options(probe_usage, options);
+			usage_with_options_msg(probe_usage, options,
+				"another command except --add is set.\n");
 		}
 		ret = parse_probe_event_argv(argc, argv);
 		if (ret < 0) {
@@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 	switch (params.command) {
 	case 'l':
 		if (params.uprobes) {
-			pr_warning("  Error: Don't use --list with --exec.\n");
-			usage_with_options(probe_usage, options);
+			pr_err("  Error: Don't use --list with --exec.\n");
+			parse_options_usage(probe_usage, options, "l", true);
+			parse_options_usage(NULL, options, "x", true);
+			return -EINVAL;
 		}
 		ret = show_perf_probe_events(params.filter);
 		if (ret < 0)
@@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 	case 'a':
 		/* Ensure the last given target is used */
 		if (params.target && !params.target_used) {
-			pr_warning("  Error: -x/-m must follow the probe definitions.\n");
-			usage_with_options(probe_usage, options);
+			pr_err("  Error: -x/-m must follow the probe definitions.\n");
+			parse_options_usage(probe_usage, options, "m", true);
+			parse_options_usage(NULL, options, "x", true);
+			return -EINVAL;
 		}
 
 		ret = perf_add_probe_events(params.events, params.nevents);
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2740d7a..de02267 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
 		usage_with_options(record_usage, record_options);
 
 	if (nr_cgroups && !rec->opts.target.system_wide) {
-		ui__error("cgroup monitoring only available in"
-			  " system-wide mode\n");
-		usage_with_options(record_usage, record_options);
+		usage_with_options_msg(record_usage, record_options,
+			"cgroup monitoring only available in system-wide mode");
+
 	}
 	if (rec->opts.record_switch_events &&
 	    !perf_can_record_switch_events()) {
-		ui__error("kernel does not support recording context switch events (--switch-events option)\n");
-		usage_with_options(record_usage, record_options);
+		ui__error("kernel does not support recording context switch events\n");
+		parse_options_usage(record_usage, record_options, "switch-events", 0);
+		return -EINVAL;
 	}
 
 	if (!rec->itr) {
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 3396261..0ee6d90 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
 	for (tok = strtok_r(str, ", ", &tmp);
 			tok; tok = strtok_r(NULL, ", ", &tmp)) {
 		if (sort_dimension__add(tok, &sched->sort_list) < 0) {
-			error("Unknown --sort key: `%s'", tok);
-			usage_with_options(usage_msg, options);
+			usage_with_options_msg(usage_msg, options,
+					"Unknown --sort key: `%s'", tok);
 		}
 	}
 
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 2653c02..278acb2 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
 		rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
 
 		if (!rec_script_path && !rep_script_path) {
-			fprintf(stderr, " Couldn't find script %s\n\n See perf"
+			usage_with_options_msg(script_usage, options,
+				"Couldn't find script `%s'\n\n See perf"
 				" script -l for available scripts.\n", argv[0]);
-			usage_with_options(script_usage, options);
 		}
 
 		if (is_top_script(argv[0])) {
@@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
 			rep_args = has_required_arg(rep_script_path);
 			rec_args = (argc - 1) - rep_args;
 			if (rec_args < 0) {
-				fprintf(stderr, " %s script requires options."
+				usage_with_options_msg(script_usage, options,
+					"`%s' script requires options."
 					"\n\n See perf script -l for available "
 					"scripts and options.\n", argv[0]);
-				usage_with_options(script_usage, options);
 			}
 		}
 
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index eeeed98..230e771 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
 	exit(129);
 }
 
+void usage_with_options_msg(const char * const *usagestr,
+			    const struct option *opts, const char *fmt, ...)
+{
+	va_list ap;
+
+	exit_browser(false);
+
+	va_start(ap, fmt);
+	strbuf_addv(&error_buf, fmt, ap);
+	va_end(ap);
+
+	usage_with_options_internal(usagestr, opts, 0, NULL);
+	exit(129);
+}
+
 int parse_options_usage(const char * const *usagestr,
 			const struct option *opts,
 			const char *optstr, bool short_opt)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 182c860..a8e407b 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
 
 extern NORETURN void usage_with_options(const char * const *usagestr,
                                         const struct option *options);
+extern NORETURN __attribute__((format(printf,3,4)))
+void usage_with_options_msg(const char * const *usagestr,
+			    const struct option *options,
+			    const char *fmt, ...);
 
 /*----- incremantal advanced APIs -----*/
 
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index 4abe235..25671fa 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
 	strbuf_setlen(sb, sb->len + len);
 }
 
-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
 {
 	int len;
-	va_list ap;
+	va_list ap_saved;
 
 	if (!strbuf_avail(sb))
 		strbuf_grow(sb, 64);
-	va_start(ap, fmt);
+
+	va_copy(ap_saved, ap);
 	len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-	va_end(ap);
 	if (len < 0)
 		die("your vsnprintf is broken");
 	if (len > strbuf_avail(sb)) {
 		strbuf_grow(sb, len);
-		va_start(ap, fmt);
-		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-		va_end(ap);
+		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
+		va_end(ap_saved);
 		if (len > strbuf_avail(sb)) {
 			die("this should not happen, your vsnprintf is broken");
 		}
@@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
 	strbuf_setlen(sb, sb->len + len);
 }
 
+void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+	strbuf_addv(sb, fmt, ap);
+	va_end(ap);
+}
+
 ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
 {
 	size_t oldlen = sb->len;
diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
index 436ac31..529f2f0 100644
--- a/tools/perf/util/strbuf.h
+++ b/tools/perf/util/strbuf.h
@@ -39,6 +39,7 @@
  */
 
 #include <assert.h>
+#include <stdarg.h>
 
 extern char strbuf_slopbuf[];
 struct strbuf {
@@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
 
 __attribute__((format(printf,2,3)))
 extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
+extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
 
 /* XXX: if read fails, any partial read is undone */
 extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1255216 — [PATCH 3/4] perf tools: Setup pager when printing usage and help

FromNamhyung Kim <namhyung@kernel.org>
Date2015-10-24 17:50 +0200
Subject[PATCH 3/4] perf tools: Setup pager when printing usage and help
Message-ID<qn9eV-4A2-11@gated-at.bofh.it>
In reply to#1255213
It's annoying to see error or help message when command has many options
like in perf record, report or top.  So setup pager when print parser
error or help message - it should be OK since no UI is enabled at the
parsing time.  The usage_with_options() already disables it by calling
exit_browser() anyway.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/parse-options.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index b8d98229a8af..eeeed98eb26d 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -7,6 +7,8 @@
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
+static struct strbuf error_buf = STRBUF_INIT;
+
 static int opterror(const struct option *opt, const char *reason, int flags)
 {
 	if (flags & OPT_SHORT)
@@ -540,9 +542,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
 		exit(130);
 	default: /* PARSE_OPT_UNKNOWN */
 		if (ctx.argv[0][1] == '-') {
-			error("unknown option `%s'", ctx.argv[0] + 2);
+			strbuf_addf(&error_buf, "unknown option `%s'",
+				    ctx.argv[0] + 2);
 		} else {
-			error("unknown switch `%c'", *ctx.opt);
+			strbuf_addf(&error_buf, "unknown switch `%c'",
+				    *ctx.opt);
 		}
 		usage_with_options(usagestr, options);
 	}
@@ -711,6 +715,13 @@ int usage_with_options_internal(const char * const *usagestr,
 	if (!usagestr)
 		return PARSE_OPT_HELP;
 
+	setup_pager();
+
+	if (strbuf_avail(&error_buf)) {
+		fprintf(stderr, "  Error: %s\n", error_buf.buf);
+		strbuf_release(&error_buf);
+	}
+
 	fprintf(stderr, "\n Usage: %s\n", *usagestr++);
 	while (*usagestr && **usagestr)
 		fprintf(stderr, "    or: %s\n", *usagestr++);
-- 
2.6.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1255316 — Re: [PATCH 3/4] perf tools: Setup pager when printing usage and help

FromIngo Molnar <mingo@kernel.org>
Date2015-10-25 10:10 +0100
SubjectRe: [PATCH 3/4] perf tools: Setup pager when printing usage and help
Message-ID<qnptn-mg-7@gated-at.bofh.it>
In reply to#1255216
* Namhyung Kim <namhyung@kernel.org> wrote:

> It's annoying to see error or help message when command has many options like in 
> perf record, report or top. [...]

That's indeed so.

> [...]  So setup pager when print parser error or help message - it should be OK 
> since no UI is enabled at the parsing time.  The usage_with_options() already 
> disables it by calling exit_browser() anyway.

So I wanted to write that this has a disadvantage as well, that the pager disrupts 
the regular 'timeline', 'append-only' visual flow of a regular shell workflow.

But then I tried your patches, and for short outputs (such as 'perf stat -h') the 
pager is not activated, while for longer output (such as 'perf report -h') it's 
activated.

That's very intuitive:

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1258702 — [tip:perf/core] perf tools: Setup pager when printing usage and help

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-10-29 10:50 +0100
Subject[tip:perf/core] perf tools: Setup pager when printing usage and help
Message-ID<qoS0j-6Ul-45@gated-at.bofh.it>
In reply to#1255216
Commit-ID:  01b19455c08cc37d1c3ef174524278e84c92fec1
Gitweb:     http://git.kernel.org/tip/01b19455c08cc37d1c3ef174524278e84c92fec1
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:26 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 14:08:48 -0300

perf tools: Setup pager when printing usage and help

It's annoying to see error or help message when command has many options
like in perf record, report or top.  So setup pager when print parser
error or help message - it should be OK since no UI is enabled at the
parsing time.  The usage_with_options() already disables it by calling
exit_browser() anyway.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-3-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/parse-options.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index b8d9822..eeeed98 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -7,6 +7,8 @@
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
+static struct strbuf error_buf = STRBUF_INIT;
+
 static int opterror(const struct option *opt, const char *reason, int flags)
 {
 	if (flags & OPT_SHORT)
@@ -540,9 +542,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
 		exit(130);
 	default: /* PARSE_OPT_UNKNOWN */
 		if (ctx.argv[0][1] == '-') {
-			error("unknown option `%s'", ctx.argv[0] + 2);
+			strbuf_addf(&error_buf, "unknown option `%s'",
+				    ctx.argv[0] + 2);
 		} else {
-			error("unknown switch `%c'", *ctx.opt);
+			strbuf_addf(&error_buf, "unknown switch `%c'",
+				    *ctx.opt);
 		}
 		usage_with_options(usagestr, options);
 	}
@@ -711,6 +715,13 @@ int usage_with_options_internal(const char * const *usagestr,
 	if (!usagestr)
 		return PARSE_OPT_HELP;
 
+	setup_pager();
+
+	if (strbuf_avail(&error_buf)) {
+		fprintf(stderr, "  Error: %s\n", error_buf.buf);
+		strbuf_release(&error_buf);
+	}
+
 	fprintf(stderr, "\n Usage: %s\n", *usagestr++);
 	while (*usagestr && **usagestr)
 		fprintf(stderr, "    or: %s\n", *usagestr++);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1255310

FromIngo Molnar <mingo@kernel.org>
Date2015-10-25 09:50 +0100
Message-ID<qnpa2-8lF-11@gated-at.bofh.it>
In reply to#1255213
* Namhyung Kim <namhyung@kernel.org> wrote:

> Currently if an option name is ambiguous it only prints first two
> matched option names but no help.  It'd be better it could show all
> possible names and help messages too.
> 
> Before:
>   $ perf report --show
>     Error: Ambiguous option: show (could be --show-total-period or
>                                             --show-ref-call-graph)
>    Usage: perf report [<options>]
> 
> After:
>   $ perf report --show
>     Error: Ambiguous option: show (could be --show-total-period or
>                                             --show-ref-call-graph)
>    Usage: perf report [<options>]
> 
>       -n, --show-nr-samples
>                               Show a column with the number of samples
>           --showcpuutilization
>                               Show sample percentage for different cpu modes
>       -I, --show-info         Display extended information about perf.data file
>           --show-total-period
>                               Show a column with the sum of periods
>           --show-ref-call-graph
>                               Show callgraph from reference event

Very nice touch!

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1258695 — [tip:perf/core] perf tools: Improve ambiguous option help message

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-10-29 10:50 +0100
Subject[tip:perf/core] perf tools: Improve ambiguous option help message
Message-ID<qoS0i-6Ul-29@gated-at.bofh.it>
In reply to#1255213
Commit-ID:  a5f4a6932ec2e1a53642e97a1be64bc7b169942f
Gitweb:     http://git.kernel.org/tip/a5f4a6932ec2e1a53642e97a1be64bc7b169942f
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:24 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 13:59:06 -0300

perf tools: Improve ambiguous option help message

Currently if an option name is ambiguous it only prints first two
matched option names but no help.  It'd be better it could show all
possible names and help messages too.

Before:
  $ perf report --show
    Error: Ambiguous option: show (could be --show-total-period or
                                            --show-ref-call-graph)
   Usage: perf report [<options>]

After:
  $ perf report --show
    Error: Ambiguous option: show (could be --show-total-period or
                                            --show-ref-call-graph)
   Usage: perf report [<options>]

      -n, --show-nr-samples
                              Show a column with the number of samples
          --showcpuutilization
                              Show sample percentage for different cpu modes
      -I, --show-info         Display extended information about perf.data file
          --show-total-period
                              Show a column with the sum of periods
          --show-ref-call-graph
                              Show callgraph from reference event

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/parse-options.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 22c2806..b8d9822 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -770,24 +770,23 @@ int parse_options_usage(const char * const *usagestr,
 opt:
 	for (  ; opts->type != OPTION_END; opts++) {
 		if (short_opt) {
-			if (opts->short_name == *optstr)
+			if (opts->short_name == *optstr) {
+				print_option_help(opts, 0);
 				break;
+			}
 			continue;
 		}
 
 		if (opts->long_name == NULL)
 			continue;
 
-		if (!prefixcmp(optstr, opts->long_name))
-			break;
-		if (!prefixcmp(optstr, "no-") &&
-		    !prefixcmp(optstr + 3, opts->long_name))
-			break;
+		if (!prefixcmp(opts->long_name, optstr))
+			print_option_help(opts, 0);
+		if (!prefixcmp("no-", optstr) &&
+		    !prefixcmp(opts->long_name, optstr + 3))
+			print_option_help(opts, 0);
 	}
 
-	if (opts->type != OPTION_END)
-		print_option_help(opts, 0);
-
 	return PARSE_OPT_HELP;
 }
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web