Messages in this thread Patch in this message | | | Date | Thu, 22 Jul 2021 21:37:24 +0800 | From | Jisheng Zhang <> | Subject | Re: [PATCH -next v2] riscv: add VMAP_STACK overflow detection |
| |
On Thu, 22 Jul 2021 01:35:23 -0700 Atish Patra <atishp@atishpatra.org> wrote:
> On Wed, Jul 21, 2021 at 11:12 PM Palmer Dabbelt <palmer@dabbelt.com> wrote: > > > > On Mon, 19 Jul 2021 00:23:06 PDT (-0700), schwab@linux-m68k.org wrote: > > > On Jul 19 2021, tongtiangen wrote: > > > > > >> On 2021/7/17 14:55, Andreas Schwab wrote: > > >>> Please use > > >>> https://download.opensuse.org/repositories/home:/Andreas_Schwab:/riscv:/jeos/images/openSUSE-Tumbleweed-RISC-V-JeOS-efi.riscv64.raw.xz > > >>> and run it in qemu with u-boot as kernel. > > >>> > > >>> Andreas. > > >>> > > >> > > >> Hi andreas: > > >> I used today's latest mainline code and .config provided by you, and I > > >> can't reproduce this panic. > > > > > > Did you test it like I said above? > > > > > > Andreas. > > > > I'm getting this on and off, with just > > > > CONFIG_VMAP_STACK=y > > > > on top of defconfig, when running on QEMU. It's not showing up right > > now: I'd thought it was an issue with that initrd patch, but it went > > away when I re-ran the tests so I'm guessing it's something > > non-deterministic. I'll try to take a look if it comes back. > > > > I got it very frequently on beagleV with the following branch & config. > https://github.com/esmil/linux/commits/beaglev > > beaglev_defconfig > > Disabling CONFIG_VMAP_STACK avoids the crash.
Hi all,
I think we need to pin the stack before calling get_wchan(), could you please try below patch?
Thanks
diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c index ff467b98c3e3..ac7593607fa6 100644 --- a/arch/riscv/kernel/stacktrace.c +++ b/arch/riscv/kernel/stacktrace.c @@ -132,8 +132,12 @@ unsigned long get_wchan(struct task_struct *task) { unsigned long pc = 0; - if (likely(task && task != current && !task_is_running(task))) + if (likely(task && task != current && !task_is_running(task))) { + if (!try_get_task_stack(task)) + return 0; walk_stackframe(task, NULL, save_wchan, &pc); + put_task_stack(task); + } return pc; }
> > > _______________________________________________ > > linux-riscv mailing list > > linux-riscv@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-riscv > > >
| |