>>> 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