From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932578AbcGDTZU (ORCPT ); Mon, 4 Jul 2016 15:25:20 -0400 Received: from mail.kernel.org ([198.145.29.136]:52882 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753362AbcGDTZR (ORCPT ); Mon, 4 Jul 2016 15:25:17 -0400 Date: Mon, 4 Jul 2016 16:25:11 -0300 From: Arnaldo Carvalho de Melo To: Jiri Olsa Cc: He Kuang , lkml , David Ahern , Ingo Molnar , Namhyung Kim , Peter Zijlstra Subject: Re: [PATCH 3/4] perf tools: Add initialized arg into unwind__prepare_access Message-ID: <20160704192511.GX5324@kernel.org> References: <1467634583-29147-1-git-send-email-jolsa@kernel.org> <1467634583-29147-4-git-send-email-jolsa@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1467634583-29147-4-git-send-email-jolsa@kernel.org> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.6.1 (2016-04-27) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Mon, Jul 04, 2016 at 02:16:22PM +0200, Jiri Olsa escreveu: > Adding initialized arg into unwind__prepare_access > to get feedback about the initialization state. > > It's not possible to get it from error code, because > we return 0 even in case we don't recognize dso, which > is valid. > > The 'initialized' value is used in following patch > to speedup unwind__prepare_access calls logic in > fork path. > > Cc: He Kuang > Link: http://lkml.kernel.org/n/tip-vzmw5piz7diqa7rd6c49mjph@git.kernel.org > Signed-off-by: Jiri Olsa > --- > tools/perf/util/thread.c | 2 +- > tools/perf/util/unwind-libunwind.c | 11 +++++++++-- > tools/perf/util/unwind.h | 9 ++++++--- > 3 files changed, 16 insertions(+), 6 deletions(-) > > diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c > index f30f9566fddc..2439b122a4e4 100644 > --- a/tools/perf/util/thread.c > +++ b/tools/perf/util/thread.c > @@ -202,7 +202,7 @@ int thread__insert_map(struct thread *thread, struct map *map) > { > int ret; > > - ret = unwind__prepare_access(thread, map); > + ret = unwind__prepare_access(thread, map, NULL); > if (ret) > return ret; > > diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c > index 854711966cad..6d542a4e0648 100644 > --- a/tools/perf/util/unwind-libunwind.c > +++ b/tools/perf/util/unwind-libunwind.c > @@ -14,15 +14,19 @@ static void unwind__register_ops(struct thread *thread, > thread->unwind_libunwind_ops = ops; > } > > -int unwind__prepare_access(struct thread *thread, struct map *map) > +int unwind__prepare_access(struct thread *thread, struct map *map, > + bool *initialized) > { > const char *arch; > enum dso_type dso_type; > struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops; > + int err; > > if (thread->addr_space) { > pr_debug("unwind: thread map already set, dso=%s\n", > map->dso->name); > + if (initialized) > + *initialized = true; > return 0; > } > > @@ -51,7 +55,10 @@ int unwind__prepare_access(struct thread *thread, struct map *map) > out_register: > unwind__register_ops(thread, ops); > > - return thread->unwind_libunwind_ops->prepare_access(thread); > + err = thread->unwind_libunwind_ops->prepare_access(thread); > + if (initialized) > + *initialized = err ? false : true; > + return err; > } > > void unwind__flush_access(struct thread *thread) > diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h > index 84c6d44d52f9..17ea1f928f13 100644 > --- a/tools/perf/util/unwind.h > +++ b/tools/perf/util/unwind.h > @@ -42,12 +42,14 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, > #endif > > int LIBUNWIND__ARCH_REG_ID(int regnum); > -int unwind__prepare_access(struct thread *thread, struct map *map); > +int unwind__prepare_access(struct thread *thread, struct map *map, > + bool *initialized); > void unwind__flush_access(struct thread *thread); > void unwind__finish_access(struct thread *thread); > #else > static inline int unwind__prepare_access(struct thread *thread __maybe_unused, > - struct map *map __maybe_unused) > + struct map *map __maybe_unused, > + bool *initialized __maybe_unused); > { > return 0; > } > @@ -67,7 +69,8 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, > } > > static inline int unwind__prepare_access(struct thread *thread __maybe_unused, > - struct map *map __maybe_unused) > + struct map *map __maybe_unused, > + bool *initialized __maybe_unused); > { > return 0; > } That extra ; breaks the build on centos5 (i.e. on an arch where the above code gets compiled: CC /tmp/build/perf/bench/sched-pipe.o In file included from util/machine.c:14: util/unwind.h:74: error: expected identifier or '(' before '{' token MKDIR /tmp/build/perf/tests/ CC /tmp/build/perf/tests/parse-events.o mv: cannot stat `/tmp/build/perf/util/.machine.o.tmp': No such file or directory make[3]: *** [/tmp/build/perf/util/machine.o] Error 1 make[3]: *** Waiting for unfinished jobs.... MKDIR /tmp/build/perf/tests/ CC /tmp/build/perf/tests/dso-data.o make[2]: *** [util] Error 2 make[1]: *** [/tmp/build/perf/libperf-in.o] Error 2 make[1]: *** Waiting for unfinished jobs.... MKDIR /tmp/build/perf/tests/ Fixing it. > -- > 2.4.11