From: Jisheng Zhang <jszhang@kernel.org>
To: Karl Mehltretter <kmehltretter@gmail.com>
Cc: Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>, Guo Ren <guoren@kernel.org>,
Andrey Konovalov <andreyknvl@gmail.com>,
Alexander Potapenko <glider@google.com>,
Dmitry Vyukov <dvyukov@google.com>,
kasan-dev@googlegroups.com, linux-riscv@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] riscv: Always inline on_thread_stack()
Date: Thu, 15 Oct 2026 12:28:15 +0800 [thread overview]
Message-ID: <atBWXxzTqLBj6Q6W@xhacker> (raw)
In-Reply-To: <20261012204211.3351-1-kmehltretter@gmail.com>
On Mon, Oct 12, 2026 at 10:42:11PM +0200, Karl Mehltretter wrote:
> With CONFIG_IRQ_STACKS=y, GCC may outline on_thread_stack().
> CONFIG_KCOV_INSTRUMENT_ALL instruments it, and do_irq() calls it before
> irq_enter_rcu() increments the hardirq count.
>
> Normal KCOV records this interrupt coverage in the task's buffer, making
> results timing-dependent.
>
> With CONFIG_KCOV_SELFTEST=y, current->kcov_area remains NULL. In QEMU, a
> timer interrupt called the helper before hardirq accounting. KCOV treated
> it as task coverage and dereferenced NULL. Fault handling recursed to stack
> overflow and stopped boot.
>
> On a BeagleV Ahead, the unpatched kernel did not finish the selftest within
> 120 seconds. Three patched boots completed it and reached init.
>
> Mark the helper __always_inline to keep it in noinstr do_irq(), following
> commit 1894a4030582 ("x86: Always inline on_thread_stack() and
> current_top_of_stack()"), which fixed the same out-of-line call from x86
> noinstr code.
>
> Fixes: 163e76cc6ef4 ("riscv: stack: Support HAVE_IRQ_EXIT_ON_IRQ_STACK")
> Cc: stable@vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
Good catch!
Reviewed-by: Jisheng Zhang <jszhang@kernel.org>
> ---
> Tested with GCC 15.2.0 and QEMU 10.2.1 on v7.3-rc7. Both images
> used byte-identical configs and v7.3-rc7 rebases of these seven pending
> patches (canonical commit IDs shown):
>
> 3a25097bf845 kcov: use unsigned int for kcov_start() mode parameter
> e39a9c820c37 kcov: add kcov_pause()/kcov_resume() helpers
> ae2662563c3e hrtimer: pause KCOV during deferred rearm
> 554af946139e sched: pause KCOV in __schedule()
> 7f608b777204 sched: pause KCOV in try_to_wake_up()
> 2ba73ec2a246 sched: pause KCOV in wake_up_new_task()
> 5ee777070fac context_tracking: exclude from KCOV instrumentation
>
> plain inline __always_inline
> KCOV selftest started yes yes
> KCOV selftest finished no yes
> Reached /init no yes
>
> The plain-inline image stopped after printing "kcov: running self test"
> and reached the 45-second limit. The patched image reached /init in two
> 60-second runs. Those runs timed out after the marker because the test
> /init deliberately loops.
>
> The first common patch is a type prerequisite. The remaining pause and
> exclusion changes suppress separate KCOV callbacks that otherwise obscure
> this test. CONFIG_RISCV_ISA_V_PREEMPTIVE was disabled to avoid a separate
> vector-entry callback. The only A/B source difference was this patch.
>
> The same images were tested on a BeagleV Ahead (TH1520, four C910 CPUs).
> The plain-inline image did not finish the selftest or reach /init during
> 120 seconds after the start message. It reported RCU stalls, and CPU 1
> did not answer NMI requests. No panic or stack-overflow message was
> printed. All three patched runs completed the selftest in about 0.301
> seconds and reached /init.
>
> arch/riscv/include/asm/stacktrace.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/riscv/include/asm/stacktrace.h b/arch/riscv/include/asm/stacktrace.h
> index b1495a7e06ce..c7c991452e11 100644
> --- a/arch/riscv/include/asm/stacktrace.h
> +++ b/arch/riscv/include/asm/stacktrace.h
> @@ -16,7 +16,7 @@ extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *re
> extern void dump_backtrace(struct pt_regs *regs, struct task_struct *task,
> const char *loglvl);
>
> -static inline bool on_thread_stack(void)
> +static __always_inline bool on_thread_stack(void)
> {
> return !(((unsigned long)(current->stack) ^ current_stack_pointer) & ~(THREAD_SIZE - 1));
> }
>
> base-commit: 24a19b953e2a3d0ea5a8c4951a0ab8f32720c907
> --
> 2.53.0
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
prev parent reply other threads:[~2026-10-15 4:48 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-12 20:42 [PATCH] riscv: Always inline on_thread_stack() Karl Mehltretter
2026-10-15 4:28 ` Jisheng Zhang [this message]
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=atBWXxzTqLBj6Q6W@xhacker \
--to=jszhang@kernel.org \
--cc=alex@ghiti.fr \
--cc=andreyknvl@gmail.com \
--cc=aou@eecs.berkeley.edu \
--cc=dvyukov@google.com \
--cc=glider@google.com \
--cc=guoren@kernel.org \
--cc=kasan-dev@googlegroups.com \
--cc=kmehltretter@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=pjw@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 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.