perf ftrace: Add 'trace' subcommand
authorNamhyung Kim <namhyung@kernel.org>
Wed, 15 Dec 2021 18:51:50 +0000 (10:51 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 16 Dec 2021 15:18:12 +0000 (12:18 -0300)
This is a preparation to add more sub-commands for ftrace.  The
'trace' subcommand does the same thing when no subcommand is given.

Committer testing:

The previous mode, i.e. no subcommand and the new 'perf ftrace trace'
are equivalent:

  # perf ftrace -G check_preempt_curr sleep 0.00001
  # tracer: function_graph
  #
  # CPU  DURATION                  FUNCTION CALLS
  # |     |   |                     |   |   |   |
   25)               |  check_preempt_curr() {
   25)               |    resched_curr() {
   25)               |      native_smp_send_reschedule() {
   25)               |        default_send_IPI_single_phys() {
   25)   0.110 us    |          __default_send_IPI_dest_field();
   25)   0.490 us    |        }
   25)   0.640 us    |      }
   25)   0.850 us    |    }
   25)   2.060 us    |  }
  # perf ftrace trace -G check_preempt_curr sleep 0.00001
  # tracer: function_graph
  #
  # CPU  DURATION                  FUNCTION CALLS
  # |     |   |                     |   |   |   |
   10)               |  check_preempt_curr() {
   10)               |    resched_curr() {
   10)               |      native_smp_send_reschedule() {
   10)               |        default_send_IPI_single_phys() {
   10)   0.080 us    |          __default_send_IPI_dest_field();
   10)   0.460 us    |        }
   10)   0.610 us    |      }
   10)   0.830 us    |    }
   10)   2.020 us    |  }
  #

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Changbin Du <changbin.du@gmail.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20211215185154.360314-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-ftrace.c

index 87cb11a..b28e762 100644 (file)
@@ -879,17 +879,7 @@ int cmd_ftrace(int argc, const char **argv)
                .tracer = DEFAULT_TRACER,
                .target = { .uid = UINT_MAX, },
        };
-       const char * const ftrace_usage[] = {
-               "perf ftrace [<options>] [<command>]",
-               "perf ftrace [<options>] -- <command> [<options>]",
-               NULL
-       };
-       const struct option ftrace_options[] = {
-       OPT_STRING('t', "tracer", &ftrace.tracer, "tracer",
-                  "Tracer to use: function_graph(default) or function"),
-       OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]",
-                            "Show available functions to filter",
-                            opt_list_avail_functions, "*"),
+       const struct option common_options[] = {
        OPT_STRING('p', "pid", &ftrace.target.pid, "pid",
                   "Trace on existing process id"),
        /* TODO: Add short option -t after -t/--tracer can be removed. */
@@ -901,6 +891,14 @@ int cmd_ftrace(int argc, const char **argv)
                    "System-wide collection from all CPUs"),
        OPT_STRING('C', "cpu", &ftrace.target.cpu_list, "cpu",
                    "List of cpus to monitor"),
+       OPT_END()
+       };
+       const struct option ftrace_options[] = {
+       OPT_STRING('t', "tracer", &ftrace.tracer, "tracer",
+                  "Tracer to use: function_graph(default) or function"),
+       OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]",
+                            "Show available functions to filter",
+                            opt_list_avail_functions, "*"),
        OPT_CALLBACK('T', "trace-funcs", &ftrace.filters, "func",
                     "Trace given functions using function tracer",
                     parse_filter_func),
@@ -923,7 +921,15 @@ int cmd_ftrace(int argc, const char **argv)
                    "Trace children processes"),
        OPT_UINTEGER('D', "delay", &ftrace.initial_delay,
                     "Number of milliseconds to wait before starting tracing after program start"),
-       OPT_END()
+       OPT_PARENT(common_options),
+       };
+
+       const char * const ftrace_usage[] = {
+               "perf ftrace [<options>] [<command>]",
+               "perf ftrace [<options>] -- [<command>] [<options>]",
+               "perf ftrace trace [<options>] [<command>]",
+               "perf ftrace trace [<options>] -- [<command>] [<options>]",
+               NULL
        };
 
        INIT_LIST_HEAD(&ftrace.filters);
@@ -935,6 +941,11 @@ int cmd_ftrace(int argc, const char **argv)
        if (ret < 0)
                return -1;
 
+       if (argc > 1 && !strcmp(argv[1], "trace")) {
+               argc--;
+               argv++;
+       }
+
        argc = parse_options(argc, argv, ftrace_options, ftrace_usage,
                            PARSE_OPT_STOP_AT_NON_OPTION);
        if (!argc && target__none(&ftrace.target))