perf list: Make vendor event matching case insensitive
authorAndi Kleen <ak@linux.intel.com>
Wed, 19 Oct 2016 17:50:01 +0000 (10:50 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 Oct 2016 14:07:46 +0000 (11:07 -0300)
Make the 'perf list' glob matching for vendor events case insensitive.
This allows to use the upper case vendor events with perf list too.

Now the following works:

  % perf list LONGEST_LAT

  ...

  cache:
    longest_lat_cache.miss
         [Core-originated cacheable demand requests missed LLC]
    longest_lat_cache.reference
         [Core-originated cacheable demand requests that refer to LLC]

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Suggested-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/1476899402-31460-1-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/pmu.c
tools/perf/util/string.c
tools/perf/util/util.h

index d7174f340b53868ff2fa2cdd7972283c13417ef0..31b845ec32e24eb5667d075d83c84cbbe442786f 100644 (file)
@@ -1139,8 +1139,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
                        bool is_cpu = !strcmp(pmu->name, "cpu");
 
                        if (event_glob != NULL &&
-                           !(strglobmatch(name, event_glob) ||
-                             (!is_cpu && strglobmatch(alias->name,
+                           !(strglobmatch_nocase(name, event_glob) ||
+                             (!is_cpu && strglobmatch_nocase(alias->name,
                                                       event_glob))))
                                continue;
 
index 7f7e072be746f5985eb3c9ae5e84ad3ce9115b61..d8dfaf64b32e19af441b121803e4b4418d31c69e 100644 (file)
@@ -193,7 +193,8 @@ error:
 }
 
 /* Glob/lazy pattern matching */
-static bool __match_glob(const char *str, const char *pat, bool ignore_space)
+static bool __match_glob(const char *str, const char *pat, bool ignore_space,
+                       bool case_ins)
 {
        while (*str && *pat && *pat != '*') {
                if (ignore_space) {
@@ -219,8 +220,13 @@ static bool __match_glob(const char *str, const char *pat, bool ignore_space)
                                return false;
                else if (*pat == '\\') /* Escaped char match as normal char */
                        pat++;
-               if (*str++ != *pat++)
+               if (case_ins) {
+                       if (tolower(*str) != tolower(*pat))
+                               return false;
+               } else if (*str != *pat)
                        return false;
+               str++;
+               pat++;
        }
        /* Check wild card */
        if (*pat == '*') {
@@ -229,7 +235,7 @@ static bool __match_glob(const char *str, const char *pat, bool ignore_space)
                if (!*pat)      /* Tail wild card matches all */
                        return true;
                while (*str)
-                       if (__match_glob(str++, pat, ignore_space))
+                       if (__match_glob(str++, pat, ignore_space, case_ins))
                                return true;
        }
        return !*str && !*pat;
@@ -249,7 +255,12 @@ static bool __match_glob(const char *str, const char *pat, bool ignore_space)
  */
 bool strglobmatch(const char *str, const char *pat)
 {
-       return __match_glob(str, pat, false);
+       return __match_glob(str, pat, false, false);
+}
+
+bool strglobmatch_nocase(const char *str, const char *pat)
+{
+       return __match_glob(str, pat, false, true);
 }
 
 /**
@@ -262,7 +273,7 @@ bool strglobmatch(const char *str, const char *pat)
  */
 bool strlazymatch(const char *str, const char *pat)
 {
-       return __match_glob(str, pat, true);
+       return __match_glob(str, pat, true, false);
 }
 
 /**
index 43899e0d6fa148d80ebc08643d1fa9cf73ef93e9..71b6992f1d985d7db11bd6b97f0656faed7ddf7c 100644 (file)
@@ -222,6 +222,7 @@ s64 perf_atoll(const char *str);
 char **argv_split(const char *str, int *argcp);
 void argv_free(char **argv);
 bool strglobmatch(const char *str, const char *pat);
+bool strglobmatch_nocase(const char *str, const char *pat);
 bool strlazymatch(const char *str, const char *pat);
 static inline bool strisglob(const char *str)
 {