* [PATCH RESEND 0/2] perf tools: Fix mis-matching of perf sub-commands
@ 2022-03-18 9:22 Wei Li
2022-03-18 9:22 ` [PATCH RESEND 1/2] perf string: Add strcmp_prefix() Wei Li
2022-03-18 9:22 ` [PATCH RESEND 2/2] perf tools: Enhance the matching of sub-commands Wei Li
0 siblings, 2 replies; 5+ messages in thread
From: Wei Li @ 2022-03-18 9:22 UTC (permalink / raw)
To: acme, mark.rutland, alexander.shishkin, jolsa, namhyung
Cc: linux-perf-users, linux-kernel, rui.xiang, guohanjun
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. So fix the
mis-matching.
Wei Li (2):
perf string: Add strcmp_prefix()
perf tools: Enhance the matching of sub-commands
tools/perf/builtin-c2c.c | 5 +++--
tools/perf/builtin-kmem.c | 2 +-
tools/perf/builtin-kvm.c | 9 +++++----
tools/perf/builtin-lock.c | 5 +++--
tools/perf/builtin-mem.c | 5 +++--
tools/perf/builtin-sched.c | 4 ++--
tools/perf/builtin-script.c | 6 ++++--
tools/perf/builtin-stat.c | 4 ++--
tools/perf/builtin-timechart.c | 3 ++-
tools/perf/util/string.c | 17 +++++++++++++++++
tools/perf/util/string2.h | 1 +
11 files changed, 43 insertions(+), 18 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH RESEND 1/2] perf string: Add strcmp_prefix()
2022-03-18 9:22 [PATCH RESEND 0/2] perf tools: Fix mis-matching of perf sub-commands Wei Li
@ 2022-03-18 9:22 ` Wei Li
2022-03-22 21:22 ` Arnaldo Carvalho de Melo
2022-03-18 9:22 ` [PATCH RESEND 2/2] perf tools: Enhance the matching of sub-commands Wei Li
1 sibling, 1 reply; 5+ messages in thread
From: Wei Li @ 2022-03-18 9:22 UTC (permalink / raw)
To: acme, mark.rutland, alexander.shishkin, jolsa, namhyung
Cc: linux-perf-users, linux-kernel, rui.xiang, guohanjun
Add a helper to check whether a string has the given prefix.
This function is stolen from fs/xattr.c
Signed-off-by: Wei Li <liwei391@huawei.com>
---
tools/perf/util/string.c | 17 +++++++++++++++++
tools/perf/util/string2.h | 1 +
2 files changed, 18 insertions(+)
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
index f6d90cdd9225..0ed3e2d0b70f 100644
--- a/tools/perf/util/string.c
+++ b/tools/perf/util/string.c
@@ -209,6 +209,23 @@ int strtailcmp(const char *s1, const char *s2)
return 0;
}
+/**
+ * strcmp_prefix - check string for given prefix
+ * @str: the target string to check
+ * @prefix: the given prefix to match
+ *
+ * Return the rest string in @str if @str has the given @prefix, return NULL
+ * otherwise.
+ */
+const char *strcmp_prefix(const char *str, const char *prefix)
+{
+ while (*prefix && *str == *prefix) {
+ str++;
+ prefix++;
+ }
+ return *prefix ? NULL : str;
+}
+
char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints)
{
/*
diff --git a/tools/perf/util/string2.h b/tools/perf/util/string2.h
index 56c30fef9682..58929ad928f7 100644
--- a/tools/perf/util/string2.h
+++ b/tools/perf/util/string2.h
@@ -20,6 +20,7 @@ static inline bool strisglob(const char *str)
return strpbrk(str, "*?[") != NULL;
}
int strtailcmp(const char *s1, const char *s2);
+const char *strcmp_prefix(const char *str, const char *prefix);
char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints);
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH RESEND 2/2] perf tools: Enhance the matching of sub-commands
2022-03-18 9:22 [PATCH RESEND 0/2] perf tools: Fix mis-matching of perf sub-commands Wei Li
2022-03-18 9:22 ` [PATCH RESEND 1/2] perf string: Add strcmp_prefix() Wei Li
@ 2022-03-18 9:22 ` Wei Li
1 sibling, 0 replies; 5+ messages in thread
From: Wei Li @ 2022-03-18 9:22 UTC (permalink / raw)
To: acme, mark.rutland, alexander.shishkin, jolsa, namhyung
Cc: linux-perf-users, linux-kernel, rui.xiang, guohanjun
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.
Signed-off-by: Wei Li <liwei391@huawei.com>
---
tools/perf/builtin-c2c.c | 5 +++--
tools/perf/builtin-kmem.c | 2 +-
tools/perf/builtin-kvm.c | 9 +++++----
tools/perf/builtin-lock.c | 5 +++--
tools/perf/builtin-mem.c | 5 +++--
tools/perf/builtin-sched.c | 4 ++--
tools/perf/builtin-script.c | 6 ++++--
tools/perf/builtin-stat.c | 4 ++--
tools/perf/builtin-timechart.c | 3 ++-
9 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index 77dd4afacca4..8c5f106af46f 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -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 (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
return perf_c2c__record(argc, argv);
- } else if (!strncmp(argv[0], "rep", 3)) {
+ } else if (!strncmp(argv[0], "rep", 3) && strcmp_prefix("report", argv[0])) {
return perf_c2c__report(argc, argv);
} else {
usage_with_options(c2c_usage, c2c_options);
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index 99d7ff9a8eff..3358c73db43b 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -1946,7 +1946,7 @@ int cmd_kmem(int argc, const char **argv)
kmem_page = 1;
}
- if (!strncmp(argv[0], "rec", 3)) {
+ if (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
symbol__init(NULL);
return __cmd_record(argc, argv);
}
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index c6f352ee57e6..afdfc5931df6 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -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 (!strncmp(argv[1], "rec", 3) && strcmp_prefix("record", argv[1]))
return kvm_events_record(&kvm, argc - 1, argv + 1);
- if (!strncmp(argv[1], "rep", 3))
+ if (!strncmp(argv[1], "rep", 3) && strcmp_prefix("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 (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0]))
return __cmd_record(file_name, argc, argv);
- else if (!strncmp(argv[0], "rep", 3))
+ else if (!strncmp(argv[0], "rep", 3) && strcmp_prefix("report", argv[0]))
return __cmd_report(file_name, argc, argv);
else if (!strncmp(argv[0], "diff", 4))
return cmd_diff(argc, argv);
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index d70131b7b1b1..7bf7662c6089 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -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>
@@ -997,9 +998,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 (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
return __cmd_record(argc, argv);
- } else if (!strncmp(argv[0], "report", 6)) {
+ } else if (!strncmp(argv[0], "rep", 3) && strcmp_prefix("report", argv[0])) {
trace_handler = &report_lock_ops;
if (argc) {
argc = parse_options(argc, argv,
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index fcf65a59bea2..ed0083d43e27 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -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 (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0]))
return __cmd_record(argc, argv, &mem);
- else if (!strncmp(argv[0], "rep", 3))
+ else if (!strncmp(argv[0], "rep", 3) && strcmp_prefix("report", argv[0]))
return report_events(argc, argv, &mem);
else
usage_with_options(mem_usage, mem_options);
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 72d446de9c60..c4615ae07b5d 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -3561,7 +3561,7 @@ int cmd_sched(int argc, const char **argv)
if (!strcmp(argv[0], "script"))
return cmd_script(argc, argv);
- if (!strncmp(argv[0], "rec", 3)) {
+ if (!strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
return __cmd_record(argc, argv);
} else if (!strncmp(argv[0], "lat", 3)) {
sched.tp_handler = &lat_ops;
@@ -3581,7 +3581,7 @@ int cmd_sched(int argc, const char **argv)
sched.tp_handler = &map_ops;
setup_sorting(&sched, latency_options, latency_usage);
return perf_sched__map(&sched);
- } else if (!strncmp(argv[0], "rep", 3)) {
+ } else if (!strncmp(argv[0], "rep", 3) && strcmp_prefix("replay", argv[0])) {
sched.tp_handler = &replay_ops;
if (argc) {
argc = parse_options(argc, argv, replay_options, replay_usage, 0);
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 23bc0fb5a381..b800b4f5964b 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -3842,13 +3842,15 @@ int cmd_script(int argc, const char **argv)
if (symbol__validate_sym_arguments())
return -1;
- if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
+ if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec")) &&
+ strcmp_prefix("record", argv[0])) {
rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
if (!rec_script_path)
return cmd_record(argc, argv);
}
- if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) {
+ if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep")) &&
+ strcmp_prefix("report", argv[0])) {
rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);
if (!rep_script_path) {
fprintf(stderr,
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 3f98689dd687..f0e19c93f3f8 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -2271,11 +2271,11 @@ int cmd_stat(int argc, const char **argv)
} else
stat_config.csv_sep = DEFAULT_SEPARATOR;
- if (argc && !strncmp(argv[0], "rec", 3)) {
+ if (argc && !strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
argc = __cmd_record(argc, argv);
if (argc < 0)
return -1;
- } else if (argc && !strncmp(argv[0], "rep", 3))
+ } else if (argc && !strncmp(argv[0], "rep", 3) && strcmp_prefix("report", argv[0]))
return __cmd_report(argc, argv);
interval = stat_config.interval;
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index 43bf4d67edb0..1b180cfcda74 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -35,6 +35,7 @@
#include "util/tool.h"
#include "util/data.h"
#include "util/debug.h"
+#include "util/string2.h"
#include <linux/err.h>
#ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
@@ -1983,7 +1984,7 @@ int cmd_timechart(int argc, const char **argv)
return -1;
}
- if (argc && !strncmp(argv[0], "rec", 3)) {
+ if (argc && !strncmp(argv[0], "rec", 3) && strcmp_prefix("record", argv[0])) {
argc = parse_options(argc, argv, timechart_record_options,
timechart_record_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND 1/2] perf string: Add strcmp_prefix()
2022-03-18 9:22 ` [PATCH RESEND 1/2] perf string: Add strcmp_prefix() Wei Li
@ 2022-03-22 21:22 ` Arnaldo Carvalho de Melo
2022-03-25 2:06 ` liwei (GF)
0 siblings, 1 reply; 5+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-03-22 21:22 UTC (permalink / raw)
To: Wei Li
Cc: mark.rutland, alexander.shishkin, jolsa, namhyung,
linux-perf-users, linux-kernel, rui.xiang, guohanjun
Em Fri, Mar 18, 2022 at 05:22:44PM +0800, Wei Li escreveu:
> Add a helper to check whether a string has the given prefix.
> This function is stolen from fs/xattr.c
Can't you use strstarts()? See tools/include/linux/string.h.
- Arnaldo
> Signed-off-by: Wei Li <liwei391@huawei.com>
> ---
> tools/perf/util/string.c | 17 +++++++++++++++++
> tools/perf/util/string2.h | 1 +
> 2 files changed, 18 insertions(+)
>
> diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
> index f6d90cdd9225..0ed3e2d0b70f 100644
> --- a/tools/perf/util/string.c
> +++ b/tools/perf/util/string.c
> @@ -209,6 +209,23 @@ int strtailcmp(const char *s1, const char *s2)
> return 0;
> }
>
> +/**
> + * strcmp_prefix - check string for given prefix
> + * @str: the target string to check
> + * @prefix: the given prefix to match
> + *
> + * Return the rest string in @str if @str has the given @prefix, return NULL
> + * otherwise.
> + */
> +const char *strcmp_prefix(const char *str, const char *prefix)
> +{
> + while (*prefix && *str == *prefix) {
> + str++;
> + prefix++;
> + }
> + return *prefix ? NULL : str;
> +}
> +
> char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints)
> {
> /*
> diff --git a/tools/perf/util/string2.h b/tools/perf/util/string2.h
> index 56c30fef9682..58929ad928f7 100644
> --- a/tools/perf/util/string2.h
> +++ b/tools/perf/util/string2.h
> @@ -20,6 +20,7 @@ static inline bool strisglob(const char *str)
> return strpbrk(str, "*?[") != NULL;
> }
> int strtailcmp(const char *s1, const char *s2);
> +const char *strcmp_prefix(const char *str, const char *prefix);
>
> char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints);
>
> --
> 2.25.1
--
- Arnaldo
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND 1/2] perf string: Add strcmp_prefix()
2022-03-22 21:22 ` Arnaldo Carvalho de Melo
@ 2022-03-25 2:06 ` liwei (GF)
0 siblings, 0 replies; 5+ messages in thread
From: liwei (GF) @ 2022-03-25 2:06 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: mark.rutland, alexander.shishkin, jolsa, namhyung,
linux-perf-users, linux-kernel, rui.xiang, guohanjun
On 2022/3/23 5:22, Arnaldo Carvalho de Melo wrote:
> Em Fri, Mar 18, 2022 at 05:22:44PM +0800, Wei Li escreveu:
>> Add a helper to check whether a string has the given prefix.
>> This function is stolen from fs/xattr.c
>
> Can't you use strstarts()? See tools/include/linux/string.h.
>
Sorry, i haven't known that before, will use strstarts() in v2.
Thanks,
Wei
>
>> Signed-off-by: Wei Li <liwei391@huawei.com>
>> ---
>> tools/perf/util/string.c | 17 +++++++++++++++++
>> tools/perf/util/string2.h | 1 +
>> 2 files changed, 18 insertions(+)
>>
>> diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
>> index f6d90cdd9225..0ed3e2d0b70f 100644
>> --- a/tools/perf/util/string.c
>> +++ b/tools/perf/util/string.c
>> @@ -209,6 +209,23 @@ int strtailcmp(const char *s1, const char *s2)
>> return 0;
>> }
>>
>> +/**
>> + * strcmp_prefix - check string for given prefix
>> + * @str: the target string to check
>> + * @prefix: the given prefix to match
>> + *
>> + * Return the rest string in @str if @str has the given @prefix, return NULL
>> + * otherwise.
>> + */
>> +const char *strcmp_prefix(const char *str, const char *prefix)
>> +{
>> + while (*prefix && *str == *prefix) {
>> + str++;
>> + prefix++;
>> + }
>> + return *prefix ? NULL : str;
>> +}
>> +
>> char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints)
>> {
>> /*
>> diff --git a/tools/perf/util/string2.h b/tools/perf/util/string2.h
>> index 56c30fef9682..58929ad928f7 100644
>> --- a/tools/perf/util/string2.h
>> +++ b/tools/perf/util/string2.h
>> @@ -20,6 +20,7 @@ static inline bool strisglob(const char *str)
>> return strpbrk(str, "*?[") != NULL;
>> }
>> int strtailcmp(const char *s1, const char *s2);
>> +const char *strcmp_prefix(const char *str, const char *prefix);
>>
>> char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints);
>>
>> --
>> 2.25.1
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-03-25 2:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-18 9:22 [PATCH RESEND 0/2] perf tools: Fix mis-matching of perf sub-commands Wei Li
2022-03-18 9:22 ` [PATCH RESEND 1/2] perf string: Add strcmp_prefix() Wei Li
2022-03-22 21:22 ` Arnaldo Carvalho de Melo
2022-03-25 2:06 ` liwei (GF)
2022-03-18 9:22 ` [PATCH RESEND 2/2] perf tools: Enhance the matching of sub-commands Wei Li
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.