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

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.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c2eeac98
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@
#include "../perf.h"
#include "pmu.h"
#include "pmu-hybrid.h"
#include "string2.h"

struct c2c_hists {
	struct hists		hists;
@@ -3025,9 +3026,9 @@ int cmd_c2c(int argc, const char **argv)
	if (!argc)
		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);
	} else if (!strncmp(argv[0], "rep", 3)) {
	} else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
		return perf_c2c__report(argc, argv);
	} else {
		usage_with_options(c2c_usage, c2c_options);
+1 −1
Original line number Diff line number Diff line
@@ -1946,7 +1946,7 @@ int cmd_kmem(int argc, const char **argv)
			kmem_page = 1;
	}

	if (!strncmp(argv[0], "rec", 3)) {
	if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
		symbol__init(NULL);
		return __cmd_record(argc, argv);
	}
+5 −4
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "util/ordered-events.h"
#include "util/kvm-stat.h"
#include "ui/ui.h"
#include "util/string2.h"

#include <sys/prctl.h>
#ifdef HAVE_TIMERFD_SUPPORT
@@ -1500,10 +1501,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
		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);

	if (!strncmp(argv[1], "rep", 3))
	if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
		return kvm_events_report(&kvm, argc - 1 , argv + 1);

#ifdef HAVE_TIMERFD_SUPPORT
@@ -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);
	else if (!strncmp(argv[0], "rep", 3))
	else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
		return __cmd_report(file_name, argc, argv);
	else if (!strncmp(argv[0], "diff", 4))
		return cmd_diff(argc, argv);
+3 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include "util/session.h"
#include "util/tool.h"
#include "util/data.h"
#include "util/string2.h"

#include <sys/types.h>
#include <sys/prctl.h>
@@ -1166,9 +1167,9 @@ int cmd_lock(int argc, const char **argv)
	if (!argc)
		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);
	} else if (!strncmp(argv[0], "report", 6)) {
	} else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
		trace_handler = &report_lock_ops;
		if (argc) {
			argc = parse_options(argc, argv,
+3 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "util/symbol.h"
#include "util/pmu.h"
#include "util/pmu-hybrid.h"
#include "util/string2.h"
#include <linux/err.h>

#define MEM_OPERATION_LOAD	0x1
@@ -496,9 +497,9 @@ int cmd_mem(int argc, const char **argv)
			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);
	else if (!strncmp(argv[0], "rep", 3))
	else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
		return report_events(argc, argv, &mem);
	else
		usage_with_options(mem_usage, mem_options);
Loading