Support perf -vv
v4 cover Support perf -vv
We keep having bug reports that when users build perf on their own, but they don't install some needed libraries such as libelf, libbfd/libibery.
The perf can build, but it is missing important functionality. And users may complain that perf has issue or bug.
This patch-set support to print the status of compiled-in libraries.
Once users think perf missing some functionality, it should be very easy for them to check the libraries status.
For example:
$ ./perf version --build-options
or
./perf --version --build-options
or
./perf -v --build-options
or
./perf -vvperf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORTv4:
---
1. Also print the macro name. That would make it easier to grep around in the source looking for where code related a particular features is located.
2. Update since HAVE_DWARF_GETLOCATIONS is renamed to HAVE_DWARF_GETLOCATIONS_SUPPORT
Patch impacted:
---------------
perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT perf version: Print the compiled-in status of libraries others not changed
Jin Yao (5):
perf config: Add some new -DHAVE_XXX to CFLAGS perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT perf version: Print the compiled-in status of libraries
perf: Support perf -vv
perf Documentation: Create perf-version.txt
Jiri Olsa (1):
tools include: Add config.h header file
tools/include/tools/config.h | 34 +++++++++++++ tools/perf/Documentation/perf-version.txt | 24 +++++++++ tools/perf/Makefile.config | 8 ++- tools/perf/builtin-version.c | 82 ++++++++++++++++++++++++++++++- tools/perf/perf.c | 6 +++ tools/perf/perf.h | 1 + tools/perf/util/dwarf-aux.c | 2 +- 7 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 tools/include/tools/config.h create mode 100644 tools/perf/Documentation/perf-version.txt
Signature · 1 line
2.7.4
PATCH v4 1/6 tools include: Add config.h header file
From: Jiri Olsa <[email protected]>
Adding IS_BUILTIN macro and its dependencies into
tools world.
It's taken from kernel's include/linux/kconfig.h, which can't be taken completely due to its kconfig dependencies.
--- tools/include/tools/config.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tools/include/tools/config.h
tools/include/tools/config.h new file +34 -0
@@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _TOOLS_CONFIG_H +#define _TOOLS_CONFIG_H + +/* Subset of include/linux/kconfig.h */ + +#define __ARG_PLACEHOLDER_1 0, +#define __take_second_arg (__ignored, val, ...) val + +/* +* Helper macros to use CONFIG_ options in C/CPP expressions. Note that +* these only work with boolean and tristate options. +*/ + +/* +* Getting something that works in C and CPP for an arg that may or may +* not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" +* we match on the placeholder define, insert the "0," for arg1 and generate +* the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). +* When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when +* the last step cherry picks the 2nd arg, we get a zero. +*/ +#define __is_defined (x) ___is_defined(x) +#define ___is_defined (val) ____is_defined(__ARG_PLACEHOLDER_##val) +#define ____is_defined (arg1_or_junk) __take_second_arg(arg1_or_junk 1, 0) + +/* +* IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 +* otherwise. For boolean options, this is equivalent to +* IS_ENABLED(CONFIG_FOO). +*/ +#define IS_BUILTIN (option) __is_defined(option) + +#endif /* _TOOLS_CONFIG_H */
Signature · 1 line
2.7.4
tip-bot for Jiri Olsa
merge bot[tip:perf/urgent] tools include: Add config.h header file
tools include: Add config.h header file
Commit-ID: 6b416ebcc32c5753214d53c18ac5719c93bc340e Gitweb: https://git.kernel.org/tip/6b416ebcc32c5753214d53c18ac5719c93bc340e Author: Jiri Olsa <[email protected]> AuthorDate: Fri, 30 Mar 2018 17:27:11 +0800 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Apr 2018 13:31:38 -0300
tools include: Add config.h header file
Adding IS_BUILTIN macro and its dependencies into tools world.
It's taken from kernel's include/linux/kconfig.h, which can't be taken completely due to its kconfig dependencies.
--- tools/include/tools/config.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
tools/include/tools/config.h new file +34 -0
@@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _TOOLS_CONFIG_H +#define _TOOLS_CONFIG_H + +/* Subset of include/linux/kconfig.h */ + +#define __ARG_PLACEHOLDER_1 0, +#define __take_second_arg (__ignored, val, ...) val + +/* +* Helper macros to use CONFIG_ options in C/CPP expressions. Note that +* these only work with boolean and tristate options. +*/ + +/* +* Getting something that works in C and CPP for an arg that may or may +* not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" +* we match on the placeholder define, insert the "0," for arg1 and generate +* the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). +* When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when +* the last step cherry picks the 2nd arg, we get a zero. +*/ +#define __is_defined (x) ___is_defined(x) +#define ___is_defined (val) ____is_defined(__ARG_PLACEHOLDER_##val) +#define ____is_defined (arg1_or_junk) __take_second_arg(arg1_or_junk 1, 0) + +/* +* IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 +* otherwise. For boolean options, this is equivalent to +* IS_ENABLED(CONFIG_FOO). +*/ +#define IS_BUILTIN (option) __is_defined(option) + +#endif /* _TOOLS_CONFIG_H */
PATCH v4 3/6 perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT
In reply to Jin YaoIn Makefile.config, to make all libraries flags have _SUPPORT suffix, rename HAVE_DWARF_GETLOCATIONS to HAVE_DWARF_GETLOCATIONS_SUPPORT
--- tools/perf/Makefile.config | 2 +- tools/perf/util/dwarf-aux.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/Makefile.config +1 -1
@@ -346,7 +346,7 @@ else ifneq ($(feature-dwarf_getlocations), 1) msg := $(warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157); else - CFLAGS += -DHAVE_DWARF_GETLOCATIONS + CFLAGS += -DHAVE_DWARF_GETLOCATIONS_SUPPORT endif # dwarf_getlocations endif # Dwarf support endif # libelf support
tools/perf/util/dwarf-aux.c +1 -1
@@ -979,7 +979,7 @@ int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf)return ret <0 ? ret :strbuf_addf (buf,"\t%s" ,dwarf_diename (vr_die)); } -#ifdef HAVE_DWARF_GETLOCATIONS +#ifdef HAVE_DWARF_GETLOCATIONS_SUPPORT /** * die_get_var_innermost_scope - Get innermost scope range of given variable DIE * @sp_die: a subprogram DIE
Signature · 1 line
2.7.4
tip-bot for Jin Yao
merge bot[tip:perf/urgent] perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT
perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT
Commit-ID: a36ebe4e242a2f6818f424b03a5e8dae3964e458 Gitweb: https://git.kernel.org/tip/a36ebe4e242a2f6818f424b03a5e8dae3964e458 Author: Jin Yao <[email protected]> AuthorDate: Fri, 30 Mar 2018 17:27:13 +0800 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Apr 2018 13:50:24 -0300
perf config: Rename to HAVE_DWARF_GETLOCATIONS_SUPPORT
In Makefile.config, to make all libraries flags have _SUPPORT suffix, rename HAVE_DWARF_GETLOCATIONS to HAVE_DWARF_GETLOCATIONS_SUPPORT
--- tools/perf/Makefile.config | 2 +- tools/perf/util/dwarf-aux.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/Makefile.config +1 -1
@@ -346,7 +346,7 @@ else ifneq ($(feature-dwarf_getlocations), 1) msg := $(warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157); else - CFLAGS += -DHAVE_DWARF_GETLOCATIONS + CFLAGS += -DHAVE_DWARF_GETLOCATIONS_SUPPORT endif # dwarf_getlocations endif # Dwarf support endif # libelf support
tools/perf/util/dwarf-aux.c +1 -1
@@ -979,7 +979,7 @@ int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf)return ret <0 ? ret :strbuf_addf (buf,"\t%s" ,dwarf_diename (vr_die)); } -#ifdef HAVE_DWARF_GETLOCATIONS +#ifdef HAVE_DWARF_GETLOCATIONS_SUPPORT /** * die_get_var_innermost_scope - Get innermost scope range of given variable DIE * @sp_die: a subprogram DIE
PATCH v4 4/6 perf version: Print the compiled-in status of libraries
In reply to Jin YaoThis patch checks the values passed by CFLAGS (-DHAVE_XXX) and then print the status of libraries.
For example, if HAVE_DWARF_SUPPORT is defined, that means the library "dwarf" is compiled-in. The patch will print the status "on" for this library otherwise it print the status "OFF".
A new option '--build-options' created for 'perf version' supports the printing of library status.
For example:
$ ./perf version --build-options
or
./perf --version --build-options
or
./perf -v --build-optionsperf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORTv4:
---
1. Also print the macro name. That would make it easier to grep around in the source looking for where code related a particular features is located.
2. Update since HAVE_DWARF_GETLOCATIONS is renamed to HAVE_DWARF_GETLOCATIONS_SUPPORT
v3:
---
Remove following unnecessary help message.
1. [ on ]: library is compiled-in
[ OFF ]: library is disabled in make configuration
OR library is not installed in build environment
2. Create '--build-options' option.
3. Use standard option parsing API 'parse_options'.
v2:
---
1. Use IS_BUILTIN macro to replace #ifdef/#endif block.
2. Print color for on/OFF.
--- tools/perf/builtin-version.c | 82 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-)
tools/perf/builtin-version.c +81 -1
@@ -1,11 +1,91 @@// SPDX-License-Identifier: GPL-2.0 #include "builtin.h" #include "perf.h" +#include "color.h" #include <linux/compiler.h> +#include <tools/config.h> #include <stdio.h> +#include <string.h> +#include <subcmd/parse-options.h> -int cmd_version (int argc__maybe_unused ,const char **argv__maybe_unused ) +int version_verbose; + +struct version { +bool build_options; +}; + +static struct version version; + +static struct option version_options[] = { +OPT_BOOLEAN (0 ,"build-options" , &version.build_options, +"display the build options" ), +}; + +static const char *const version_usage[] = { +"perf version [<options>]" , +NULL +}; + +static void on_off_print (const char *status) +{ +printf ("[ " ); + +if (!strcmp (status,"OFF" )) +color_fprintf (stdout,PERF_COLOR_RED ,"%-3s" , status); +else +color_fprintf (stdout,PERF_COLOR_GREEN ,"%-3s" , status); + +printf (" ]" ); +} + +static void status_print (const char *name,const char *macro, +const char *status) { +printf ("%22s: " , name); +on_off_print (status); +printf (" # %s\n" , macro); +} + +#define STATUS (__d, __m) \ +do { \ + if (IS_BUILTIN(__d)) \ + status_print(#__m, #__d, "on"); \ + else \ + status_print(#__m, #__d, "OFF"); \ +} while (0) + +static void library_status (void ) +{ +STATUS (HAVE_DWARF_SUPPORT , dwarf); +STATUS (HAVE_DWARF_GETLOCATIONS_SUPPORT , dwarf_getlocations); +STATUS (HAVE_GLIBC_SUPPORT , glibc); +STATUS (HAVE_GTK2_SUPPORT , gtk2); +STATUS (HAVE_LIBAUDIT_SUPPORT , libaudit); +STATUS (HAVE_LIBBFD_SUPPORT , libbfd); +STATUS (HAVE_LIBELF_SUPPORT , libelf); +STATUS (HAVE_LIBNUMA_SUPPORT , libnuma); +STATUS (HAVE_LIBNUMA_SUPPORT , numa_num_possible_cpus); +STATUS (HAVE_LIBPERL_SUPPORT , libperl); +STATUS (HAVE_LIBPYTHON_SUPPORT , libpython); +STATUS (HAVE_SLANG_SUPPORT , libslang); +STATUS (HAVE_LIBCRYPTO_SUPPORT , libcrypto); +STATUS (HAVE_LIBUNWIND_SUPPORT , libunwind); +STATUS (HAVE_DWARF_SUPPORT , libdw-dwarf-unwind); +STATUS (HAVE_ZLIB_SUPPORT , zlib); +STATUS (HAVE_LZMA_SUPPORT , lzma); +STATUS (HAVE_AUXTRACE_SUPPORT , get_cpuid); +STATUS (HAVE_LIBBPF_SUPPORT , bpf); +} + +int cmd_version (int argc,const char **argv) +{ + argc =parse_options (argc, argv, version_options, version_usage, +PARSE_OPT_STOP_AT_NON_OPTION ); +printf ("perf version %s\n" , perf_version_string); + +if (version.build_options || version_verbose ==1 ) +library_status (); +return 0 ; }
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerRe: [PATCH v4 4/6] perf version: Print the compiled-in status of libraries
Em Fri, Mar 30, 2018 at 05:27:14PM +0800, Jin Yao escreveu:
Quoted 18 lines
This patch checks the values passed by CFLAGS (-DHAVE_XXX) and then print the status of libraries.
For example, if
HAVE_DWARF_SUPPORTis defined, that means the library "dwarf" is compiled-in. The patch will print the status "on" for this library otherwise it print the status "OFF".A new option '--build-options' created for 'perf version' supports the printing of library status.
For example:
$ ./perf version --build-options or ./perf --version --build-options or ./perf -v --build-options
Quoted 6 lines
perf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT glibc: [ on ] # HAVE_GLIBC_SUPPORT gtk2: [ on ] # HAVE_GTK2_SUPPORT libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
Ok, while testing this I noticed the above, which may be distracting, i.e. on x86-64 and s/390 not having libaudit means nothing, it is not needed for anything.
It is only needed for architectures where HAVE_SYSCALL_TABLE is not defined, that, btw, is not listed here, so I suggest that we stop printing this "libaudit [ OFF ]" line if HAVE_SYSCALL_TABLE is available, and also add a line for HAVE_SYSCALL_TABLE.
Anyways, this can be done on top of this series, but please do a grep looking for other HAVE_* to fix, and we need to rename HAVE_SYSCALL_TABLE to HAVE_SYSCALL_TABLE_SUPPORT...
- Arnaldo
Quoted 146 lines
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT libelf: [ on ] # HAVE_LIBELF_SUPPORT libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT libperl: [ on ] # HAVE_LIBPERL_SUPPORT libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT libslang: [ on ] # HAVE_SLANG_SUPPORT libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT zlib: [ on ] # HAVE_ZLIB_SUPPORT lzma: [ on ] # HAVE_LZMA_SUPPORT get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT bpf: [ on ] # HAVE_LIBBPF_SUPPORTv4:
---
1. Also print the macro name. That would make it easier to grep around in the source looking for where code related a particular features is located.2. Update since
HAVE_DWARF_GETLOCATIONSis renamed toHAVE_DWARF_GETLOCATIONS_SUPPORTv3:
---
Remove following unnecessary help message.1. [ on ]: library is compiled-in
[ OFF ]: library is disabled in make configuration
OR library is not installed in build environment2. Create '--build-options' option.
3. Use standard option parsing API '
parse_options'.v2:
---
1. UseIS_BUILTINmacro to replace #ifdef/#endif block.2. Print color for on/OFF.
Signed-off-by Jin Yao <[email protected]>--- tools/perf/builtin-version.c | 82 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-)tools/perf/builtin-version.c +81
-1@@ -1,11 +1,91 @@// SPDX-License-Identifier: GPL-2.0 #include "builtin.h" #include "perf.h" +#include "color.h" #include <linux/compiler.h> +#include <tools/config.h> #include <stdio.h> +#include <string.h> +#include <subcmd/parse-options.h> -int cmd_version (int argc__maybe_unused ,const char **argv__maybe_unused ) +int version_verbose; + +struct version { +bool build_options; +}; + +static struct version version; + +static struct option version_options[] = { +OPT_BOOLEAN (0 ,"build-options" , &version.build_options, +"display the build options" ), +}; + +static const char *const version_usage[] = { +"perf version [<options>]" , +NULL +}; + +static void on_off_print (const char *status) +{ +printf ("[ " ); + +if (!strcmp (status,"OFF" )) +color_fprintf (stdout,PERF_COLOR_RED ,"%-3s" , status); +else +color_fprintf (stdout,PERF_COLOR_GREEN ,"%-3s" , status); + +printf (" ]" ); +} + +static void status_print (const char *name,const char *macro, +const char *status) { +printf ("%22s: " , name); +on_off_print (status); +printf (" # %s\n" , macro); +} + +#define STATUS (__d, __m) \ +do { \ + if (IS_BUILTIN(__d)) \ + status_print(#__m, #__d, "on"); \ + else \ + status_print(#__m, #__d, "OFF"); \ +} while (0) + +static void library_status (void ) +{ +STATUS (HAVE_DWARF_SUPPORT , dwarf); +STATUS (HAVE_DWARF_GETLOCATIONS_SUPPORT , dwarf_getlocations); +STATUS (HAVE_GLIBC_SUPPORT , glibc); +STATUS (HAVE_GTK2_SUPPORT , gtk2); +STATUS (HAVE_LIBAUDIT_SUPPORT , libaudit); +STATUS (HAVE_LIBBFD_SUPPORT , libbfd); +STATUS (HAVE_LIBELF_SUPPORT , libelf); +STATUS (HAVE_LIBNUMA_SUPPORT , libnuma); +STATUS (HAVE_LIBNUMA_SUPPORT , numa_num_possible_cpus); +STATUS (HAVE_LIBPERL_SUPPORT , libperl); +STATUS (HAVE_LIBPYTHON_SUPPORT , libpython); +STATUS (HAVE_SLANG_SUPPORT , libslang); +STATUS (HAVE_LIBCRYPTO_SUPPORT , libcrypto); +STATUS (HAVE_LIBUNWIND_SUPPORT , libunwind); +STATUS (HAVE_DWARF_SUPPORT , libdw-dwarf-unwind); +STATUS (HAVE_ZLIB_SUPPORT , zlib); +STATUS (HAVE_LZMA_SUPPORT , lzma); +STATUS (HAVE_AUXTRACE_SUPPORT , get_cpuid); +STATUS (HAVE_LIBBPF_SUPPORT , bpf); +} + +int cmd_version (int argc,const char **argv) +{ + argc =parse_options (argc, argv, version_options, version_usage, +PARSE_OPT_STOP_AT_NON_OPTION ); +printf ("perf version %s\n" , perf_version_string); + +if (version.build_options || version_verbose ==1 ) +library_status (); +return 0 ; }Signature · 1 line
2.7.4
Re: [PATCH v4 4/6] perf version: Print the compiled-in status of libraries
Quoted 35 lines · Arnaldo Carvalho de Melo
Em Fri, Mar 30, 2018 at 05:27:14PM +0800, Jin Yao escreveu:
Quoted 18 lines
This patch checks the values passed by CFLAGS (-DHAVE_XXX) and then print the status of libraries.
For example, if
HAVE_DWARF_SUPPORTis defined, that means the library "dwarf" is compiled-in. The patch will print the status "on" for this library otherwise it print the status "OFF".A new option '--build-options' created for 'perf version' supports the printing of library status.
For example:
$ ./perf version --build-options or ./perf --version --build-options or ./perf -v --build-optionsQuoted 6 lines
perf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT glibc: [ on ] # HAVE_GLIBC_SUPPORT gtk2: [ on ] # HAVE_GTK2_SUPPORT libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORTOk, while testing this I noticed the above, which may be distracting, i.e. on x86-64 and s/390 not having libaudit means nothing, it is not needed for anything.
It is only needed for architectures where
HAVE_SYSCALL_TABLEis not defined, that, btw, is not listed here, so I suggest that we stop printing this "libaudit [ OFF ]" line ifHAVE_SYSCALL_TABLEis available, and also add a line forHAVE_SYSCALL_TABLE.
Quoted 6 lines
Anyways, this can be done on top of this series, but please do a grep looking for other HAVE_* to fix, and we need to rename
HAVE_SYSCALL_TABLEtoHAVE_SYSCALL_TABLE_SUPPORT...- Arnaldo
Hi Arnaldo,
Thanks for the suggestions. Yes, some follow-up patches are needed.
1. Remove -DNO_LIBPERL and use -DHAVE_LIBPERL_SUPPORT in C code.
2. Remove -DNO_LIBPYTHON and use -DHAVE_LIBPYTHON_SUPPORT in C code.
3. Rename HAVE_SYSCALL_TABLE to HAVE_SYSCALL_TABLE_SUPPORT.
4. Don't print "libaudit [ OFF ]" line if HAVE_SYSCALL_TABLE_SUPPORT is available and add a line for HAVE_SYSCALL_TABLE_SUPPORT.
I will do it in follow-up patch.
Thanks
Jin Yao
tip-bot for Jin Yao
merge bot[tip:perf/urgent] perf version: Print the compiled-in status of libraries
In reply to Jin Yaoperf version: Print the compiled-in status of libraries
Commit-ID: 9ff2a64708a642b3dee867d0a083171077663b0a Gitweb: https://git.kernel.org/tip/9ff2a64708a642b3dee867d0a083171077663b0a Author: Jin Yao <[email protected]> AuthorDate: Fri, 30 Mar 2018 17:27:14 +0800 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Apr 2018 13:50:30 -0300
perf version: Print the compiled-in status of libraries
This patch checks the values passed by CFLAGS (-DHAVE_XXX) and then print the status of libraries.
For example, if HAVE_DWARF_SUPPORT is defined, that means the library "dwarf" is compiled-in. The patch will print the status "on" for this library otherwise it print the status "OFF".
A new option '--build-options' created for 'perf version' supports the printing of library status.
For example:
$ ./perf version --build-options
or
./perf --version --build-options
or
./perf -v --build-optionsperf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORTv4:
1. Also print the macro name. That would make it easier to grep around in the source looking for where code related a particular features is located.
2. Update since HAVE_DWARF_GETLOCATIONS is renamed to HAVE_DWARF_GETLOCATIONS_SUPPORT
v3:
Remove following unnecessary help message.
1. [ on ]: library is compiled-in
[ OFF ]: library is disabled in make configuration
OR library is not installed in build environment
2. Create '--build-options' option.
3. Use standard option parsing API 'parse_options'.
v2:
1. Use IS_BUILTIN macro to replace #ifdef/#endif block.
2. Print color for on/OFF.
--- tools/perf/builtin-version.c | 82 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-)
tools/perf/builtin-version.c +81 -1
@@ -1,11 +1,91 @@// SPDX-License-Identifier: GPL-2.0 #include "builtin.h" #include "perf.h" +#include "color.h" #include <linux/compiler.h> +#include <tools/config.h> #include <stdio.h> +#include <string.h> +#include <subcmd/parse-options.h> -int cmd_version (int argc__maybe_unused ,const char **argv__maybe_unused ) +int version_verbose; + +struct version { +bool build_options; +}; + +static struct version version; + +static struct option version_options[] = { +OPT_BOOLEAN (0 ,"build-options" , &version.build_options, +"display the build options" ), +}; + +static const char *const version_usage[] = { +"perf version [<options>]" , +NULL +}; + +static void on_off_print (const char *status) +{ +printf ("[ " ); + +if (!strcmp (status,"OFF" )) +color_fprintf (stdout,PERF_COLOR_RED ,"%-3s" , status); +else +color_fprintf (stdout,PERF_COLOR_GREEN ,"%-3s" , status); + +printf (" ]" ); +} + +static void status_print (const char *name,const char *macro, +const char *status) { +printf ("%22s: " , name); +on_off_print (status); +printf (" # %s\n" , macro); +} + +#define STATUS (__d, __m) \ +do { \ + if (IS_BUILTIN(__d)) \ + status_print(#__m, #__d, "on"); \ + else \ + status_print(#__m, #__d, "OFF"); \ +} while (0) + +static void library_status (void ) +{ +STATUS (HAVE_DWARF_SUPPORT , dwarf); +STATUS (HAVE_DWARF_GETLOCATIONS_SUPPORT , dwarf_getlocations); +STATUS (HAVE_GLIBC_SUPPORT , glibc); +STATUS (HAVE_GTK2_SUPPORT , gtk2); +STATUS (HAVE_LIBAUDIT_SUPPORT , libaudit); +STATUS (HAVE_LIBBFD_SUPPORT , libbfd); +STATUS (HAVE_LIBELF_SUPPORT , libelf); +STATUS (HAVE_LIBNUMA_SUPPORT , libnuma); +STATUS (HAVE_LIBNUMA_SUPPORT , numa_num_possible_cpus); +STATUS (HAVE_LIBPERL_SUPPORT , libperl); +STATUS (HAVE_LIBPYTHON_SUPPORT , libpython); +STATUS (HAVE_SLANG_SUPPORT , libslang); +STATUS (HAVE_LIBCRYPTO_SUPPORT , libcrypto); +STATUS (HAVE_LIBUNWIND_SUPPORT , libunwind); +STATUS (HAVE_DWARF_SUPPORT , libdw-dwarf-unwind); +STATUS (HAVE_ZLIB_SUPPORT , zlib); +STATUS (HAVE_LZMA_SUPPORT , lzma); +STATUS (HAVE_AUXTRACE_SUPPORT , get_cpuid); +STATUS (HAVE_LIBBPF_SUPPORT , bpf); +} + +int cmd_version (int argc,const char **argv) +{ + argc =parse_options (argc, argv, version_options, version_usage, +PARSE_OPT_STOP_AT_NON_OPTION ); +printf ("perf version %s\n" , perf_version_string); + +if (version.build_options || version_verbose ==1 ) +library_status (); +return 0 ; }
PATCH v4 5/6 perf: Support perf -vv
In reply to Jin YaoWe keep having bug reports that when users build perf on their own, but they don't install some needed libraries such as libelf, libbfd/libibery.
The perf can build, but it is missing important functionality.
This patch provides a new option '-vv' for perf which will print the compiled-in status of libraries.
The 'perf -vv' is mapped to 'perf version --build-options'.
For example:
$ ./perf -vv
perf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORTv3:
---
One bug is found in v2. It didn't process the option like '-vabc' correctly. Fix this bug.
v2:
---
Use a global variable version_verbose to record the number of 'v'.
--- tools/perf/perf.c | 6 ++++++ tools/perf/perf.h | 1 + 2 files changed, 7 insertions(+)
tools/perf/perf.c +6 -0
@@ -190,6 +190,12 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)break ; } +if (!strcmp (cmd,"-vv" )) { + (*argv)[0 ] ="version" ; + version_verbose =1 ; +break ; + } +/* * Check remaining flags. */
tools/perf/perf.h +1 -0
@@ -84,6 +84,7 @@ struct record_opts {struct option ;extern const char *const *record_usage;extern struct option *record_options; +extern int version_verbose;int record__parse_freq (const struct option *opt,const char *str,int unset);#endif
Signature · 1 line
2.7.4
tip-bot for Jin Yao
merge bot[tip:perf/urgent] perf tools: Add 'perf -vv' as an alias to 'perf version --build-options'
perf tools: Add 'perf -vv' as an alias to 'perf version --build-options'
Commit-ID: 3aa94b10ab0a818ed9fa2dc06c40812c136f9a5a Gitweb: https://git.kernel.org/tip/3aa94b10ab0a818ed9fa2dc06c40812c136f9a5a Author: Jin Yao <[email protected]> AuthorDate: Fri, 30 Mar 2018 17:27:15 +0800 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Apr 2018 13:50:35 -0300
perf tools: Add 'perf -vv' as an alias to 'perf version --build-options'
We keep having bug reports that when users build perf on their own, but they don't install some needed libraries such as libelf, libbfd/libibery.
The perf can build, but it is missing important functionality.
This patch provides a new option '-vv' for perf which will print the compiled-in status of libraries.
The 'perf -vv' is mapped to 'perf version --build-options'.
For example:
$ ./perf -vv
perf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORTv3:
One bug is found in v2. It didn't process the option like '-vabc' correctly. Fix this bug.
v2:
Use a global variable version_verbose to record the number of 'v'.
--- tools/perf/perf.c | 6 ++++++ tools/perf/perf.h | 1 + 2 files changed, 7 insertions(+)
tools/perf/perf.c +6 -0
@@ -190,6 +190,12 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)break ; } +if (!strcmp (cmd,"-vv" )) { + (*argv)[0 ] ="version" ; + version_verbose =1 ; +break ; + } +/* * Check remaining flags. */
tools/perf/perf.h +1 -0
@@ -84,6 +84,7 @@ struct record_opts {struct option ;extern const char *const *record_usage;extern struct option *record_options; +extern int version_verbose;int record__parse_freq (const struct option *opt,const char *str,int unset);#endif
PATCH v4 6/6 perf Documentation: Create perf-version.txt
In reply to Jin YaoSince a new option '--build-options' is created for 'perf version', so we need to document it.
--- tools/perf/Documentation/perf-version.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 tools/perf/Documentation/perf-version.txt
tools/perf/Documentation/perf-version.txt new file +24 -0
@@ -0,0 +1,24 @@ +perf-version(1) +=============== + +NAME +---- +perf-version - display the version of perf binary + +SYNOPSIS +-------- +'perf version' [--build-options] + +DESCRIPTION +----------- +With no options given, the 'perf version' prints the perf version +on the standard output. + +If the option '--build-options' is given, then the status of +compiled-in libraries are printed on the standard output. + +OPTIONS +------- +--build-options:: + Prints the status of compiled-in libraries on the + standard output.
Signature · 1 line
2.7.4
tip-bot for Jin Yao
merge bot[tip:perf/urgent] perf version: Add man page
perf version: Add man page
Commit-ID: 709846725673a944ee38da1c275a6dfbf0576d0f Gitweb: https://git.kernel.org/tip/709846725673a944ee38da1c275a6dfbf0576d0f Author: Jin Yao <[email protected]> AuthorDate: Fri, 30 Mar 2018 17:27:16 +0800 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Apr 2018 13:52:23 -0300
perf version: Add man page
Since a new option '--build-options' is created for 'perf version', so we need to document it.
--- tools/perf/Documentation/perf-version.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
tools/perf/Documentation/perf-version.txt new file +24 -0
@@ -0,0 +1,24 @@ +perf-version(1) +=============== + +NAME +---- +perf-version - display the version of perf binary + +SYNOPSIS +-------- +'perf version' [--build-options] + +DESCRIPTION +----------- +With no options given, the 'perf version' prints the perf version +on the standard output. + +If the option '--build-options' is given, then the status of +compiled-in libraries are printed on the standard output. + +OPTIONS +------- +--build-options:: + Prints the status of compiled-in libraries on the + standard output.
Quoted 43 lines · Jin Yao
We keep having bug reports that when users build perf on their own, but they don't install some needed libraries such as libelf, libbfd/libibery.
The perf can build, but it is missing important functionality. And users may complain that perf has issue or bug.
This patch-set support to print the status of compiled-in libraries.
Once users think perf missing some functionality, it should be very easy for them to check the libraries status.
For example:
$ ./perf version --build-options or ./perf --version --build-options or ./perf -v --build-options or ./perf -vvperf version 4.13.rc5.g6727c5
dwarf: [ on ] # HAVE_DWARF_SUPPORT dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT glibc: [ on ] # HAVE_GLIBC_SUPPORT gtk2: [ on ] # HAVE_GTK2_SUPPORT libaudit: [ OFF ] # HAVE_LIBAUDIT_SUPPORT libbfd: [ on ] # HAVE_LIBBFD_SUPPORT libelf: [ on ] # HAVE_LIBELF_SUPPORT libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT libperl: [ on ] # HAVE_LIBPERL_SUPPORT libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT libslang: [ on ] # HAVE_SLANG_SUPPORT libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT zlib: [ on ] # HAVE_ZLIB_SUPPORT lzma: [ on ] # HAVE_LZMA_SUPPORT get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT bpf: [ on ] # HAVE_LIBBPF_SUPPORT
Quoted 8 lines
v4:
---
1. Also print the macro name. That would make it easier to grep around in the source looking for where code related a particular features is located.2. Update since
HAVE_DWARF_GETLOCATIONSis renamed toHAVE_DWARF_GETLOCATIONS_SUPPORT
thanks,
jirka