perf_counter tools: Use hex2u64 in more places
This has also a nice side effect, tools built on newer systems such as
fedora 10 again work on systems with older versions of glibc:
My workstation:
[acme@doppio ~]$ rpm -q glibc.x86_64
glibc-2.9-3.x86_64
Test machine:
[acme@emilia ~]$ rpm -q glibc.x86_64
glibc-2.5-24
Before:
[acme@emilia ~]$ perf
perf: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by perf)
[acme@emilia ~]$ nm `which perf` | grep GLIBC_2\.7
U __isoc99_sscanf@@GLIBC_2.7
[acme@emilia ~]$
After:
[acme@emilia ~]$ perf
usage: perf [--version] [--help] COMMAND [ARGS]
The most commonly used perf commands are:
record Run a command and record its profile into perf.data
report Read perf.data (created by perf record) and display the
profile
stat Run a command and gather performance counter statistics
top Run a command and profile it
See 'perf help COMMAND' for more information on a specific command.
[acme@emilia ~]$ nm `which perf` | grep GLIBC_2\.7
[acme@emilia ~]$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20090601205019.GA7805@ghostprotocols.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
diff --git a/Documentation/perf_counter/util/parse-events.c b/Documentation/perf_counter/util/parse-events.c
index 88c903e..2fdfd1d 100644
--- a/Documentation/perf_counter/util/parse-events.c
+++ b/Documentation/perf_counter/util/parse-events.c
@@ -4,6 +4,7 @@
#include "parse-options.h"
#include "parse-events.h"
#include "exec_cmd.h"
+#include "string.h"
int nr_counters;
@@ -105,22 +106,26 @@
__u64 config, id;
int type;
unsigned int i;
- char mask_str[4];
+ const char *sep, *pstr;
- if (sscanf(str, "r%llx", &config) == 1)
+ if (str[0] == 'r' && hex2u64(str + 1, &config) > 0)
return config | PERF_COUNTER_RAW_MASK;
- switch (sscanf(str, "%d:%llu:%2s", &type, &id, mask_str)) {
- case 3:
- if (strchr(mask_str, 'k'))
+ pstr = str;
+ sep = strchr(pstr, ':');
+ if (sep) {
+ type = atoi(pstr);
+ pstr = sep + 1;
+ id = atoi(pstr);
+ sep = strchr(pstr, ':');
+ if (sep) {
+ pstr = sep + 1;
+ if (strchr(pstr, 'k'))
event_mask[nr_counters] |= EVENT_MASK_USER;
- if (strchr(mask_str, 'u'))
+ if (strchr(pstr, 'u'))
event_mask[nr_counters] |= EVENT_MASK_KERNEL;
- case 2:
- return EID(type, id);
-
- default:
- break;
+ }
+ return EID(type, id);
}
for (i = 0; i < ARRAY_SIZE(event_symbols); i++) {