[PATCH v2] riscv: cacheinfo: Fix using smp_processor_id() in preemptible
Arnd Bergmann
arnd at kernel.org
Tue Dec 22 11:23:06 EST 2020
On Tue, Dec 22, 2020 at 5:01 PM Kefeng Wang <wangkefeng.wang at huawei.com> wrote:
>
> Use raw_smp_processor_id instead of smp_processor_id() to fix warning,
>
> BUG: using smp_processor_id() in preemptible [00000000] code: init/1
> caller is debug_smp_processor_id+0x1c/0x26
> CPU: 0 PID: 1 Comm: init Not tainted 5.10.0-rc4 #211
> Call Trace:
> walk_stackframe+0x0/0xaa
> show_stack+0x32/0x3e
> dump_stack+0x76/0x90
> check_preemption_disabled+0xaa/0xac
> debug_smp_processor_id+0x1c/0x26
> get_cache_size+0x18/0x68
> load_elf_binary+0x868/0xece
> bprm_execve+0x224/0x498
> kernel_execve+0xdc/0x142
> run_init_process+0x90/0x9e
> try_to_run_init_process+0x12/0x3c
> kernel_init+0xb4/0xf8
> ret_from_exception+0x0/0xc
>
> The issue is found when CONFIG_DEBUG_PREEMPT enabled.
The warning sounds legitimate.
> static struct cacheinfo *get_cacheinfo(u32 level, enum cache_type type)
> {
> - struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(smp_processor_id());
> + struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(raw_smp_processor_id());
And this just hides the warning if someone calls this function
without disabling preemption first.
If you cannot use the normal get_cpu()/put_cpu() interfaces or
the cacheinfo of the boot CPU, maybe add a comment to explain
why raw_smp_processor_id() is necessary here.
Arnd
More information about the linux-riscv
mailing list