From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933076AbcFPAYp (ORCPT ); Wed, 15 Jun 2016 20:24:45 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:44668 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752819AbcFPAYo (ORCPT ); Wed, 15 Jun 2016 20:24:44 -0400 Subject: Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider of cross-platform To: Arnaldo Carvalho de Melo , Adrian Hunter , Jiri Olsa References: <573AC939.8070107@intel.com> <1463475894-163531-1-git-send-email-hekuang@huawei.com> <20160615133406.GG3978@kernel.org> CC: , , , , , , , , , , , , , , , From: Hekuang Message-ID: <5761F160.4080007@huawei.com> Date: Thu, 16 Jun 2016 08:22:56 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160615133406.GG3978@kernel.org> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.110.55.166] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090201.5761F174.0019,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 9a7477842b9cbe53007eeb830b704b5d Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org hi 在 2016/6/15 21:34, Arnaldo Carvalho de Melo 写道: > Em Tue, May 17, 2016 at 09:04:54AM +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. > Without looking at the code, just trying to understand your patch by > reading your description: Why would we look for names if we have > build-ids? All this type and name comparasions seems wrong if we have a > build-id, no? > > Adrian? > > - Arnaldo > We should find a binary with the {name, buildid} pair, the key is name not buildid. There're more than one vdso binaries in system, we store parts/all of them when recording and should find out which one to use for unwinding in the 'perf script' stage, by comparing the name and the thread's dso_type. Thank you. >> 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. >> >> 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..8f81c41 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); >> + if (dso_type != dso__type(dso, machine)) >> + dso = NULL; >> + } >> + break; >> + case DSO__TYPE_X32BIT: >> + dso = __dsos__find(&machine->dsos, DSO__NAME_VDSOX32, 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