Commit ae0f4eb3 authored by Wei Li's avatar Wei Li Committed by Arnaldo Carvalho de Melo

perf tools: Enhance the matching of sub-commands abbreviations

We support short command 'rec*' for 'record' and 'rep*' for 'report' in
lots of sub-commands, but the matching is not quite strict currnetly.

It may be puzzling sometime, like we mis-type a 'recport' to report but
it will perform 'record' in fact without any message.

To fix this, add a check to ensure that the short cmd is valid prefix
of the real command.

Committer testing:

  [root@quaco ~]# perf c2c re sleep 1

   Usage: perf c2c {record|report}

      -v, --verbose         be more verbose (show counter open errors, etc)

  # perf c2c rec sleep 1
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.038 MB perf.data (16 samples) ]
  # perf c2c recport sleep 1

   Usage: perf c2c {record|report}

      -v, --verbose         be more verbose (show counter open errors, etc)

  # perf c2c record sleep 1
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.038 MB perf.data (15 samples) ]
  # perf c2c records sleep 1

   Usage: perf c2c {record|report}

      -v, --verbose         be more verbose (show counter open errors, etc)

  #
Signed-off-by: default avatarWei Li <liwei391@huawei.com>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Hanjun Guo <guohanjun@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Rui Xiang <rui.xiang@huawei.com>
Link: http://lore.kernel.org/lkml/20220325092032.2956161-1-liwei391@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c2eeac98
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "../perf.h" #include "../perf.h"
#include "pmu.h" #include "pmu.h"
#include "pmu-hybrid.h" #include "pmu-hybrid.h"
#include "string2.h"
struct c2c_hists { struct c2c_hists {
struct hists hists; struct hists hists;
...@@ -3025,9 +3026,9 @@ int cmd_c2c(int argc, const char **argv) ...@@ -3025,9 +3026,9 @@ int cmd_c2c(int argc, const char **argv)
if (!argc) if (!argc)
usage_with_options(c2c_usage, c2c_options); usage_with_options(c2c_usage, c2c_options);
if (!strncmp(argv[0], "rec", 3)) { if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
return perf_c2c__record(argc, argv); return perf_c2c__record(argc, argv);
} else if (!strncmp(argv[0], "rep", 3)) { } else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
return perf_c2c__report(argc, argv); return perf_c2c__report(argc, argv);
} else { } else {
usage_with_options(c2c_usage, c2c_options); usage_with_options(c2c_usage, c2c_options);
......
...@@ -1946,7 +1946,7 @@ int cmd_kmem(int argc, const char **argv) ...@@ -1946,7 +1946,7 @@ int cmd_kmem(int argc, const char **argv)
kmem_page = 1; kmem_page = 1;
} }
if (!strncmp(argv[0], "rec", 3)) { if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
symbol__init(NULL); symbol__init(NULL);
return __cmd_record(argc, argv); return __cmd_record(argc, argv);
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "util/ordered-events.h" #include "util/ordered-events.h"
#include "util/kvm-stat.h" #include "util/kvm-stat.h"
#include "ui/ui.h" #include "ui/ui.h"
#include "util/string2.h"
#include <sys/prctl.h> #include <sys/prctl.h>
#ifdef HAVE_TIMERFD_SUPPORT #ifdef HAVE_TIMERFD_SUPPORT
...@@ -1500,10 +1501,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv) ...@@ -1500,10 +1501,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
goto perf_stat; goto perf_stat;
} }
if (!strncmp(argv[1], "rec", 3)) if (strlen(argv[1]) > 2 && strstarts("record", argv[1]))
return kvm_events_record(&kvm, argc - 1, argv + 1); return kvm_events_record(&kvm, argc - 1, argv + 1);
if (!strncmp(argv[1], "rep", 3)) if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
return kvm_events_report(&kvm, argc - 1 , argv + 1); return kvm_events_report(&kvm, argc - 1 , argv + 1);
#ifdef HAVE_TIMERFD_SUPPORT #ifdef HAVE_TIMERFD_SUPPORT
...@@ -1631,9 +1632,9 @@ int cmd_kvm(int argc, const char **argv) ...@@ -1631,9 +1632,9 @@ int cmd_kvm(int argc, const char **argv)
} }
} }
if (!strncmp(argv[0], "rec", 3)) if (strlen(argv[0]) > 2 && strstarts("record", argv[0]))
return __cmd_record(file_name, argc, argv); return __cmd_record(file_name, argc, argv);
else if (!strncmp(argv[0], "rep", 3)) else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
return __cmd_report(file_name, argc, argv); return __cmd_report(file_name, argc, argv);
else if (!strncmp(argv[0], "diff", 4)) else if (!strncmp(argv[0], "diff", 4))
return cmd_diff(argc, argv); return cmd_diff(argc, argv);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "util/session.h" #include "util/session.h"
#include "util/tool.h" #include "util/tool.h"
#include "util/data.h" #include "util/data.h"
#include "util/string2.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/prctl.h> #include <sys/prctl.h>
...@@ -1166,9 +1167,9 @@ int cmd_lock(int argc, const char **argv) ...@@ -1166,9 +1167,9 @@ int cmd_lock(int argc, const char **argv)
if (!argc) if (!argc)
usage_with_options(lock_usage, lock_options); usage_with_options(lock_usage, lock_options);
if (!strncmp(argv[0], "rec", 3)) { if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
return __cmd_record(argc, argv); return __cmd_record(argc, argv);
} else if (!strncmp(argv[0], "report", 6)) { } else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
trace_handler = &report_lock_ops; trace_handler = &report_lock_ops;
if (argc) { if (argc) {
argc = parse_options(argc, argv, argc = parse_options(argc, argv,
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "util/symbol.h" #include "util/symbol.h"
#include "util/pmu.h" #include "util/pmu.h"
#include "util/pmu-hybrid.h" #include "util/pmu-hybrid.h"
#include "util/string2.h"
#include <linux/err.h> #include <linux/err.h>
#define MEM_OPERATION_LOAD 0x1 #define MEM_OPERATION_LOAD 0x1
...@@ -496,9 +497,9 @@ int cmd_mem(int argc, const char **argv) ...@@ -496,9 +497,9 @@ int cmd_mem(int argc, const char **argv)
mem.input_name = "perf.data"; mem.input_name = "perf.data";
} }
if (!strncmp(argv[0], "rec", 3)) if (strlen(argv[0]) > 2 && strstarts("record", argv[0]))
return __cmd_record(argc, argv, &mem); return __cmd_record(argc, argv, &mem);
else if (!strncmp(argv[0], "rep", 3)) else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
return report_events(argc, argv, &mem); return report_events(argc, argv, &mem);
else else
usage_with_options(mem_usage, mem_options); usage_with_options(mem_usage, mem_options);
......
...@@ -3561,7 +3561,7 @@ int cmd_sched(int argc, const char **argv) ...@@ -3561,7 +3561,7 @@ int cmd_sched(int argc, const char **argv)
if (!strcmp(argv[0], "script")) if (!strcmp(argv[0], "script"))
return cmd_script(argc, argv); return cmd_script(argc, argv);
if (!strncmp(argv[0], "rec", 3)) { if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
return __cmd_record(argc, argv); return __cmd_record(argc, argv);
} else if (!strncmp(argv[0], "lat", 3)) { } else if (!strncmp(argv[0], "lat", 3)) {
sched.tp_handler = &lat_ops; sched.tp_handler = &lat_ops;
...@@ -3581,7 +3581,7 @@ int cmd_sched(int argc, const char **argv) ...@@ -3581,7 +3581,7 @@ int cmd_sched(int argc, const char **argv)
sched.tp_handler = &map_ops; sched.tp_handler = &map_ops;
setup_sorting(&sched, latency_options, latency_usage); setup_sorting(&sched, latency_options, latency_usage);
return perf_sched__map(&sched); return perf_sched__map(&sched);
} else if (!strncmp(argv[0], "rep", 3)) { } else if (strlen(argv[0]) > 2 && strstarts("replay", argv[0])) {
sched.tp_handler = &replay_ops; sched.tp_handler = &replay_ops;
if (argc) { if (argc) {
argc = parse_options(argc, argv, replay_options, replay_usage, 0); argc = parse_options(argc, argv, replay_options, replay_usage, 0);
......
...@@ -3922,13 +3922,13 @@ int cmd_script(int argc, const char **argv) ...@@ -3922,13 +3922,13 @@ int cmd_script(int argc, const char **argv)
if (symbol__validate_sym_arguments()) if (symbol__validate_sym_arguments())
return -1; return -1;
if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) { if (argc > 1 && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
rec_script_path = get_script_path(argv[1], RECORD_SUFFIX); rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
if (!rec_script_path) if (!rec_script_path)
return cmd_record(argc, argv); return cmd_record(argc, argv);
} }
if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) { if (argc > 1 && strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
rep_script_path = get_script_path(argv[1], REPORT_SUFFIX); rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);
if (!rep_script_path) { if (!rep_script_path) {
fprintf(stderr, fprintf(stderr,
......
...@@ -2271,11 +2271,11 @@ int cmd_stat(int argc, const char **argv) ...@@ -2271,11 +2271,11 @@ int cmd_stat(int argc, const char **argv)
} else } else
stat_config.csv_sep = DEFAULT_SEPARATOR; stat_config.csv_sep = DEFAULT_SEPARATOR;
if (argc && !strncmp(argv[0], "rec", 3)) { if (argc && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
argc = __cmd_record(argc, argv); argc = __cmd_record(argc, argv);
if (argc < 0) if (argc < 0)
return -1; return -1;
} else if (argc && !strncmp(argv[0], "rep", 3)) } else if (argc && strlen(argv[0]) > 2 && strstarts("report", argv[0]))
return __cmd_report(argc, argv); return __cmd_report(argc, argv);
interval = stat_config.interval; interval = stat_config.interval;
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "util/tool.h" #include "util/tool.h"
#include "util/data.h" #include "util/data.h"
#include "util/debug.h" #include "util/debug.h"
#include "util/string2.h"
#include <linux/err.h> #include <linux/err.h>
#ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE #ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
...@@ -1983,7 +1984,7 @@ int cmd_timechart(int argc, const char **argv) ...@@ -1983,7 +1984,7 @@ int cmd_timechart(int argc, const char **argv)
return -1; return -1;
} }
if (argc && !strncmp(argv[0], "rec", 3)) { if (argc && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
argc = parse_options(argc, argv, timechart_record_options, argc = parse_options(argc, argv, timechart_record_options,
timechart_record_usage, timechart_record_usage,
PARSE_OPT_STOP_AT_NON_OPTION); PARSE_OPT_STOP_AT_NON_OPTION);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment