[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <66d0ff83-bf67-5576-4c74-10f825855091@linux.microsoft.com>
Date: Tue, 24 Aug 2021 12:38:25 -0500
From: "Madhavan T. Venkataraman" <madvenka@...ux.microsoft.com>
To: Mark Rutland <mark.rutland@....com>
Cc: broonie@...nel.org, jpoimboe@...hat.com, ardb@...nel.org,
nobuta.keiya@...itsu.com, sjitindarsingh@...il.com,
catalin.marinas@....com, will@...nel.org, jmorris@...ei.org,
pasha.tatashin@...een.com, jthierry@...hat.com,
linux-arm-kernel@...ts.infradead.org,
live-patching@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [RFC PATCH v8 1/4] arm64: Make all stack walking functions use
arch_stack_walk()
>>> diff --git a/arch/arm64/kernel/return_address.c b/arch/arm64/kernel/return_address.c
>>> index a6d18755652f..92a0f4d434e4 100644
>>> --- a/arch/arm64/kernel/return_address.c
>>> +++ b/arch/arm64/kernel/return_address.c
>>> @@ -35,15 +35,11 @@ NOKPROBE_SYMBOL(save_return_addr);
>>> void *return_address(unsigned int level)
>>> {
>>> struct return_address_data data;
>>> - struct stackframe frame;
>>>
>>> data.level = level + 2;
>>> data.addr = NULL;
>>>
>>> - start_backtrace(&frame,
>>> - (unsigned long)__builtin_frame_address(0),
>>> - (unsigned long)return_address);
>>> - walk_stackframe(current, &frame, save_return_addr, &data);
>>> + arch_stack_walk(save_return_addr, &data, current, NULL);
>>>
>>> if (!data.level)
>>> return data.addr;
>>
>> Nor that arch_stack_walk() will start with it's caller, so
>> return_address() will be included in the trace where it wasn't
>> previously, which implies we need to skip an additional level.
>>
>
> You are correct. I will fix this. Thanks for catching this.
>
>> That said, I'm not entirely sure why we need to skip 2 levels today; it
>> might be worth checking that's correct.
>>
>
> AFAICT, return_address() acts like builtin_return_address(). That is, it
> returns the address of the caller. If func() calls return_address(),
> func() wants its caller's address. So, return_address() and func() need to
> be skipped.
>
> I will change it to skip 3 levels instead of 2.
>
Actually, I take that back. I remember now. return_address() used to start
with PC=return_address(). That is, it used to start with itself. arch_stack_walk()
starts with its caller which, in this case, is return_address(). So, I don't need
to change anything.
Do you agree?
Madhavan
Powered by blists - more mailing lists