perf fixes
Subsystems (3)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
# HEAD: c36608843adf4674c462e49f63b64b2987d0ba0b Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Tooling fixes, the biggest patch is one that decouples the kernel's list.h from tooling list.h.
Thanks,
Ingo
------------------>
Jiri Olsa (5):
tools: Add clean targets for tools directory tools bpf: Add *.cmd files clean up
tools lockdep: Add *.cmd files clean up perf tools: Add missing sources to perf's MANIFEST perf stat: Fix recort_usage typo
Josh Poimboeuf (3):
tools: Make list.h self-sufficient
tools: Fix formatting of the "make -C tools" help message tools subcmd: Add missing NORETURN define for parse-options.h
Namhyung Kim (6):
perf record: Add --buildid-all option
perf tools: Add more usage tips
perf tools: Add file_only config option to strlist perf tools: Set and pass DOCDIR to builtin-report.c perf ui/tui: Print helpline message as is perf tools: Fallback to srcdir/Documentation/tips.txt
Naveen N. Rao (1):
perf bpf: Fix build breakage due to libbpf
Wang Nan (8):
perf tools: Add -lutil in python lib list for broken python-config perf tools: Fix phony build target for build-test
perf tools: Fix PowerPC native building
tools: Move Makefile.arch from perf/config to tools/scripts tools build: Add BPF feature check to test-all
perf test: Fix false TEST_OK result for 'perf test hist' perf test: Reset err after using it hold errcode in hist testcases perf tools: Fix mmap2 event allocation in synthesize code
tools/Makefile | 43 +-
tools/build/feature/test-all.c | 5 +
tools/build/feature/test-bpf.c | 20 +-
tools/include/linux/list.h | 753 ++++++++++++++++++++++++++-
tools/lib/bpf/Makefile | 18 +-
tools/lib/bpf/bpf.c | 4 +-
tools/lib/lockdep/Makefile | 2 +-
tools/lib/subcmd/parse-options.h | 4 +
tools/perf/Build | 1 +
tools/perf/Documentation/perf-record.txt | 3 +
tools/perf/Documentation/tips.txt | 15 +
tools/perf/MANIFEST | 2 +
tools/perf/builtin-record.c | 26 +-
tools/perf/builtin-report.c | 10 +-
tools/perf/builtin-stat.c | 8 +-
tools/perf/config/Makefile | 7 +-
tools/perf/tests/hists_common.c | 5 -
tools/perf/tests/hists_cumulate.c | 1 +
tools/perf/tests/hists_filter.c | 1 +
tools/perf/tests/hists_link.c | 1 +
tools/perf/tests/hists_output.c | 1 +
tools/perf/tests/make | 18 +-
tools/perf/ui/browsers/hists.c | 2 +-
tools/perf/util/event.c | 4 +-
tools/perf/util/strlist.c | 8 +
tools/perf/util/strlist.h | 9 +-
tools/perf/util/util.c | 11 +-
tools/{perf/config => scripts}/Makefile.arch | 0
28 files changed, 917 insertions(+), 65 deletions(-)
rename tools/{perf/config => scripts}/Makefile.arch (100%)tools/Makefile +26 -17
@@ -8,23 +8,23 @@ include scripts/Makefile.include help: @echo 'Possible targets:' @echo '' - @echo ' acpi - ACPI tools' - @echo ' cgroup - cgroup tools' - @echo ' cpupower - a tool for all things x86 CPU power' - @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' - @echo ' hv - tools used when in Hyper-V clients' - @echo ' iio - IIO tools' - @echo ' lguest - a minimal 32-bit x86 hypervisor' - @echo ' perf - Linux performance measurement and analysis tool' - @echo ' selftests - various kernel selftests' - @echo ' turbostat - Intel CPU idle stats and freq reporting tool' - @echo ' usb - USB testing tools' - @echo ' virtio - vhost test module' - @echo ' net - misc networking tools' - @echo ' vm - misc vm tools' + @echo ' acpi - ACPI tools' + @echo ' cgroup - cgroup tools' + @echo ' cpupower - a tool for all things x86 CPU power' + @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' + @echo ' freefall - laptop accelerometer program for disk protection' + @echo ' hv - tools used when in Hyper-V clients' + @echo ' iio - IIO tools' + @echo ' lguest - a minimal 32-bit x86 hypervisor' + @echo ' net - misc networking tools' + @echo ' perf - Linux performance measurement and analysis tool' + @echo ' selftests - various kernel selftests' + @echo ' tmon - thermal monitoring and tuning tool' + @echo ' turbostat - Intel CPU idle stats and freq reporting tool' + @echo ' usb - USB testing tools' + @echo ' virtio - vhost test module' + @echo ' vm - misc vm tools' @echo ' x86_energy_perf_policy - Intel energy policy tool' - @echo ' tmon - thermal monitoring and tuning tool' - @echo ' freefall - laptop accelerometer program for disk protection' @echo '' @echo 'You can do:' @echo ' $$ make -C tools/ <tool>_install'
@@ -127,6 +127,12 @@ install: acpi_install cgroup_install cpupower_install hv_install firewire_instal libapi_clean: $(call descend,lib/api,clean) +libbpf_clean: + $(call descend,lib/bpf,clean) + +libsubcmd_clean: + $(call descend,lib/subcmd,clean) + perf_clean: $(call descend,$(@:_clean=),clean)
@@ -142,9 +148,12 @@ install: acpi_install cgroup_install cpupower_install hv_install firewire_instal freefall_clean: $(call descend,laptop/freefall,clean) +build_clean: + $(call descend,build,clean) + clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \ perf_clean selftests_clean turbostat_clean usb_clean virtio_clean \ vm_clean net_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ - freefall_clean + freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean .PHONY: FORCE
tools/build/feature/test-all.c +5 -0
@@ -125,6 +125,10 @@# include "test-get_cpuid.c" #undef main +#define main main_test_bpf +# include "test-bpf.c" +#undef main +int main (int argc,char *argv[]) {main_test_libpython ();
@@ -153,6 +157,7 @@ int main(int argc, char *argv[])main_test_pthread_attr_setaffinity_np ();main_test_lzma ();main_test_get_cpuid (); +main_test_bpf ();return 0 ; }
tools/build/feature/test-bpf.c +19 -1
@@ -1,9 +1,23 @@ +#include <asm/unistd.h> #include <linux/bpf.h> +#include <unistd.h> + +#ifndef __NR_bpf +# if defined(__i386__) +# define __NR_bpf 357 +# elif defined(__x86_64__) +# define __NR_bpf 321 +# elif defined(__aarch64__) +# define __NR_bpf 280 +# error __NR_bpf not defined. libbpf does not support your arch. +# endif +#endif int main (void ) {union bpf_attr attr; +/* Check fields in attr */ attr.prog_type =BPF_PROG_TYPE_KPROBE ; attr.insn_cnt =0 ; attr.insns =0 ;
@@ -14,5 +28,9 @@ int main(void) attr.kern_version =0 ; attr = attr; -return 0 ; +/* +* Test existence of __NR_bpf and BPF_PROG_LOAD. +* This call should fail if we run the testcase. +*/ +return syscall (__NR_bpf,BPF_PROG_LOAD , attr,sizeof (attr)); }
tools/include/linux/list.h +747 -6
762 lines not on this page · raw message
tools/lib/bpf/Makefile +9 -9
@@ -6,6 +6,12 @@ BPF_EXTRAVERSION = 1 MAKEFLAGS += --no-print-directory +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(shell pwd))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +#$(info Determined 'srctree' to be $(srctree)) +endif # Makefiles suck: This macro sets a default value of $(2) for the # variable named by $(1), unless the variable has been set by
@@ -31,7 +37,8 @@ INSTALL = install DESTDIR ?= DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' -LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1) +include $(srctree)/tools/scripts/Makefile.arch + ifeq ($(LP64), 1) libdir_relative = lib64 else
@@ -57,13 +64,6 @@ ifndef VERBOSE VERBOSE = 0 endif -ifeq ($(srctree),) -srctree := $(patsubst %/,%,$(dir $(shell pwd))) -srctree := $(patsubst %/,%,$(dir $(srctree))) -srctree := $(patsubst %/,%,$(dir $(srctree))) -#$(info Determined 'srctree' to be $(srctree)) -endif - FEATURE_USER = .libbpf FEATURE_TESTS = libelf libelf-getphdrnum libelf-mmap bpf FEATURE_DISPLAY = libelf bpf
@@ -192,7 +192,7 @@ install: install_lib $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null clean: - $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \ + $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd \ $(RM) LIBBPF-CFLAGS $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf
tools/lib/bpf/bpf.c +2 -2
@@ -14,8 +14,8 @@#include "bpf.h" /* -* When building perf, unistd.h is override. Define __NR_bpf is -* required to be defined. +* When building perf, unistd.h is overrided. __NR_bpf is +* required to be defined explicitly. */ #ifndef __NR_bpf# if defined(__i386__)
tools/lib/lockdep/Makefile +1 -1
@@ -149,7 +149,7 @@ install_lib: all_cmd install: install_lib clean: - $(RM) *.o *~ $(TARGETS) *.a *liblockdep*.so* $(VERSION_FILES) .*.d + $(RM) *.o *~ $(TARGETS) *.a *liblockdep*.so* $(VERSION_FILES) .*.d .*.cmd $(RM) tags TAGS PHONY += force
tools/lib/subcmd/parse-options.h +4 -0
@@ -4,6 +4,10 @@#include <stdbool.h> #include <stdint.h> +#ifndef NORETURN +#define NORETURN __attribute__((__noreturn__)) +#endif +enum parse_opt_type {/* special types */ OPTION_END ,
tools/perf/Build +1 -0
@@ -42,6 +42,7 @@ CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" \ -include $(OUTPUT)PERF-VERSION-FILE CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_SQ))" CFLAGS_builtin-report.o += -DTIPDIR="BUILD_STR($(tipdir_SQ))" +CFLAGS_builtin-report.o += -DDOCDIR="BUILD_STR($(srcdir_SQ)/Documentation)" libperf-y += util/ libperf-y += arch/
tools/perf/Documentation/perf-record.txt +3 -0
@@ -338,6 +338,9 @@ Options passed to clang when compiling BPF scriptlets. Specify vmlinux path which has debuginfo. (enabled when BPF prologue is on) +--buildid-all:: +Record build-id of all DSOs regardless whether it's actually hit or not. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1]
tools/perf/Documentation/tips.txt +15 -0
@@ -12,3 +12,18 @@ List events using substring match: perf list <keyword> To see list of saved events and attributes: perf evlist -v Use --symfs <dir> if your symbol files are in non-standard locations To see callchains in a more compact form: perf report -g folded +Show individual samples with: perf script +Limit to show entries above 5% only: perf report --percent-limit 5 +Profiling branch (mis)predictions with: perf record -b / perf report +Treat branches as callchains: perf report --branch-history +To count events in every 1000 msec: perf stat -I 1000 +Print event counts in CSV format with: perf stat -x, +If you have debuginfo enabled, try: perf report -s sym,srcline +For memory address profiling, try: perf mem record / perf mem report +For tracepoint events, try: perf report -s trace_fields +To record callchains for each sample: perf record -g +To record every process run by an user: perf record -u <user> +Skip collecing build-id when recording: perf record -B +To change sampling frequency to 100 Hz: perf record -F 100 +See assembly instructions with percentage: perf annotate <symbol> +If you prefer Intel style assembly, try: perf annotate -M intel
tools/perf/MANIFEST +2 -0
@@ -28,6 +28,7 @@ tools/lib/string.c tools/lib/symbol/kallsyms.c tools/lib/symbol/kallsyms.h tools/lib/find_bit.c +tools/lib/bitmap.c tools/include/asm/atomic.h tools/include/asm/barrier.h tools/include/asm/bug.h
@@ -57,6 +58,7 @@ tools/include/linux/rbtree_augmented.h tools/include/linux/string.h tools/include/linux/types.h tools/include/linux/err.h +tools/include/linux/bitmap.h include/asm-generic/bitops/arch_hweight.h include/asm-generic/bitops/const_hweight.h include/asm-generic/bitops/fls64.h
tools/perf/builtin-record.c +20 -6
@@ -50,6 +50,7 @@ struct record {int realtime_prio;bool no_buildid;bool no_buildid_cache; +bool buildid_all;unsigned long long samples; };
@@ -362,6 +363,13 @@ static int process_buildids(struct record *rec)*/ symbol_conf.ignore_vmlinux_buildid = true; +/* +* If --buildid-all is given, it marks all DSO regardless of hits, +* so no need to process samples. +*/ +if (rec->buildid_all) + rec->tool.sample =NULL ; +return perf_session__process_events (session); }
@@ -756,12 +764,8 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)if (!rec->no_buildid) {process_buildids (rec); -/* -* We take all buildids when the file contains -* AUX area tracing data because we do not decode the -* trace because it would take too long. -*/ -if (rec->opts.full_auxtrace) + +if (rec->buildid_all)dsos__hit_all (rec->session); }perf_session__write_header (rec->session, rec->evlist, fd, true);
@@ -1138,6 +1142,8 @@ struct option __record_options[] = { "options passed to clang when compiling BPF scriptlets"),OPT_STRING (0 ,"vmlinux" , &symbol_conf.vmlinux_name,"file" ,"vmlinux pathname" ), +OPT_BOOLEAN (0 ,"buildid-all" , &record.buildid_all, +"Record build-id of all DSOs regardless of hits" ), OPT_END() };
@@ -1255,6 +1261,14 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)if (err) goto out_symbol_exit; +/* +* We take all buildids when the file contains +* AUX area tracing data because we do not decode the +* trace because it would take too long. +*/ +if (rec->opts.full_auxtrace) + rec->buildid_all = true; +if (record_opts__config (&rec->opts)) { err = -EINVAL ; goto out_symbol_exit;
tools/perf/builtin-report.c +9 -1
@@ -28,6 +28,7 @@#include "util/tool.h" #include <subcmd/parse-options.h> +#include <subcmd/exec-cmd.h> #include "util/parse-events.h" #include "util/thread.h"
@@ -433,7 +434,14 @@ static int report__browse_hists(struct report *rep)int ret;struct perf_session *session = rep->session;struct perf_evlist *evlist = session->evlist; -const char *help =perf_tip (TIPDIR ); +const char *help =perf_tip (system_path (TIPDIR )); + +if (help ==NULL ) { +/* fallback for people who don't install perf ;-) */ + help =perf_tip (DOCDIR ); +if (help ==NULL ) + help ="Cannot load tips.txt file, please install perf!" ; + }switch (use_browser) {case 1 :
tools/perf/builtin-stat.c +4 -4
@@ -1588,7 +1588,7 @@ static int add_default_attributes(void)return perf_evlist__add_default_attrs (evsel_list, very_very_detailed_attrs); } -static const char *const recort_usage[] = { +static const char *const stat_record_usage[] = {"perf stat record [<options>]" ,NULL , };
@@ -1611,7 +1611,7 @@ static int __cmd_record(int argc, const char **argv)struct perf_session *session;struct perf_data_file *file = &perf_stat.file; - argc =parse_options (argc, argv, stat_options, record_usage, + argc =parse_options (argc, argv, stat_options, stat_record_usage,PARSE_OPT_STOP_AT_NON_OPTION );if (output_name)
@@ -1745,7 +1745,7 @@ int process_cpu_map_event(struct perf_tool *tool __maybe_unused,return set_maps (st); } -static const char *const report_usage[] = { +static const char *const stat_report_usage[] = {"perf stat report [<options>]" ,NULL , };
@@ -1779,7 +1779,7 @@ static int __cmd_report(int argc, const char **argv)struct stat st;int ret; - argc =parse_options (argc, argv, options, report_usage,0 ); + argc =parse_options (argc, argv, options, stat_report_usage,0 );if (!input_name || !strlen (input_name)) {if (!fstat (STDIN_FILENO , &st) &&S_ISFIFO (st.st_mode))
tools/perf/config/Makefile +5 -2
@@ -17,7 +17,7 @@ detected_var = $(shell echo "$(1)=$($(1))" >> $(OUTPUT).config-detected) CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS) -include $(src-perf)/config/Makefile.arch +include $(srctree)/tools/scripts/Makefile.arch $(call detected_var,ARCH)
@@ -493,7 +493,7 @@ else PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null) PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) - PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) + PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null) FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
@@ -692,6 +692,7 @@ template_dir = share/perf-core/templates STRACE_GROUPS_DIR = share/perf-core/strace/groups htmldir = share/doc/perf-doc tipdir = share/doc/perf-tip +srcdir = $(srctree)/tools/perf ifeq ($(prefix),/usr) sysconfdir = /etc ETC_PERFCONFIG = $(sysconfdir)/perfconfig
@@ -722,6 +723,7 @@ tipdir_SQ = $(subst ','\'',$(tipdir)) prefix_SQ = $(subst ','\'',$(prefix)) sysconfdir_SQ = $(subst ','\'',$(sysconfdir)) libdir_SQ = $(subst ','\'',$(libdir)) +srcdir_SQ = $(subst ','\'',$(srcdir)) ifneq ($(filter /%,$(firstword $(perfexecdir))),) perfexec_instdir = $(perfexecdir)
@@ -776,6 +778,7 @@ $(call detected_var,STRACE_GROUPS_DIR_SQ) $(call detected_var,prefix_SQ) $(call detected_var,perfexecdir_SQ) $(call detected_var,tipdir_SQ) +$(call detected_var,srcdir_SQ) $(call detected_var,LIBDIR) $(call detected_var,GTK_CFLAGS) $(call detected_var,PERL_EMBED_CCOPTS)
tools/perf/tests/hists_common.c +0 -5
@@ -87,11 +87,6 @@ struct machine *setup_fake_machine(struct machines *machines)return NULL ; } -if (machine__create_kernel_maps (machine)) { -pr_debug ("Cannot create kernel maps\n" ); -return NULL ; - } -for (i =0 ; i <ARRAY_SIZE (fake_threads); i++) {struct thread *thread;
tools/perf/tests/hists_cumulate.c +1 -0
@@ -706,6 +706,7 @@ int test__hists_cumulate(int subtest __maybe_unused) err =parse_events (evlist,"cpu-clock" ,NULL );if (err) goto out; + err =TEST_FAIL ;machines__init (&machines);
tools/perf/tests/hists_filter.c +1 -0
@@ -120,6 +120,7 @@ int test__hists_filter(int subtest __maybe_unused) err =parse_events (evlist,"task-clock" ,NULL );if (err) goto out; + err =TEST_FAIL ;/* default sort order (comm,dso,sym) will be used */ if (setup_sorting (NULL ) <0 )
tools/perf/tests/hists_link.c +1 -0
@@ -293,6 +293,7 @@ int test__hists_link(int subtest __maybe_unused)if (err) goto out; + err =TEST_FAIL ;/* default sort order (comm,dso,sym) will be used */ if (setup_sorting (NULL ) <0 ) goto out;
tools/perf/tests/hists_output.c +1 -0
@@ -597,6 +597,7 @@ int test__hists_output(int subtest __maybe_unused) err =parse_events (evlist,"cpu-clock" ,NULL );if (err) goto out; + err =TEST_FAIL ;machines__init (&machines);
tools/perf/tests/make +16 -2
@@ -1,3 +1,5 @@ +include ../scripts/Makefile.include + ifndef MK ifeq ($(MAKECMDGOALS),) # no target specified, trigger the whole suite
@@ -12,7 +14,19 @@ endif else PERF := . -include config/Makefile.arch +# As per kernel Makefile, avoid funny character set dependencies +unexport LC_ALL +LC_COLLATE=C +LC_NUMERIC=C +export LC_COLLATE LC_NUMERIC + +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(shell pwd))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +#$(info Determined 'srctree' to be $(srctree)) +endif + +include $(srctree)/tools/scripts/Makefile.arch # FIXME looks like x86 is the only arch running tests ;-) # we need some IS_(32/64) flag to make this generic
@@ -280,5 +294,5 @@ all: $(run) $(run_O) tarpkg make_kernelsrc make_kernelsrc_tools out: $(run_O) @echo OK -.PHONY: all $(run) $(run_O) tarpkg clean +.PHONY: all $(run) $(run_O) tarpkg clean make_kernelsrc make_kernelsrc_tools endif # ifndef MK
tools/perf/ui/browsers/hists.c +1 -1
@@ -480,7 +480,7 @@ static int hist_browser__run(struct hist_browser *browser, const char *help)hists__browser_title (browser->hists, hbt, title,sizeof (title)); -if (ui_browser__show (&browser->b, title, help) <0 ) +if (ui_browser__show (&browser->b, title,"%s" , help) <0 )return -1 ;while (1 ) {
tools/perf/util/event.c +2 -2
@@ -503,7 +503,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool,if (comm_event ==NULL ) goto out; - mmap_event =malloc (sizeof (mmap_event->mmap) + machine->id_hdr_size); + mmap_event =malloc (sizeof (mmap_event->mmap2) + machine->id_hdr_size);if (mmap_event ==NULL ) goto out_free_comm;
@@ -577,7 +577,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,if (comm_event ==NULL ) goto out; - mmap_event =malloc (sizeof (mmap_event->mmap) + machine->id_hdr_size); + mmap_event =malloc (sizeof (mmap_event->mmap2) + machine->id_hdr_size);if (mmap_event ==NULL ) goto out_free_comm;
tools/perf/util/strlist.c +8 -0
@@ -126,6 +126,11 @@ static int strlist__parse_list_entry(struct strlist *slist, const char *s, err =strlist__load (slist, subst); goto out; } + +if (slist->file_only) { + err = -ENOENT ; + goto out; + } } err =strlist__add (slist, s);
@@ -157,11 +162,13 @@ struct strlist *strlist__new(const char *list, const struct strlist_config *confif (slist !=NULL ) {bool dupstr = true; +bool file_only = false;const char *dirname =NULL ;if (config) { dupstr = !config->dont_dupstr; dirname = config->dirname; + file_only = config->file_only; }rblist__init (&slist->rblist);
@@ -170,6 +177,7 @@ struct strlist *strlist__new(const char *list, const struct strlist_config *conf slist->rblist.node_delete = strlist__node_delete; slist->dupstr = dupstr; + slist->file_only = file_only;if (list &&strlist__parse_list (slist, list, dirname) !=0 ) goto out_error;
tools/perf/util/strlist.h +8 -1
@@ -13,11 +13,18 @@ struct str_node {struct strlist {struct rblist rblist; -bool dupstr; +bool dupstr; +bool file_only; }; +/* +* @file_only: When dirname is present, only consider entries as filenames, +* that should not be added to the list if dirname/entry is not +* found +*/ struct strlist_config {bool dont_dupstr; +bool file_only;const char *dirname; };
tools/perf/util/util.c +6 -5
@@ -17,7 +17,6 @@#include <unistd.h> #include "callchain.h" #include "strlist.h" -#include <subcmd/exec-cmd.h> struct callchain_param callchain_param = { .mode =CHAIN_GRAPH_ABS ,
@@ -672,14 +671,16 @@ const char *perf_tip(const char *dirpath)struct str_node *node;char *tip =NULL ;struct strlist_config conf = { - .dirname =system_path (dirpath) , + .dirname = dirpath, + .file_only = true, }; tips =strlist__new ("tips.txt" , &conf); -if (tips ==NULL ||strlist__nr_entries (tips) ==1 ) { - tip = (char *)"Cannot find tips.txt file" ; +if (tips ==NULL ) +return errno ==ENOENT ?NULL :"Tip: get more memory! ;-p" ; + +if (strlist__nr_entries (tips) ==0 ) goto out; - } node =strlist__entry (tips,random () %strlist__nr_entries (tips));if (asprintf (&tip,"Tip: %s" , node->s) <0 )