Hello Dan,
On 03/05/24 20:54, Dan Carpenter wrote:
Hello Beleswar Padhi,
Commit 3c8a9066d584 ("remoteproc: k3-r5: Do not allow core1 to power
up before core0 via sysfs") from Apr 30, 2024 (linux-next), leads to
the following Smatch static checker warning:
drivers/remoteproc/ti_k3_r5_remoteproc.c:583 k3_r5_rproc_start()
warn: missing unwind goto?
drivers/remoteproc/ti_k3_r5_remoteproc.c:651 k3_r5_rproc_stop()
warn: missing unwind goto?
drivers/remoteproc/ti_k3_r5_remoteproc.c
546 static int k3_r5_rproc_start(struct rproc *rproc)
547 {
548 struct k3_r5_rproc *kproc = rproc->priv;
549 struct k3_r5_cluster *cluster = kproc->cluster;
550 struct device *dev = kproc->dev;
551 struct k3_r5_core *core0, *core;
552 u32 boot_addr;
553 int ret;
554
555 ret = k3_r5_rproc_request_mbox(rproc);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
556 if (ret)
557 return ret;
558
559 boot_addr = rproc->bootaddr;
560 /* TODO: add boot_addr sanity checking */
561 dev_dbg(dev, "booting R5F core using boot addr = 0x%x\n",
boot_addr);
562
563 /* boot vector need not be programmed for Core1 in LockStep
mode */
564 core = kproc->core;
565 ret = ti_sci_proc_set_config(core->tsp, boot_addr, 0, 0);
566 if (ret)
567 goto put_mbox;
568
569 /* unhalt/run all applicable cores */
570 if (cluster->mode == CLUSTER_MODE_LOCKSTEP) {
571 list_for_each_entry_reverse(core, &cluster->cores,
elem) {
572 ret = k3_r5_core_run(core);
573 if (ret)
574 goto unroll_core_run;
575 }
576 } else {
577 /* do not allow core 1 to start before core 0 */
578 core0 = list_first_entry(&cluster->cores, struct
k3_r5_core,
579 elem);
580 if (core != core0 && core0->rproc->state ==
RPROC_OFFLINE) {
581 dev_err(dev, "%s: can not start core 1 before core
0\n",
582 __func__);
--> 583 return -EPERM;
Is there no clean up on this error path? I think we need to do a
goto put_mbox at least.
Thank you for pointing out. Apologies for the oversight. I have sent a
PATCH addressing this bug.
Link to PATCH:
https://lore.kernel.org/all/[email protected]/
Regards,
Beleswar
584 }
585
586 ret = k3_r5_core_run(core);
587 if (ret)
588 goto put_mbox;
589 }
590
591 return 0;
592
593 unroll_core_run:
594 list_for_each_entry_continue(core, &cluster->cores, elem) {
595 if (k3_r5_core_halt(core))
596 dev_warn(core->dev, "core halt back
failed\n");
597 }
598 put_mbox:
599 mbox_free_channel(kproc->mbox);
600 return ret;
601 }
regards,
dan carpenter