mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
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: Ian Rogers <irogers@google.com> Signed-off-by: Namhyung 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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
d9c5f5f94c
commit
ea558c8624
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user