All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Jinyang He <hejinyang@loongson.cn>,
	Huacai Chen <chenhuacai@loongson.cn>,
	Sasha Levin <sashal@kernel.org>,
	chenhuacai@kernel.org, git@xen0n.name, zhangqing@loongson.cn,
	jiaxun.yang@flygoat.com, jack@suse.cz, Jason@zx2c4.com,
	wangkailong@jari.cn, loongarch@lists.linux.dev
Subject: [PATCH AUTOSEL 6.1 17/35] LoongArch: Get frame info in unwind_start() when regs is not available
Date: Tue, 24 Jan 2023 08:41:13 -0500	[thread overview]
Message-ID: <20230124134131.637036-17-sashal@kernel.org> (raw)
In-Reply-To: <20230124134131.637036-1-sashal@kernel.org>

From: Jinyang He <hejinyang@loongson.cn>

[ Upstream commit 429a9671f235c94fc4b5d6687308714b74adc820 ]

At unwind_start(), it is better to get its frame info here rather than
get them outside, even we don't have 'regs'. In this way we can simply
use unwind_{start, next_frame, done} outside.

Signed-off-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/loongarch/kernel/process.c         | 12 +++---------
 arch/loongarch/kernel/unwind_guess.c    |  6 ++++++
 arch/loongarch/kernel/unwind_prologue.c | 16 +++++++++++++---
 3 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
index ddb8ba4eb399..90a5de746332 100644
--- a/arch/loongarch/kernel/process.c
+++ b/arch/loongarch/kernel/process.c
@@ -185,20 +185,14 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 
 unsigned long __get_wchan(struct task_struct *task)
 {
-	unsigned long pc;
+	unsigned long pc = 0;
 	struct unwind_state state;
 
 	if (!try_get_task_stack(task))
 		return 0;
 
-	unwind_start(&state, task, NULL);
-	state.sp = thread_saved_fp(task);
-	get_stack_info(state.sp, state.task, &state.stack_info);
-	state.pc = thread_saved_ra(task);
-#ifdef CONFIG_UNWINDER_PROLOGUE
-	state.type = UNWINDER_PROLOGUE;
-#endif
-	for (; !unwind_done(&state); unwind_next_frame(&state)) {
+	for (unwind_start(&state, task, NULL);
+	     !unwind_done(&state); unwind_next_frame(&state)) {
 		pc = unwind_get_return_address(&state);
 		if (!pc)
 			break;
diff --git a/arch/loongarch/kernel/unwind_guess.c b/arch/loongarch/kernel/unwind_guess.c
index 5afa6064d73e..0c20e5184de6 100644
--- a/arch/loongarch/kernel/unwind_guess.c
+++ b/arch/loongarch/kernel/unwind_guess.c
@@ -25,6 +25,12 @@ void unwind_start(struct unwind_state *state, struct task_struct *task,
 	if (regs) {
 		state->sp = regs->regs[3];
 		state->pc = regs->csr_era;
+	} else if (task && task != current) {
+		state->sp = thread_saved_fp(task);
+		state->pc = thread_saved_ra(task);
+	} else {
+		state->sp = (unsigned long)__builtin_frame_address(0);
+		state->pc = (unsigned long)__builtin_return_address(0);
 	}
 
 	state->task = task;
diff --git a/arch/loongarch/kernel/unwind_prologue.c b/arch/loongarch/kernel/unwind_prologue.c
index 4571c3c87cd4..1c5b65756144 100644
--- a/arch/loongarch/kernel/unwind_prologue.c
+++ b/arch/loongarch/kernel/unwind_prologue.c
@@ -111,12 +111,22 @@ void unwind_start(struct unwind_state *state, struct task_struct *task,
 		    struct pt_regs *regs)
 {
 	memset(state, 0, sizeof(*state));
+	state->type = UNWINDER_PROLOGUE;
 
-	if (regs &&  __kernel_text_address(regs->csr_era)) {
-		state->pc = regs->csr_era;
+	if (regs) {
 		state->sp = regs->regs[3];
+		state->pc = regs->csr_era;
 		state->ra = regs->regs[1];
-		state->type = UNWINDER_PROLOGUE;
+		if (!__kernel_text_address(state->pc))
+			state->type = UNWINDER_GUESS;
+	} else if (task && task != current) {
+		state->sp = thread_saved_fp(task);
+		state->pc = thread_saved_ra(task);
+		state->ra = 0;
+	} else {
+		state->sp = (unsigned long)__builtin_frame_address(0);
+		state->pc = (unsigned long)__builtin_return_address(0);
+		state->ra = 0;
 	}
 
 	state->task = task;
-- 
2.39.0


  parent reply	other threads:[~2023-01-24 13:42 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-24 13:40 [PATCH AUTOSEL 6.1 01/35] ARM: dts: imx: Fix pca9547 i2c-mux node name Sasha Levin
2023-01-24 13:40 ` Sasha Levin
2023-01-24 13:40 ` [PATCH AUTOSEL 6.1 02/35] ARM: dts: vf610: Fix pca9548 i2c-mux node names Sasha Levin
2023-01-24 13:40   ` Sasha Levin
2023-01-24 13:40 ` [PATCH AUTOSEL 6.1 03/35] arm64: dts: freescale: Fix pca954x " Sasha Levin
2023-01-24 13:40   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 04/35] arm64: dts: imx8mq-thor96: fix no-mmc property for SDHCI Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 05/35] firmware: arm_scmi: Clear stale xfer->hdr.status Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 06/35] bpf: Skip task with pid=1 in send_signal_common() Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 07/35] erofs/zmap.c: Fix incorrect offset calculation Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 08/35] mac80211: Fix MLO address translation for multiple bss case Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 09/35] arm64: dts: msm8994-angler: fix the memory map Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 10/35] ARM: omap1: fix building gpio15xx Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 11/35] init/Kconfig: fix LOCALVERSION_AUTO help text Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 12/35] kselftest: Fix error message for unconfigured LLVM builds Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 13/35] erofs: clean up parsing of fscache related options Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 14/35] btrfs: factor out scratching of one regular super block Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 15/35] btrfs: stop using write_one_page in btrfs_scratch_superblock Sasha Levin
2023-01-24 16:57   ` David Sterba
2023-02-01 15:21     ` Sasha Levin
     [not found] ` <20230124134131.637036-1-sashal-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2023-01-24 13:41   ` [PATCH AUTOSEL 6.1 16/35] blk-cgroup: fix missing pd_online_fn() while activating policy Sasha Levin
