From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753815AbcEPNcr (ORCPT ); Mon, 16 May 2016 09:32:47 -0400 Received: from mail.kernel.org ([198.145.29.136]:33719 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751815AbcEPNcp (ORCPT ); Mon, 16 May 2016 09:32:45 -0400 Date: Mon, 16 May 2016 10:32:40 -0300 From: Arnaldo Carvalho de Melo To: He Kuang Cc: peterz@infradead.org, mingo@redhat.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, wangnan0@huawei.com, jpoimboe@redhat.com, ak@linux.intel.com, eranian@google.com, namhyung@kernel.org, adrian.hunter@intel.com, sukadev@linux.vnet.ibm.com, masami.hiramatsu.pt@hitachi.com, tumanova@linux.vnet.ibm.com, kan.liang@intel.com, penberg@kernel.org, dsahern@gmail.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v3 1/7 UPDATE] perf tools: Find vdso with the consider of cross-platform Message-ID: <20160516133240.GC5475@kernel.org> References: <573455BA.1070707@intel.com> <1463129509-160934-1-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1463129509-160934-1-git-send-email-hekuang@huawei.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.6.0 (2016-04-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Fri, May 13, 2016 at 08:51:49AM +0000, He Kuang escreveu: > There's a problem in machine__findnew_vdso(), vdso buildid generated > by a 32-bit machine stores it with the name 'vdso', but when > processing buildid on a 64-bit machine with the same 'perf.data', perf > will search for vdso named as 'vdso32' and get failed. > > This patch tries to find the exsiting dsos in machine->dsos by thread > dso_type. 64-bit thread tries to find vdso with name 'vdso', because > all 64-bit vdso is named as that. 32-bit thread first tries to find > vdso with name 'vdso32' if this thread was run on 64-bit machine, if > failed, then it tries 'vdso' which indicates that the thread was run > on 32-bit machine when recording. Adrian, are you ok now? - Arnaldo > Signed-off-by: He Kuang > --- > tools/perf/util/vdso.c | 40 +++++++++++++++++++++++++++++++++++++--- > 1 file changed, 37 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/vdso.c b/tools/perf/util/vdso.c > index 44d440d..99f4a3d 100644 > --- a/tools/perf/util/vdso.c > +++ b/tools/perf/util/vdso.c > @@ -134,8 +134,6 @@ static struct dso *__machine__addnew_vdso(struct machine *machine, const char *s > return dso; > } > > -#if BITS_PER_LONG == 64 > - > static enum dso_type machine__thread_dso_type(struct machine *machine, > struct thread *thread) > { > @@ -156,6 +154,8 @@ static enum dso_type machine__thread_dso_type(struct machine *machine, > return dso_type; > } > > +#if BITS_PER_LONG == 64 > + > static int vdso__do_copy_compat(FILE *f, int fd) > { > char buf[4096]; > @@ -283,8 +283,38 @@ static int __machine__findnew_vdso_compat(struct machine *machine, > > #endif > > +static struct dso *machine__find_vdso(struct machine *machine, > + struct thread *thread) > +{ > + struct dso *dso = NULL; > + enum dso_type dso_type; > + > + dso_type = machine__thread_dso_type(machine, thread); > + switch (dso_type) { > + case DSO__TYPE_32BIT: > + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO32, true); > + if (!dso) > + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, > + true); > + break; > + case DSO__TYPE_X32BIT: > + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSOX32, true); > + if (!dso) > + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, > + true); > + break; > + case DSO__TYPE_64BIT: > + case DSO__TYPE_UNKNOWN: > + default: > + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, true); > + break; > + } > + > + return dso; > +} > + > struct dso *machine__findnew_vdso(struct machine *machine, > - struct thread *thread __maybe_unused) > + struct thread *thread) > { > struct vdso_info *vdso_info; > struct dso *dso = NULL; > @@ -297,6 +327,10 @@ struct dso *machine__findnew_vdso(struct machine *machine, > if (!vdso_info) > goto out_unlock; > > + dso = machine__find_vdso(machine, thread); > + if (dso) > + goto out_unlock; > + > #if BITS_PER_LONG == 64 > if (__machine__findnew_vdso_compat(machine, thread, vdso_info, &dso)) > goto out_unlock; > -- > 1.8.5.2