mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mark Rutland <mark.rutland@arm.com>
To: linux-arm-kernel@lists.infradead.org
Cc: aou@eecs.berkeley.edu, borntraeger@de.ibm.com, bp@alien8.de,
	broonie@kernel.org, catalin.marinas@arm.com,
	dave.hansen@linux.intel.com, gor@linux.ibm.com,
	hca@linux.ibm.com, linux-kernel@vger.kernel.org,
	madvenka@linux.microsoft.com, mark.rutland@arm.com,
	mhiramat@kernel.org, mingo@redhat.com, mpe@ellerman.id.au,
	palmer@dabbelt.com, paul.walmsley@sifive.com,
	peterz@infradead.org, rostedt@goodmis.org, tglx@linutronix.de,
	will@kernel.org
Subject: [PATCH 4/9] arm64: Make perf_callchain_kernel() use arch_stack_walk()
Date: Wed, 17 Nov 2021 14:07:32 +0000	[thread overview]
Message-ID: <20211117140737.44420-5-mark.rutland@arm.com> (raw)
In-Reply-To: <20211117140737.44420-1-mark.rutland@arm.com>

From: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com>

To enable RELIABLE_STACKTRACE and LIVEPATCH on arm64, we need to
substantially rework arm64's unwinding code. As part of this, we want to
minimize the set of unwind interfaces we expose, and avoid open-coding
of unwind logic outside of stacktrace.c.

Currently perf_callchain_kernel() walks the stack of an interrupted
context by calling start_backtrace() with the context's PC and FP, and
iterating unwind steps using walk_stackframe(). This is functionally
equivalent to calling arch_stack_walk() with the interrupted context's
pt_regs, which will start with the PC and FP from the regs.

Make perf_callchain_kernel() use arch_stack_walk(). This simplifies
perf_callchain_kernel(), and in future will alow us to make
walk_stackframe() private to stacktrace.c.

At the same time, we update the callchain_trace() callback to check the
return value of perf_callchain_store(), which indicates whether there is
space for any further entries. When a non-zero value is returned,
further calls will be ignored, and are redundant, so we can stop the
unwind at this point.

We also remove the stale and confusing comment for callchain_trace.

There should be no functional change as a result of this patch.

Signed-off-by: Madhavan T. Venkataraman <madvenka@linux.microsoft.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
[Mark: elaborate commit message, remove comment]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
---
 arch/arm64/kernel/perf_callchain.c | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_callchain.c
index 4a72c2727309..2160a53272b7 100644
--- a/arch/arm64/kernel/perf_callchain.c
+++ b/arch/arm64/kernel/perf_callchain.c
@@ -132,30 +132,21 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
 	}
 }
 
-/*
- * Gets called by walk_stackframe() for every stackframe. This will be called
- * whist unwinding the stackframe and is like a subroutine return so we use
- * the PC.
- */
 static bool callchain_trace(void *data, unsigned long pc)
 {
 	struct perf_callchain_entry_ctx *entry = data;
-	perf_callchain_store(entry, pc);
-	return true;
+	return perf_callchain_store(entry, pc) == 0;
 }
 
 void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
 			   struct pt_regs *regs)
 {
-	struct stackframe frame;
-
 	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
 		/* We don't support guest os callchain now */
 		return;
 	}
 
-	start_backtrace(&frame, regs->regs[29], regs->pc);
-	walk_stackframe(current, &frame, callchain_trace, entry);
+	arch_stack_walk(callchain_trace, entry, current, regs);
 }
 
 unsigned long perf_instruction_pointer(struct pt_regs *regs)
-- 
2.11.0


  parent reply	other threads:[~2021-11-17 14:08 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-17 14:07 [PATCH 0/9] arm64: stacktrace: unify unwind code Mark Rutland
2021-11-17 14:07 ` [PATCH 1/9] arch: Make ARCH_STACKWALK independent of STACKTRACE Mark Rutland
2021-11-17 14:07 ` [PATCH 2/9] arm64: Add comment for stack_info::kr_cur Mark Rutland
2021-11-17 15:23   ` Mark Brown
2021-11-18 22:25   ` Masami Hiramatsu
2021-11-23 11:47   ` Mark Rutland
2021-11-17 14:07 ` [PATCH 3/9] arm64: Mark __switch_to() as __sched Mark Rutland
2021-11-17 15:42   ` Mark Brown
2021-11-17 14:07 ` Mark Rutland [this message]
2021-11-17 14:07 ` [PATCH 5/9] arm64: Make __get_wchan() use arch_stack_walk() Mark Rutland
2021-11-17 15:50   ` Mark Brown
2021-11-17 14:07 ` [PATCH 6/9] arm64: Make return_address() " Mark Rutland
2021-11-17 14:07 ` [PATCH 7/9] arm64: Make profile_pc() " Mark Rutland
2021-11-17 15:31   ` Mark Brown
2021-11-17 14:07 ` [PATCH 8/9] arm64: Make dump_backtrace() " Mark Rutland
2021-11-17 15:36   ` Mark Brown
2021-11-17 14:07 ` [PATCH 9/9] arm64: Make some stacktrace functions private Mark Rutland
2021-11-17 15:39   ` Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211117140737.44420-5-mark.rutland@arm.com \
    --to=mark.rutland@arm.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=borntraeger@de.ibm.com \
    --cc=bp@alien8.de \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=madvenka@linux.microsoft.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®