Skip to content

Commit

Permalink
drivers/rptun: check the status before stop remote proc
Browse files Browse the repository at this point in the history
Race condition if the remote proc is stoped during initialization phase

| #0  0x0249f959 in rpmsg_destroy_ept (ept=0xffffffc0) at open-amp/lib/rpmsg/rpmsg.c:376
| apache#1  0x024a938c in rpmsg_deinit_vdev (rvdev=0xf2303a48) at open-amp/lib/rpmsg/rpmsg_virtio.c:971
| apache#2  0x02117e33 in rptun_dev_stop (rproc=0xf2303a04, stop_ns=true) at rptun/rptun.c:891
| apache#3  0x021181d8 in rptun_do_ioctl (priv=0xf2303a00, cmd=11010, arg=0) at rptun/rptun.c:922
| apache#4  0x02119722 in rptun_ioctl_foreach (cpuname=0x0, cmd=11010, value=0) at rptun/rptun.c:1086
| apache#5  0x0211b9df in rptun_poweroff (cpuname=0x0) at rptun/rptun.c:1378
| apache#6  0x02053aa6 in board_power_off (status=0) at sim/sim_head.c:206
| apache#7  0x0253d65c in boardctl (cmd=65283, arg=0) at boardctl.c:400
| apache#8  0x021eb497 in cmd_poweroff (vtbl=0xef606280, argc=1, argv=0xef9b73e0) at nsh_syscmds.c:356
| apache#9  0x021cdb4d in nsh_command (vtbl=0xef606280, argc=1, argv=0xef9b73e0) at nsh_command.c:1164
| apache#10 0x021baa72 in nsh_execute (vtbl=0xef606280, argc=1, argv=0xef9b73e0, redirfile=0x0, oflags=0) at nsh_parse.c:845
| apache#11 0x021c6b0a in nsh_parse_command (vtbl=0xef606280, cmdline=0xef606708 "poweroff") at nsh_parse.c:2744
| apache#12 0x021c7166 in nsh_parse (vtbl=0xef606280, cmdline=0xef606708 "poweroff") at nsh_parse.c:2828
| apache#13 0x0221fa2f in nsh_session (pstate=0xef606280, login=1, argc=1, argv=0xef7a7860) at nsh_session.c:245
| apache#14 0x021f8c04 in nsh_consolemain (argc=1, argv=0xef7a7860) at nsh_consolemain.c:75
| apache#15 0x021b77eb in nsh_main (argc=1, argv=0xef7a7860) at nsh_main.c:74
| apache#16 0x02166ddf in nxtask_startup (entrypt=0x21b76ca <nsh_main>, argc=1, argv=0xef7a7860) at sched/task_startup.c:70
| apache#17 0x020b363c in nxtask_start () at task/task_start.c:134

Signed-off-by: chao an <anchao@xiaomi.com>
  • Loading branch information
anchao authored and nealef committed Jan 8, 2024
1 parent 1fffbf6 commit 55b2ce0
Showing 1 changed file with 18 additions and 8 deletions.
26 changes: 18 additions & 8 deletions drivers/rptun/rptun.c
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,16 @@ static int rptun_dev_stop(FAR struct remoteproc *rproc, bool stop_ns)
FAR struct metal_list *tmp;
FAR struct rptun_cb_s *cb;

if (priv->rproc.state == RPROC_OFFLINE)
{
return OK;
}
else if (priv->rproc.state == RPROC_CONFIGURED ||
priv->rproc.state == RPROC_READY)
{
return -EBUSY;
}

rdev->support_ns = stop_ns;

#ifdef CONFIG_RPTUN_PING
Expand Down Expand Up @@ -805,7 +815,7 @@ static int rptun_dev_stop(FAR struct remoteproc *rproc, bool stop_ns)

remoteproc_shutdown(rproc);

return 0;
return OK;
}

static int rptun_do_ioctl(FAR struct rptun_priv_s *priv, int cmd,
Expand All @@ -818,19 +828,19 @@ static int rptun_do_ioctl(FAR struct rptun_priv_s *priv, int cmd,
case RPTUNIOC_START:
if (priv->rproc.state == RPROC_OFFLINE)
{
rptun_dev_start(&priv->rproc);
ret = rptun_dev_start(&priv->rproc);
}
else
{
rptun_dev_stop(&priv->rproc, false);
rptun_dev_start(&priv->rproc);
ret = rptun_dev_stop(&priv->rproc, false);
if (ret == OK)
{
ret = rptun_dev_start(&priv->rproc);
}
}
break;
case RPTUNIOC_STOP:
if (priv->rproc.state != RPROC_OFFLINE)
{
rptun_dev_stop(&priv->rproc, true);
}
ret = rptun_dev_stop(&priv->rproc, true);
break;
case RPTUNIOC_RESET:
RPTUN_RESET(priv->dev, arg);
Expand Down

0 comments on commit 55b2ce0

Please sign in to comment.