Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1423601

Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider of cross-platform

From Hekuang <hekuang@huawei.com>
Newsgroups linux.kernel
Subject Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider of cross-platform
Date 2016-06-16 02:30 +0200
Message-ID <rKtm2-1aF-31@gated-at.bofh.it> (permalink)
References <rzHLH-1Co-15@gated-at.bofh.it> <rzJaS-2C9-9@gated-at.bofh.it> <rKjcZ-37G-9@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


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 <hekuang@huawei.com>
>> ---
>>   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

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider  of cross-platform Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-15 15:40 +0200
  Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider of  cross-platform Hekuang <hekuang@huawei.com> - 2016-06-16 02:30 +0200
  Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider of  cross-platform Adrian Hunter <adrian.hunter@intel.com> - 2016-06-16 15:10 +0200
    Re: [PATCH v3 1/7 UPDATE2] perf tools: Find vdso with the consider  of cross-platform Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-16 18:40 +0200

csiph-web