diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-05-03 20:28:27 +0300 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-05-03 20:28:27 +0300 |
commit | 12c1c2fd780a9a5581105fcb6f251466cf35af2a (patch) | |
tree | ce613b7dfdb64d93a26765cdcf20b0f5deab9ef7 /tools/perf/util/units.c | |
parent | 33b88e708e7dfa58dc896da2a98f5719d2eb315c (diff) | |
parent | 4341ec6b3db4c3e903d6c44958722918baec1e59 (diff) | |
download | linux-12c1c2fd780a9a5581105fcb6f251466cf35af2a.tar.xz |
Merge tag 'perf-core-for-mingo-4.12-20170503' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
Fixes:
- Support setting probes in versioned user space symbols, such as
pthread_create@@GLIBC_2.1, picking the default one, more work
needed to make it possible to set it on the other versions, as
the 'perf probe' syntax already uses @ for other purposes.
(Paul Clarke)
- Do not special case address zero as an error for routines that
return addresses (symbol lookup), instead use the return as the
success/error indication and pass a pointer to return the address,
fixing 'perf test vmlinux' (the one that compares address between
vmlinux and kallsyms) on s/390, where the '_text' address is equal
to zero (Arnaldo Carvalho de Melo)
Infrastructure changes:
- More header sanitization, moving stuff out of util.h into
more appropriate headers and objects and sometimes creating
new ones (Arnaldo Carvalho de Melo)
- Refactor a duplicated code for obtaining config file name (Taeung Song)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/units.c')
-rw-r--r-- | tools/perf/util/units.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/perf/util/units.c b/tools/perf/util/units.c new file mode 100644 index 000000000000..4767ec2c5ef6 --- /dev/null +++ b/tools/perf/util/units.c @@ -0,0 +1,68 @@ +#include "units.h" +#include <inttypes.h> +#include <limits.h> +#include <stdlib.h> +#include <string.h> +#include <linux/kernel.h> +#include <linux/time64.h> + +unsigned long parse_tag_value(const char *str, struct parse_tag *tags) +{ + struct parse_tag *i = tags; + + while (i->tag) { + char *s = strchr(str, i->tag); + + if (s) { + unsigned long int value; + char *endptr; + + value = strtoul(str, &endptr, 10); + if (s != endptr) + break; + + if (value > ULONG_MAX / i->mult) + break; + value *= i->mult; + return value; + } + i++; + } + + return (unsigned long) -1; +} + +unsigned long convert_unit(unsigned long value, char *unit) +{ + *unit = ' '; + + if (value > 1000) { + value /= 1000; + *unit = 'K'; + } + + if (value > 1000) { + value /= 1000; + *unit = 'M'; + } + + if (value > 1000) { + value /= 1000; + *unit = 'G'; + } + + return value; +} + +int unit_number__scnprintf(char *buf, size_t size, u64 n) +{ + char unit[4] = "BKMG"; + int i = 0; + + while (((n / 1024) > 1) && (i < 3)) { + n /= 1024; + i++; + } + + return scnprintf(buf, size, "%" PRIu64 "%c", n, unit[i]); +} |