Commit ea558c86 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo
Browse files

tools lib subcmd: Show parent options in help



I've just realized that help message in a subcommand didn't show one
in the parent command.  Since the option parser understands the parent,
display code should do the same.  For example, `perf ftrace latency -h`
should show options in the `perf ftrace` command too.

Before:

  $ perf ftrace latency -h

   Usage: perf ftrace [<options>] [<command>]
      or: perf ftrace [<options>] -- [<command>] [<options>]
      or: perf ftrace {trace|latency} [<options>] [<command>]
      or: perf ftrace {trace|latency} [<options>] -- [<command>] [<options>]

      -b, --use-bpf         Use BPF to measure function latency
      -n, --use-nsec        Use nano-second histogram
      -T, --trace-funcs <func>
                            Show latency of given function

After:

  $ perf ftrace latency -h

   Usage: perf ftrace [<options>] [<command>]
      or: perf ftrace [<options>] -- [<command>] [<options>]
      or: perf ftrace {trace|latency} [<options>] [<command>]
      or: perf ftrace {trace|latency} [<options>] -- [<command>] [<options>]

      -a, --all-cpus        System-wide collection from all CPUs
      -b, --use-bpf         Use BPF to measure function latency
      -C, --cpu <cpu>       List of cpus to monitor
      -n, --use-nsec        Use nano-second histogram
      -p, --pid <pid>       Trace on existing process id
      -T, --trace-funcs <func>
                            Show latency of given function
      -v, --verbose         Be more verbose
          --tid <tid>       Trace on existing thread id (exclusive to --pid)

Reviewed-by: default avatarIan Rogers <irogers@google.com>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240429233707.1511175-1-namhyung@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d9c5f5f9
Loading
Loading
Loading
Loading
+24 −12
Original line number Diff line number Diff line
@@ -808,18 +808,30 @@ static int option__cmp(const void *va, const void *vb)

static struct option *options__order(const struct option *opts)
{
	int nr_opts = 0, nr_group = 0, len;
	const struct option *o = opts;
	struct option *opt, *ordered, *group;
	int nr_opts = 0, nr_group = 0, nr_parent = 0, len;
	const struct option *o, *p = opts;
	struct option *opt, *ordered = NULL, *group;

	for (o = opts; o->type != OPTION_END; o++)
	/* flatten the options that have parents */
	for (p = opts; p != NULL; p = o->parent) {
		for (o = p; o->type != OPTION_END; o++)
			++nr_opts;

	len = sizeof(*o) * (nr_opts + 1);
	ordered = malloc(len);
	if (!ordered)
		/*
		 * the length is given by the number of options plus a null
		 * terminator for the last loop iteration.
		 */
		len = sizeof(*o) * (nr_opts + !o->parent);
		group = realloc(ordered, len);
		if (!group)
			goto out;
	memcpy(ordered, opts, len);
		ordered = group;
		memcpy(&ordered[nr_parent], p, sizeof(*o) * (nr_opts - nr_parent));

		nr_parent = nr_opts;
	}
	/* copy the last OPTION_END */
	memcpy(&ordered[nr_opts], o, sizeof(*o));

	/* sort each option group individually */
	for (opt = group = ordered; opt->type != OPTION_END; opt++) {