Re: [PATCH 1/6] perf tools: Add unit_number__scnprint function

From: Arnaldo Carvalho de Melo
Date: Tue Jan 10 2017 - 08:22:46 EST


Em Mon, Jan 09, 2017 at 10:51:55AM +0100, Jiri Olsa escreveu:
> Adding unit_number__scnprint function to display

Renaming to unit_number__scnprintf() for consistency.

- Arnaldo

> size units and use it in -m option info message.
>
> Before:
> $ perf record -m 10M ls
> rounding mmap pages size to 16777216 bytes (4096 pages)
> ...
>
> After:
> $ perf record -m 10M ls
> rounding mmap pages size to 16M (4096 pages)
> ...
>
> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> Cc: David Ahern <dsahern@xxxxxxxxx>
> Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
> Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
> Cc: Wang Nan <wangnan0@xxxxxxxxxx>
> Link: http://lkml.kernel.org/n/tip-0gafw11lesghnbfoiw90kc3q@xxxxxxxxxxxxxx
> ---
> tools/perf/tests/Build | 1 +
> tools/perf/tests/builtin-test.c | 4 ++++
> tools/perf/tests/tests.h | 1 +
> tools/perf/tests/unit_number__scnprint.c | 37 ++++++++++++++++++++++++++++++++
> tools/perf/util/evlist.c | 8 +++++--
> tools/perf/util/util.c | 13 +++++++++++
> tools/perf/util/util.h | 1 +
> 7 files changed, 63 insertions(+), 2 deletions(-)
> create mode 100644 tools/perf/tests/unit_number__scnprint.c
>
> diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> index 6676c2dd6dcb..4f653d257225 100644
> --- a/tools/perf/tests/Build
> +++ b/tools/perf/tests/Build
> @@ -44,6 +44,7 @@ perf-y += is_printable_array.o
> perf-y += bitmap.o
> perf-y += perf-hooks.o
> perf-y += clang.o
> +perf-y += unit_number__scnprint.o
>
> $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
> $(call rule_mkdir)
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index a77dcc0d24e3..5d93c41803d3 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -247,6 +247,10 @@ static struct test generic_tests[] = {
> }
> },
> {
> + .desc = "unit_number__scnprint",
> + .func = test__unit_number__scnprint,
> + },
> + {
> .func = NULL,
> },
> };
> diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
> index a512f0c8ff5b..1fa9b9d83aa5 100644
> --- a/tools/perf/tests/tests.h
> +++ b/tools/perf/tests/tests.h
> @@ -96,6 +96,7 @@ int test__perf_hooks(int subtest);
> int test__clang(int subtest);
> const char *test__clang_subtest_get_desc(int subtest);
> int test__clang_subtest_get_nr(void);
> +int test__unit_number__scnprint(int subtest);
>
> #if defined(__arm__) || defined(__aarch64__)
> #ifdef HAVE_DWARF_UNWIND_SUPPORT
> diff --git a/tools/perf/tests/unit_number__scnprint.c b/tools/perf/tests/unit_number__scnprint.c
> new file mode 100644
> index 000000000000..b336024b6c6a
> --- /dev/null
> +++ b/tools/perf/tests/unit_number__scnprint.c
> @@ -0,0 +1,37 @@
> +#include <linux/compiler.h>
> +#include <linux/types.h>
> +#include "tests.h"
> +#include "util.h"
> +#include "debug.h"
> +
> +int test__unit_number__scnprint(int subtest __maybe_unused)
> +{
> + struct {
> + u64 n;
> + const char *str;
> + } test[] = {
> + { 1, "1B" },
> + { 10*1024, "10K" },
> + { 20*1024*1024, "20M" },
> + { 30*1024*1024*1024ULL, "30G" },
> + { 0, "0B" },
> + { 0, NULL },
> + };
> + unsigned i = 0;
> +
> + while (test[i].str) {
> + char buf[100];
> +
> + unit_number__scnprint(buf, sizeof(buf), test[i].n);
> +
> + pr_debug("n %" PRIu64 ", str '%s', buf '%s'\n",
> + test[i].n, test[i].str, buf);
> +
> + if (strcmp(test[i].str, buf))
> + return TEST_FAIL;
> +
> + i++;
> + }
> +
> + return TEST_OK;
> +}
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index d92e02006fb8..435ff1c94a66 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -1224,12 +1224,16 @@ static long parse_pages_arg(const char *str, unsigned long min,
> if (pages == 0 && min == 0) {
> /* leave number of pages at 0 */
> } else if (!is_power_of_2(pages)) {
> + char buf[100];
> +
> /* round pages up to next power of 2 */
> pages = roundup_pow_of_two(pages);
> if (!pages)
> return -EINVAL;
> - pr_info("rounding mmap pages size to %lu bytes (%lu pages)\n",
> - pages * page_size, pages);
> +
> + unit_number__scnprint(buf, sizeof(buf), pages * page_size);
> + pr_info("rounding mmap pages size to %s (%lu pages)\n",
> + buf, pages);
> }
>
> if (pages > max)
> diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
> index 9ddd98827d12..c2b941dd8826 100644
> --- a/tools/perf/util/util.c
> +++ b/tools/perf/util/util.c
> @@ -789,3 +789,16 @@ int is_printable_array(char *p, unsigned int len)
> }
> return 1;
> }
> +
> +int unit_number__scnprint(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]);
> +}
> diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> index 1d639e38aa82..e2a627cd11dd 100644
> --- a/tools/perf/util/util.h
> +++ b/tools/perf/util/util.h
> @@ -363,4 +363,5 @@ int is_printable_array(char *p, unsigned int len);
>
> int timestamp__scnprintf_usec(u64 timestamp, char *buf, size_t sz);
>
> +int unit_number__scnprint(char *buf, size_t size, u64 n);
> #endif /* GIT_COMPAT_UTIL_H */
> --
> 2.7.4