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 5/9] arm64: Make __get_wchan() use arch_stack_walk()
Date: Wed, 17 Nov 2021 14:07:33 +0000	[thread overview]
Message-ID: <20211117140737.44420-6-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, __get_wchan() walks the stack of a blocked task by calling
start_backtrace() with the task's saved PC and FP values, and iterating
unwind steps using unwind_frame(). The initialization is functionally
equivalent to calling arch_stack_walk() with the blocked task, which
will start with the task's saved PC and FP values.

Currently __get_wchan() always performs an initial unwind step, which
will stkip __switch_to(), but as this is now marked as a __sched
function, this no longer needs special handling and will be skipped in
the same way as other sched functions.

Make __get_wchan() use arch_stack_walk(). This simplifies __get_wchan(),
and in future will alow us to make unwind_frame() private to
stacktrace.c. At the same time, we can simplify the try_get_task_stack()
check and avoid the unnecessary `stack_page` variable.

The change to the skipping logic means we may terminate one frame
earlier than previously where there are an excessive number of sched
functions in the trace, but this isn't seen in practice, and wchan is
best-effort anyway, so this should not be a problem.

Other than the above, there should be no functional change as a result
of this patch.

Signed-off-by: Madhavan T. Venkataraman <madvenka@linux.microsoft.com>
[Mark: rebase atop wchan changes, simplify, elaborate commit message]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
---
 arch/arm64/kernel/process.c | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 980cad7292af..2410ef046232 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -529,30 +529,37 @@ struct task_struct *__switch_to(struct task_struct *prev,
 	return last;
 }
 
+struct wchan_info {
+	unsigned long	pc;
+	int		count;
+};
+
+static bool get_wchan_cb(void *arg, unsigned long pc)
+{
+	struct wchan_info *wchan_info = arg;
+
+	if (!in_sched_functions(pc)) {
+		wchan_info->pc = pc;
+		return false;
+	}
+	return wchan_info->count++ < 16;
+}
+
 unsigned long __get_wchan(struct task_struct *p)
 {
-	struct stackframe frame;
-	unsigned long stack_page, ret = 0;
-	int count = 0;
+	struct wchan_info wchan_info = {
+		.pc = 0,
+		.count = 0,
+	};
 
-	stack_page = (unsigned long)try_get_task_stack(p);
-	if (!stack_page)
+	if (!try_get_task_stack(p))
 		return 0;
 
-	start_backtrace(&frame, thread_saved_fp(p), thread_saved_pc(p));
-
-	do {
-		if (unwind_frame(p, &frame))
-			goto out;
-		if (!in_sched_functions(frame.pc)) {
-			ret = frame.pc;
-			goto out;
-		}
-	} while (count++ < 16);
+	arch_stack_walk(get_wchan_cb, &wchan_info, p, NULL);
 
-out:
 	put_task_stack(p);
-	return ret;
+
+	return wchan_info.pc;
 }
 
 unsigned long arch_align_stack(unsigned long sp)
-- 
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 ` [PATCH 4/9] arm64: Make perf_callchain_kernel() use arch_stack_walk() Mark Rutland
2021-11-17 14:07 ` Mark Rutland [this message]
2021-11-17 15:50   ` [PATCH 5/9] arm64: Make __get_wchan() " 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-6-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®