perf fixes
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: 8a06bf14008fbf55a86105b8569494f4beeb8762 Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
This tree fixes:
* Make clean brace expansion fix for some shells, from Palmer Cox
* Warn user just once per guest kernel when not finding kernel info, from David Ahern
* perf test fix from Jiri Olsa
* Fix error handling on event creation in perf top, from David Ahern
* Fix check on perf_target__strnerror, from Namhyung Kim
* Save the whole cmdline, from David Ahern
There's this infrastructure change:
* Prep work for the DWARF CFI post unwinder, so that it doesn't uses perf_session in lots of places, just evlist/evsel is enough.
which is a late infrastructure changes that prepare for future feature work - we wanted it upstream to simplify the fixes/development patch flows.
Thanks,
Ingo
------------------>
Arnaldo Carvalho de Melo (7):
perf evsel: Precalculate the sample size
perf session: Use perf_evlist__sample_type more extensively perf session: Use perf_evlist__sample_id_all more extensively perf session: Use perf_evlist__id_hdr_size more extensively perf evlist: Introduce perf_evlist__parse_sample perf evsel: Adopt parse_sample method from perf_event perf session: Remove no longer used synthesize_sample method
David Ahern (7):
perf top: Error handling for counter creation should parallel perf-record perf tool: Save cmdline from user in file header vs what is passed to record perf kvm: Use strtol for walking guestmount directory
perf tools: Introducing rblist
perf tools: Change strlist to use the new rblist
perf tools: Introduce intlist
perf kvm top: Limit guest kernel info message to once
Jiri Olsa (2):
perf test: Fix parse events automated tests perf symbols: Fix array sizes for binary types arrays
Namhyung Kim (1):
perf target: Fix check on buffer size
Palmer Cox (1):
perf tools: Remove brace expansion from clean target
tools/perf/Makefile | 7 +- tools/perf/builtin-record.c | 4 +- tools/perf/builtin-report.c | 5 +- tools/perf/builtin-test.c | 19 ++---- tools/perf/builtin-top.c | 23 +++++-- tools/perf/util/event.h | 3 - tools/perf/util/evlist.c | 7 ++ tools/perf/util/evlist.h | 3 + tools/perf/util/evsel.c | 15 +++-- tools/perf/util/evsel.h | 10 +-- tools/perf/util/header.c | 9 +++ tools/perf/util/intlist.c | 101 ++++++++++++++++++++++++++++ tools/perf/util/intlist.h | 75 +++++++++++++++++++++ tools/perf/util/parse-events-test.c | 12 ++-- tools/perf/util/parse-options.c | 3 + tools/perf/util/python.c | 6 +- tools/perf/util/rblist.c | 107 +++++++++++++++++++++++++++++ tools/perf/util/rblist.h | 47 +++++++++++++ tools/perf/util/session.c | 48 +++++++------ tools/perf/util/session.h | 24 +------ tools/perf/util/strlist.c | 130 ++++++++++++++---------------------- tools/perf/util/strlist.h | 11 +-- tools/perf/util/symbol.c | 14 +++- tools/perf/util/target.c | 2 +- 24 files changed, 498 insertions(+), 187 deletions(-) create mode 100644 tools/perf/util/intlist.c create mode 100644 tools/perf/util/intlist.h create mode 100644 tools/perf/util/rblist.c create mode 100644 tools/perf/util/rblist.h
tools/perf/Makefile +6 -1
@@ -319,6 +319,8 @@ LIB_H += $(ARCH_INCLUDE) LIB_H += util/cgroup.h LIB_H += $(TRACE_EVENT_DIR)event-parse.h LIB_H += util/target.h +LIB_H += util/rblist.h +LIB_H += util/intlist.h LIB_OBJS += $(OUTPUT)util/abspath.o LIB_OBJS += $(OUTPUT)util/alias.o
@@ -383,6 +385,8 @@ LIB_OBJS += $(OUTPUT)util/xyarray.o LIB_OBJS += $(OUTPUT)util/cpumap.o LIB_OBJS += $(OUTPUT)util/cgroup.o LIB_OBJS += $(OUTPUT)util/target.o +LIB_OBJS += $(OUTPUT)util/rblist.o +LIB_OBJS += $(OUTPUT)util/intlist.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
@@ -983,7 +987,8 @@ clean: $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(MAKE) -C Documentation/ clean $(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS - $(RM) $(OUTPUT)util/*-{bison,flex}* + $(RM) $(OUTPUT)util/*-bison* + $(RM) $(OUTPUT)util/*-flex* $(python-clean) .PHONY: all install clean strip $(LIBTRACEEVENT)
tools/perf/builtin-record.c +1 -3
@@ -313,7 +313,7 @@ try_again: } } -perf_session__update_sample_type (session); +perf_session__set_id_hdr_size (session); }static int process_buildids (struct perf_record *rec)
@@ -844,8 +844,6 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)struct perf_record *rec = &record;char errbuf[BUFSIZ ]; -perf_header__set_cmdline (argc, argv); - evsel_list =perf_evlist__new (NULL ,NULL );if (evsel_list ==NULL )return -ENOMEM ;
tools/perf/builtin-report.c +3 -2
@@ -249,8 +249,9 @@ static int process_read_event(struct perf_tool *tool,static int perf_report__setup_sample_type (struct perf_report *rep) {struct perf_session *self = rep->session; +u64 sample_type =perf_evlist__sample_type (self->evlist); -if (!self->fd_pipe && !(self->sample_type &PERF_SAMPLE_CALLCHAIN )) { +if (!self->fd_pipe && !(sample_type &PERF_SAMPLE_CALLCHAIN )) {if (sort__has_parent) {ui__error ("Selected --sort parent, but no " "callchain data. Did you call "
@@ -274,7 +275,7 @@ static int perf_report__setup_sample_type(struct perf_report *rep)if (sort__branch_mode ==1 ) {if (!self->fd_pipe && - !(self->sample_type &PERF_SAMPLE_BRANCH_STACK )) { + !(sample_type &PERF_SAMPLE_BRANCH_STACK )) {ui__error ("Selected -b but no branch data. " "Did you call perf record without -b?\n" );return -1 ;
tools/perf/builtin-test.c +4 -15
@@ -478,7 +478,6 @@ static int test__basic_mmap(void)unsigned int nr_events[nsyscalls], expected_nr_events[nsyscalls], i, j;struct perf_evsel *evsels[nsyscalls], *evsel; -int sample_size =__perf_evsel__sample_size (attr.sample_type);for (i =0 ; i < nsyscalls; ++i) {char name[64 ];
@@ -563,8 +562,7 @@ static int test__basic_mmap(void) goto out_munmap; } - err =perf_event__parse_sample (event, attr.sample_type, sample_size, - false, &sample, false); + err =perf_evlist__parse_sample (evlist, event, &sample, false);if (err) {pr_err ("Can't parse sample, err = %d\n" , err); goto out_munmap;
@@ -661,12 +659,12 @@ static int test__PERF_RECORD(void)const char *cmd ="sleep" ;const char *argv[] = { cmd,"1" ,NULL , };char *bname; -u64 sample_type, prev_time =0 ; +u64 prev_time =0 ;bool found_cmd_mmap = false, found_libc_mmap = false, found_vdso_mmap = false, found_ld_mmap = false; -int err =-1 , errs =0 , i, wakeups =0 , sample_size; +int err =-1 , errs =0 , i, wakeups =0 ;u32 cpu;int total_events =0 , nr_events[PERF_RECORD_MAX ] = {0 , };
@@ -757,13 +755,6 @@ static int test__PERF_RECORD(void) }/* -* We'll need these two to parse the PERF_SAMPLE_* fields in each -* event. -*/ - sample_type =perf_evlist__sample_type (evlist); - sample_size =__perf_evsel__sample_size (sample_type); - -/* * Now that all is properly set up, enable the events, they will * count just on workload.pid, which will start... */
@@ -788,9 +779,7 @@ static int test__PERF_RECORD(void)if (type <PERF_RECORD_MAX ) nr_events[type]++; - err =perf_event__parse_sample (event, sample_type, - sample_size, true, - &sample, false); + err =perf_evlist__parse_sample (evlist, event, &sample, false);if (err <0 ) {if (verbose)perf_event__fprintf (event, stderr);
tools/perf/builtin-top.c +17 -6
@@ -38,6 +38,7 @@#include "util/cpumap.h" #include "util/xyarray.h" #include "util/sort.h" +#include "util/intlist.h" #include "util/debug.h"
@@ -706,8 +707,16 @@ static void perf_event__process_sample(struct perf_tool *tool,int err;if (!machine && perf_guest) { -pr_err ("Can't find guest [%d]'s kernel information\n" , - event->ip.pid); +static struct intlist *seen; + +if (!seen) + seen =intlist__new (); + +if (!intlist__has_entry (seen, event->ip.pid)) { +pr_err ("Can't find guest [%d]'s kernel information\n" , + event->ip.pid); +intlist__add (seen, event->ip.pid); + }return ; }
@@ -811,7 +820,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)int ret;while ((event =perf_evlist__mmap_read (top->evlist, idx)) !=NULL ) { - ret =perf_session__parse_sample (session, event, &sample); + ret =perf_evlist__parse_sample (top->evlist, event, &sample, false);if (ret) {pr_err ("Can't parse sample, err = %d\n" , ret);continue ;
@@ -943,8 +952,10 @@ try_again:* based cpu-clock-tick sw counter, which * is always available even if no PMU support: */ -if (attr->type ==PERF_TYPE_HARDWARE && - attr->config ==PERF_COUNT_HW_CPU_CYCLES ) { +if ((err ==ENOENT || err ==ENXIO ) && + (attr->type ==PERF_TYPE_HARDWARE ) && + (attr->config ==PERF_COUNT_HW_CPU_CYCLES )) { +if (verbose)ui__warning ("Cycles event not supported,\n" "trying to fall back to cpu-clock-ticks\n" );
@@ -1032,7 +1043,7 @@ static int __cmd_top(struct perf_top *top) &top->session->host_machine);perf_top__start_counters (top); top->session->evlist = top->evlist; -perf_session__update_sample_type (top->session); +perf_session__set_id_hdr_size (top->session);/* Wait for a minimal set of events before starting the snapshot */ poll (top->evlist->pollfd, top->evlist->nr_fds,100 );
tools/perf/util/event.h +0 -3
@@ -197,9 +197,6 @@ int perf_event__preprocess_sample(const union perf_event *self,const char *perf_event__name (unsigned int id); -int perf_event__parse_sample (const union perf_event *event,u64 type, -int sample_size,bool sample_id_all, -struct perf_sample *sample,bool swapped);int perf_event__synthesize_sample (union perf_event *event,u64 type,const struct perf_sample *sample,bool swapped);
tools/perf/util/evlist.c +7 -0
@@ -881,3 +881,10 @@ int perf_evlist__start_workload(struct perf_evlist *evlist)return 0 ; } + +int perf_evlist__parse_sample (struct perf_evlist *evlist,union perf_event *event, +struct perf_sample *sample,bool swapped) +{ + struct perf_evsel *e = list_entry(evlist->entries.next, struct perf_evsel, node); +return perf_evsel__parse_sample (e, event, sample, swapped); +}
tools/perf/util/evlist.h +3 -0
@@ -122,6 +122,9 @@ u64 perf_evlist__sample_type(const struct perf_evlist *evlist);bool perf_evlist__sample_id_all (const const struct perf_evlist *evlist);u16 perf_evlist__id_hdr_size (const struct perf_evlist *evlist); +int perf_evlist__parse_sample (struct perf_evlist *evlist,union perf_event *event, +struct perf_sample *sample,bool swapped); +bool perf_evlist__valid_sample_type (const struct perf_evlist *evlist);bool perf_evlist__valid_sample_id_all (const struct perf_evlist *evlist);
tools/perf/util/evsel.c +8 -7
@@ -20,7 +20,7 @@#define FD (e, x, y) (*(int *)xyarray__entry(e->fd, x, y))#define GROUP_FD (group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) -int __perf_evsel__sample_size (u64 sample_type) +static int __perf_evsel__sample_size (u64 sample_type) {u64 mask = sample_type &PERF_SAMPLE_MASK ;int size =0 ;
@@ -53,6 +53,7 @@ void perf_evsel__init(struct perf_evsel *evsel, evsel->attr = *attr;INIT_LIST_HEAD (&evsel->node);hists__init (&evsel->hists); + evsel->sample_size =__perf_evsel__sample_size (attr->sample_type); }struct perf_evsel *perf_evsel__new (struct perf_event_attr *attr,int idx)
@@ -728,10 +729,10 @@ static bool sample_overlap(const union perf_event *event,return false; } -int perf_event__parse_sample (const union perf_event *event,u64 type, -int sample_size,bool sample_id_all, +int perf_evsel__parse_sample (struct perf_evsel *evsel,union perf_event *event,struct perf_sample *data,bool swapped) { +u64 type = evsel->attr.sample_type;const u64 *array;/*
@@ -746,14 +747,14 @@ int perf_event__parse_sample(const union perf_event *event, u64 type, data->period =1 ;if (event->header.type !=PERF_RECORD_SAMPLE ) { -if (!sample_id_all) +if (!evsel->attr.sample_id_all)return 0 ;return perf_event__parse_id_sample (event, type, data, swapped); } array = event->sample.array; -if (sample_size +sizeof (event->header) > event->header.size) +if (evsel->sample_size +sizeof (event->header) > event->header.size)return -EFAULT ;if (type &PERF_SAMPLE_IP ) {
@@ -895,7 +896,7 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type, u.val32[1 ] = sample->tid;if (swapped) {/* -* Inverse of what is done in perf_event__parse_sample +* Inverse of what is done in perf_evsel__parse_sample */ u.val32[0 ] =bswap_32 (u.val32[0 ]); u.val32[1 ] =bswap_32 (u.val32[1 ]);
@@ -930,7 +931,7 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type, u.val32[0 ] = sample->cpu;if (swapped) {/* -* Inverse of what is done in perf_event__parse_sample +* Inverse of what is done in perf_evsel__parse_sample */ u.val32[0 ] =bswap_32 (u.val32[0 ]); u.val64 =bswap_64 (u.val64);
tools/perf/util/evsel.h +3 -7
@@ -65,6 +65,7 @@ struct perf_evsel {void *func;void *data; } handler; +unsigned int sample_size;bool supported; };
@@ -177,13 +178,8 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, return __perf_evsel__read(evsel, ncpus, nthreads, true); } -int __perf_evsel__sample_size (u64 sample_type); - -static inline int perf_evsel__sample_size (struct perf_evsel *evsel) -{ -return __perf_evsel__sample_size (evsel->attr.sample_type); -} -void hists__init (struct hists *hists); +int perf_evsel__parse_sample (struct perf_evsel *evsel,union perf_event *event, +struct perf_sample *sample,bool swapped);#endif /* __PERF_EVSEL_H */
tools/perf/util/header.c +9 -0
@@ -174,6 +174,15 @@ perf_header__set_cmdline(int argc, const char **argv) {int i; +/* +* If header_argv has already been set, do not override it. +* This allows a command to set the cmdline, parse args and +* then call another builtin function that implements a +* command -- e.g, cmd_kvm calling cmd_record. +*/ +if (header_argv) +return 0 ; + header_argc = (u32 )argc;/* do not include NULL termination */
tools/perf/util/intlist.c new file +101 -0
101 lines not on this page · raw message
tools/perf/util/intlist.h new file +75 -0
75 lines not on this page · raw message
tools/perf/util/parse-events-test.c +6 -6
@@ -13,6 +13,9 @@ do { \ } \ } while (0) +#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \ + PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) +static int test__checkevent_tracepoint (struct perf_evlist *evlist) { struct perf_evsel *evsel = list_entry(evlist->entries.next,
@@ -21,8 +24,7 @@ static int test__checkevent_tracepoint(struct perf_evlist *evlist)TEST_ASSERT_VAL ("wrong number of entries" ,1 == evlist->nr_entries);TEST_ASSERT_VAL ("wrong type" ,PERF_TYPE_TRACEPOINT == evsel->attr.type);TEST_ASSERT_VAL ("wrong sample_type" , - (PERF_SAMPLE_RAW |PERF_SAMPLE_TIME |PERF_SAMPLE_CPU ) == - evsel->attr.sample_type); +PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);TEST_ASSERT_VAL ("wrong sample_period" ,1 == evsel->attr.sample_period);return 0 ; }
@@ -37,8 +39,7 @@ static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)TEST_ASSERT_VAL ("wrong type" ,PERF_TYPE_TRACEPOINT == evsel->attr.type);TEST_ASSERT_VAL ("wrong sample_type" , - (PERF_SAMPLE_RAW |PERF_SAMPLE_TIME |PERF_SAMPLE_CPU ) - == evsel->attr.sample_type); +PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);TEST_ASSERT_VAL ("wrong sample_period" ,1 == evsel->attr.sample_period); }
@@ -428,8 +429,7 @@ static int test__checkevent_list(struct perf_evlist *evlist) evsel = list_entry(evsel->node.next, struct perf_evsel, node);TEST_ASSERT_VAL ("wrong type" ,PERF_TYPE_TRACEPOINT == evsel->attr.type);TEST_ASSERT_VAL ("wrong sample_type" , - (PERF_SAMPLE_RAW |PERF_SAMPLE_TIME |PERF_SAMPLE_CPU ) == - evsel->attr.sample_type); +PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);TEST_ASSERT_VAL ("wrong sample_period" ,1 == evsel->attr.sample_period);TEST_ASSERT_VAL ("wrong exclude_user" , evsel->attr.exclude_user);TEST_ASSERT_VAL ("wrong exclude_kernel" , !evsel->attr.exclude_kernel);
tools/perf/util/parse-options.c +3 -0
@@ -1,6 +1,7 @@#include "util.h" #include "parse-options.h" #include "cache.h" +#include "header.h" #define OPT_SHORT 1#define OPT_UNSET 2
@@ -413,6 +414,8 @@ int parse_options(int argc, const char **argv, const struct option *options, {struct parse_opt_ctx_t ctx; +perf_header__set_cmdline (argc, argv); +parse_options_start (&ctx, argc, argv, flags);switch (parse_options_step (&ctx, options, usagestr)) {case PARSE_OPT_HELP :
tools/perf/util/python.c +1 -5
@@ -797,17 +797,13 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, event =perf_evlist__mmap_read (evlist, cpu);if (event !=NULL ) { -struct perf_evsel *first;PyObject *pyevent =pyrf_event__new (event);struct pyrf_event *pevent = (struct pyrf_event *)pyevent;if (pyevent ==NULL )return PyErr_NoMemory (); - first = list_entry(evlist->entries.next, struct perf_evsel, node); - err =perf_event__parse_sample (event, first->attr.sample_type, -perf_evsel__sample_size (first), - sample_id_all, &pevent->sample, false); + err =perf_evlist__parse_sample (evlist, event, &pevent->sample, false);if (err)return PyErr_Format (PyExc_OSError,"perf: can't parse sample, err=%d" , err);
tools/perf/util/rblist.c new file +107 -0
107 lines not on this page · raw message
tools/perf/util/rblist.h new file +47 -0
47 lines not on this page · raw message
tools/perf/util/session.c +27 -21
131 lines not on this page · raw message
tools/perf/util/session.h +1 -23
@@ -41,13 +41,9 @@ struct perf_session {* perf.data file. */ struct hists hists; -u64 sample_type; -int sample_size;int fd;bool fd_pipe;bool repipe; -bool sample_id_all; -u16 id_hdr_size;int cwdlen;char *cwd;struct ordered_samples ordered_samples;
@@ -86,7 +82,7 @@ void perf_event__attr_swap(struct perf_event_attr *attr);int perf_session__create_kernel_maps (struct perf_session *self); -void perf_session__update_sample_type (struct perf_session *self); +void perf_session__set_id_hdr_size (struct perf_session *session);void perf_session__remove_thread (struct perf_session *self,struct thread *th); static inline
@@ -130,24 +126,6 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *self,size_t perf_session__fprintf_nr_events (struct perf_session *session,FILE *fp); -static inline int perf_session__parse_sample (struct perf_session *session, -const union perf_event *event, -struct perf_sample *sample) -{ -return perf_event__parse_sample (event, session->sample_type, - session->sample_size, - session->sample_id_all, sample, - session->header.needs_swap); -} - -static inline int perf_session__synthesize_sample (struct perf_session *session, -union perf_event *event, -const struct perf_sample *sample) -{ -return perf_event__synthesize_sample (event, session->sample_type, - sample, session->header.needs_swap); -} -struct perf_evsel *perf_session__find_first_evtype (struct perf_session *session,unsigned int type);
tools/perf/util/strlist.c +51 -79
183 lines not on this page · raw message
tools/perf/util/strlist.h +6 -5
@@ -4,14 +4,15 @@#include <linux/rbtree.h> #include <stdbool.h> +#include "rblist.h" +struct str_node {struct rb_node rb_node;const char *s; };struct strlist { -struct rb_root entries; -unsigned int nr_entries; +struct rblist rblist;bool dupstr; };
@@ -32,18 +33,18 @@ static inline bool strlist__has_entry(struct strlist *self, const char *entry)static inline bool strlist__empty (const struct strlist *self) { -return self->nr_entries ==0 ; +return rblist__empty (&self->rblist); }static inline unsigned int strlist__nr_entries (const struct strlist *self) { -return self->nr_entries; +return rblist__nr_entries (&self->rblist); }/* For strlist iteration */ static inline struct str_node *strlist__first (struct strlist *self) { -struct rb_node *rn =rb_first (&self->entries); +struct rb_node *rn =rb_first (&self->rblist.entries); return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; }static inline struct str_node *strlist__next (struct str_node *sn)
tools/perf/util/symbol.c +11 -3
@@ -64,7 +64,7 @@ static enum dso_binary_type binary_type_symtab[] = { DSO_BINARY_TYPE__NOT_FOUND, }; -#define DSO_BINARY_TYPE__SYMTAB_CNT sizeof(binary_type_symtab) +#define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab)static enum dso_binary_type binary_type_data[] = {DSO_BINARY_TYPE__BUILD_ID_CACHE ,
@@ -72,7 +72,7 @@ static enum dso_binary_type binary_type_data[] = { DSO_BINARY_TYPE__NOT_FOUND, }; -#define DSO_BINARY_TYPE__DATA_CNT sizeof(binary_type_data) +#define DSO_BINARY_TYPE__DATA_CNT ARRAY_SIZE(binary_type_data)int dso__name_len (const struct dso *dso) {
@@ -2875,6 +2875,7 @@ int machines__create_guest_kernel_maps(struct rb_root *machines)int i, items =0 ;char path[PATH_MAX ];pid_t pid; +char *endp; if (symbol_conf.default_guest_vmlinux_name || symbol_conf.default_guest_modules ||
@@ -2891,7 +2892,14 @@ int machines__create_guest_kernel_maps(struct rb_root *machines)/* Filter out . and .. */ continue ; } - pid =atoi (namelist[i]->d_name); + pid = (pid_t )strtol (namelist[i]->d_name, &endp,10 ); +if ((*endp !='\0' ) || + (endp == namelist[i]->d_name) || + (errno ==ERANGE )) { +pr_debug ("invalid directory (%s). Skipping.\n" , + namelist[i]->d_name); +continue ; + }sprintf (path,"%s/%s/proc/kallsyms" , symbol_conf.guestmount, namelist[i]->d_name);
tools/perf/util/target.c +1 -1
@@ -110,7 +110,7 @@ int perf_target__strerror(struct perf_target *target, int errnum,int idx;const char *msg; -BUG_ON (buflen >0 ); +BUG_ON (buflen ==0 );if (errnum >=0 ) {const char *err =strerror_r (errnum, buf, buflen);