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 <jo...@kernel.org>
> Cc: David Ahern <dsah...@gmail.com>
> Cc: Namhyung Kim <namhy...@kernel.org>
> Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
> Cc: Wang Nan <wangn...@huawei.com>
> Link: http://lkml.kernel.org/n/tip-0gafw11lesghnbfoiw90k...@git.kernel.org
> ---
>  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

Reply via email to