[PATCH 1/2] riscv: cpu_ops: Change return value type of cpu_is_stopped() to bool
Danil Skrebenkov
danil.skrebenkov at cloudbear.ru
Fri Apr 10 07:36:59 PDT 2026
> In the original sbi_cpu_is_stopped(), if rc doesn't equal to the
> SBI_HSM_STATE_STOPPED, it will return rc to the caller directly. But
> there is a hidden problem, the rc could be SBI_HSM_STATE_STARTED, if
> so, this function will report cpu stopped while the cpu isn't really
> stopped.
>
> Furthermore, from the name of cpu_is_stopped(), it gives a sense the
> return value is a bool type, true means the cpu is stopped, conversely
> false means the cpu is not stopped.
>
> Here change the return value type to bool and change the callers
> accordingly. This could fix the above two issues.
>
> Fixes: f1e58583b9c7c ("RISC-V: Support cpu hotplug")
> Signed-off-by: Hui Wang <hui.wang at canonical.com>
> ---
> arch/riscv/include/asm/cpu_ops.h | 2 +-
> arch/riscv/kernel/cpu-hotplug.c | 2 +-
> arch/riscv/kernel/cpu_ops_sbi.c | 6 ++----
> 3 files changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/arch/riscv/include/asm/cpu_ops.h b/arch/riscv/include/asm/cpu_ops.h
> index 176b570ef982..065811fca594 100644
> --- a/arch/riscv/include/asm/cpu_ops.h
> +++ b/arch/riscv/include/asm/cpu_ops.h
> @@ -24,7 +24,7 @@ struct cpu_operations {
> struct task_struct *tidle);
> #ifdef CONFIG_HOTPLUG_CPU
> void (*cpu_stop)(void);
> - int (*cpu_is_stopped)(unsigned int cpu);
> + bool (*cpu_is_stopped)(unsigned int cpu);
> #endif
> };
>
> diff --git a/arch/riscv/kernel/cpu-hotplug.c b/arch/riscv/kernel/cpu-hotplug.c
> index a0ee426f6d93..c240e9be9fba 100644
> --- a/arch/riscv/kernel/cpu-hotplug.c
> +++ b/arch/riscv/kernel/cpu-hotplug.c
> @@ -57,7 +57,7 @@ void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
> /* Verify from the firmware if the cpu is really stopped*/
> if (cpu_ops->cpu_is_stopped)
> ret = cpu_ops->cpu_is_stopped(cpu);
> - if (ret)
> + if (!ret)
> pr_warn("CPU%u may not have stopped: %d\n", cpu, ret);
> }
>
> diff --git a/arch/riscv/kernel/cpu_ops_sbi.c b/arch/riscv/kernel/cpu_ops_sbi.c
> index 00aff669f5f2..a17b7576b77d 100644
> --- a/arch/riscv/kernel/cpu_ops_sbi.c
> +++ b/arch/riscv/kernel/cpu_ops_sbi.c
> @@ -88,16 +88,14 @@ static void sbi_cpu_stop(void)
> pr_crit("Unable to stop the cpu %d (%d)\n", smp_processor_id(), ret);
> }
>
> -static int sbi_cpu_is_stopped(unsigned int cpuid)
> +static bool sbi_cpu_is_stopped(unsigned int cpuid)
> {
> int rc;
> unsigned long hartid = cpuid_to_hartid_map(cpuid);
>
> rc = sbi_hsm_hart_get_status(hartid);
>
> - if (rc == SBI_HSM_STATE_STOPPED)
> - return 0;
> - return rc;
> + return (rc == SBI_HSM_STATE_STOPPED);
> }
> #endif
>
Here is a some ambiguous behavior because pr_warn() in cpu-hotplug.c
must send a cpu state number.
I would say it is needed to use sbi_hsm_hart_get_status(cpu) in pr_warn
like this:
pr_warn("CPU%u may not have stopped: %d\n", cpu,
sbi_hsm_hart_get_status(cpu))
so that we can define what is the current state of hart in case it is
not SBI_HSM_STATE_STOPPED.
More information about the linux-riscv
mailing list