2023-01-24 13:41     ` Sasha Levin
2023-01-24 13:41 ` Sasha Levin [this message]
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 18/35] ACPI: video: Add backlight=native DMI quirk for Acer Aspire 4810T Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 19/35] block: fix hctx checks for batch allocation Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 20/35] s390: workaround invalid gcc-11 out of bounds read warning Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 21/35] HID: uclogic: Add support for XP-PEN Deco 01 V2 Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 22/35] HID: playstation: sanity check DualSense calibration data Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 23/35] dmaengine: imx-sdma: Fix a possible memory leak in sdma_transfer_init Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 24/35] gpiolib: acpi: Allow ignoring wake capability on pins that aren't in _AEI Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 25/35] cifs: fix return of uninitialized rc in dfs_cache_update_tgthint() Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 26/35] nvme-apple: only reset the controller when RTKit is running Sasha Levin
2023-01-24 13:41   ` Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 27/35] octeontx2-af: recover CPT engine when it gets fault Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 28/35] octeontx2-af: add mbox for CPT LF reset Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 29/35] octeontx2-af: modify FLR sequence for CPT Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 30/35] octeontx2-af: optimize cpt pf identification Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 31/35] octeontx2-af: restore rxc conf after teardown sequence Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 32/35] octeontx2-af: update cpt lf alloc mailbox Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 33/35] octeontx2-af: add mbox to return CPT_AF_FLT_INT info Sasha Levin
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 34/35] prlimit: do_prlimit needs to have a speculation check Sasha Levin
2023-01-24 15:28   ` Greg Kroah-Hartman
2023-01-24 13:41 ` [PATCH AUTOSEL 6.1 35/35] ext4: deal with legacy signed xattr name hash values Sasha Levin
2023-01-24 16:50   ` Linus Torvalds
2023-01-24 17:23     ` Linus Torvalds
2023-01-25 16:01       ` Theodore Ts'o
2023-01-26 14:12         ` Sasha Levin

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=20230124134131.637036-17-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=Jason@zx2c4.com \
    --cc=chenhuacai@kernel.org \
    --cc=chenhuacai@loongson.cn \
    --cc=git@xen0n.name \
    --cc=hejinyang@loongson.cn \
    --cc=jack@suse.cz \
    --cc=jiaxun.yang@flygoat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=loongarch@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    --cc=wangkailong@jari.cn \
    --cc=zhangqing@loongson.cn \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.