[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAAhV-H71vas03P=3YOCG-orp0NmxHG12A--bbGhHFcVcxeNMdg@mail.gmail.com>
Date: Wed, 21 Jan 2026 10:27:00 +0800
From: Huacai Chen <chenhuacai@...nel.org>
To: Tiezhu Yang <yangtiezhu@...ngson.cn>
Cc: loongarch@...ts.linux.dev, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v1 2/4] LoongArch: Handle percpu handler address in bt_address()
On Tue, Jan 20, 2026 at 9:09 PM Tiezhu Yang <yangtiezhu@...ngson.cn> wrote:
>
> On 2026/1/20 下午9:01, Huacai Chen wrote:
> > On Tue, Jan 20, 2026 at 8:57 PM Tiezhu Yang <yangtiezhu@...ngson.cn> wrote:
> >>
> >> On 2026/1/20 下午8:04, Huacai Chen wrote:
> >>> Hi, Tiezhu,
> >>>
> >>> On Tue, Jan 20, 2026 at 5:23 PM Tiezhu Yang <yangtiezhu@...ngson.cn> wrote:
> >>>>
> >>>> After commit 4cd641a79e69 ("LoongArch: Remove unnecessary checks for
> >>>> ORC unwinder"), the system can not boot normally under some configs,
> >>>> there are many error messages "cannot find unwind pc at".
> >>
> >> ...
> >>
> >>>> +#if defined(CONFIG_NUMA) && !defined(CONFIG_PREEMPT_RT)
> >>>> + for (int cpu = 1; cpu < num_possible_cpus(); cpu++) {
> >>> Use nr_cpu_ids instead of num_possible_cpus() can improve performance a little.
> >>>
> >>>> + int vec_sz = sizeof(exception_handlers);
> >>>> +
> >>> It is better to add "if (!pcpu_handlers[cpu]) continue" here.
> >>
> >> If so, it can use for_each_possible_cpu(cpu) directly?
> > It can, but I remember you want to skip CPU 0?
>
> Yes, that is the intention to use the for loop, but if checking
> !pcpu_handlers[cpu], I think no need to use for loop to skip cpu
> 0, just use for_each_possible_cpu(cpu) is more simple and direct.
My original purpose, checking !pcpu_handlers[cpu] is to handle the
memory allocation failure case, but not for skipping CPU 0.
But yes, it will skip CPU 0 indeed, so you can choose the original for
loop or for_each_possible_cpu(cpu), both OK for me.
>
> The code looks like:
>
> ----->8-----
> diff --git a/arch/loongarch/kernel/unwind_orc.c
> b/arch/loongarch/kernel/unwind_orc.c
> index d6b3688a1ce9..a0ba4e416f99 100644
> --- a/arch/loongarch/kernel/unwind_orc.c
> +++ b/arch/loongarch/kernel/unwind_orc.c
> @@ -352,6 +352,24 @@ static inline unsigned long bt_address(unsigned
> long ra)
> {
> extern unsigned long eentry;
>
> +#if defined(CONFIG_NUMA) && !defined(CONFIG_PREEMPT_RT)
> + int cpu;
> + int vec_sz __maybe_unused;
__maybe_unused is not needed because it is already in #ifdefs.
> +
> + for_each_possible_cpu(cpu) {
> + if (!pcpu_handlers[cpu])
> + continue;
> +
> + vec_sz = sizeof(exception_handlers);
Calculate it when defining it.
Huacai
> +
> + if (ra >= pcpu_handlers[cpu] &&
> + ra < pcpu_handlers[cpu] + vec_sz) {
> + ra = eentry + (ra - pcpu_handlers[cpu]);
> + break;
> + }
> + }
> +#endif
> +
> if (ra >= eentry && ra < eentry + EXCCODE_INT_END * VECSIZE) {
> unsigned long func;
> unsigned long type = (ra - eentry) / VECSIZE;
>
> Please let me know what is the better way.
>
> Thanks,
> Tiezhu
>
>
Powered by blists - more mailing lists