clocksource/drivers/riscv: Add required checks during clock source init
Currently, clocksource registration happens for an invalid cpu for non-smp kernels. This lead to kernel panic as cpu hotplug registration will fail for those cpus. Moreover, riscv_hartid_to_cpuid can return errors now. Do not proceed if hartid or cpuid is invalid. Take this opportunity to print appropriate error strings for different failure cases. Signed-off-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Palmer Dabbelt <palmer@sifive.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
This commit is contained in:
Родитель
29f970cf67
Коммит
26478b2f6a
|
@ -95,13 +95,30 @@ static int __init riscv_timer_init_dt(struct device_node *n)
|
||||||
struct clocksource *cs;
|
struct clocksource *cs;
|
||||||
|
|
||||||
hartid = riscv_of_processor_hartid(n);
|
hartid = riscv_of_processor_hartid(n);
|
||||||
|
if (hartid < 0) {
|
||||||
|
pr_warn("Not valid hartid for node [%pOF] error = [%d]\n",
|
||||||
|
n, hartid);
|
||||||
|
return hartid;
|
||||||
|
}
|
||||||
|
|
||||||
cpuid = riscv_hartid_to_cpuid(hartid);
|
cpuid = riscv_hartid_to_cpuid(hartid);
|
||||||
|
if (cpuid < 0) {
|
||||||
|
pr_warn("Invalid cpuid for hartid [%d]\n", hartid);
|
||||||
|
return cpuid;
|
||||||
|
}
|
||||||
|
|
||||||
if (cpuid != smp_processor_id())
|
if (cpuid != smp_processor_id())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
pr_info("%s: Registering clocksource cpuid [%d] hartid [%d]\n",
|
||||||
|
__func__, cpuid, hartid);
|
||||||
cs = per_cpu_ptr(&riscv_clocksource, cpuid);
|
cs = per_cpu_ptr(&riscv_clocksource, cpuid);
|
||||||
clocksource_register_hz(cs, riscv_timebase);
|
error = clocksource_register_hz(cs, riscv_timebase);
|
||||||
|
if (error) {
|
||||||
|
pr_err("RISCV timer register failed [%d] for cpu = [%d]\n",
|
||||||
|
error, cpuid);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
sched_clock_register(riscv_sched_clock,
|
sched_clock_register(riscv_sched_clock,
|
||||||
BITS_PER_LONG, riscv_timebase);
|
BITS_PER_LONG, riscv_timebase);
|
||||||
|
@ -110,8 +127,8 @@ static int __init riscv_timer_init_dt(struct device_node *n)
|
||||||
"clockevents/riscv/timer:starting",
|
"clockevents/riscv/timer:starting",
|
||||||
riscv_timer_starting_cpu, riscv_timer_dying_cpu);
|
riscv_timer_starting_cpu, riscv_timer_dying_cpu);
|
||||||
if (error)
|
if (error)
|
||||||
pr_err("RISCV timer register failed [%d] for cpu = [%d]\n",
|
pr_err("cpu hp setup state failed for RISCV timer [%d]\n",
|
||||||
error, cpuid);
|
error);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче