Re: [PATCH -next v2] riscv: add VMAP_STACK overflow detection

From: Jisheng Zhang
Date: Thu Jul 22 2021 - 10:30:40 EST


On Thu, 22 Jul 2021 21:37:24 +0800
Jisheng Zhang wrote:

> On Thu, 22 Jul 2021 01:35:23 -0700
> Atish Patra <atishp@xxxxxxxxxxxxxx> wrote:
>
> > On Wed, Jul 21, 2021 at 11:12 PM Palmer Dabbelt <palmer@xxxxxxxxxxx> wrote:
> > >
> > > On Mon, 19 Jul 2021 00:23:06 PDT (-0700), schwab@xxxxxxxxxxxxxx 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

Typo: s/get_wchan/walk_stackframe

> 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@xxxxxxxxxxxxxxxxxxx
> > > http://lists.infradead.org/mailman/listinfo/linux-riscv
> >
> >
> >
>
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@xxxxxxxxxxxxxxxxxxx
> http://lists.infradead.org/mailman/listinfo/linux-riscv