From cc6b95f5043a591243984e37c541802affc04f8c Mon Sep 17 00:00:00 2001 From: chao an Date: Tue, 31 Oct 2023 16:44:50 +0800 Subject: [PATCH] drivers/rptun: check the status before stop remote proc 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 | #1 0x024a938c in rpmsg_deinit_vdev (rvdev=0xf2303a48) at open-amp/lib/rpmsg/rpmsg_virtio.c:971 | #2 0x02117e33 in rptun_dev_stop (rproc=0xf2303a04, stop_ns=true) at rptun/rptun.c:891 | #3 0x021181d8 in rptun_do_ioctl (priv=0xf2303a00, cmd=11010, arg=0) at rptun/rptun.c:922 | #4 0x02119722 in rptun_ioctl_foreach (cpuname=0x0, cmd=11010, value=0) at rptun/rptun.c:1086 | #5 0x0211b9df in rptun_poweroff (cpuname=0x0) at rptun/rptun.c:1378 | #6 0x02053aa6 in board_power_off (status=0) at sim/sim_head.c:206 | #7 0x0253d65c in boardctl (cmd=65283, arg=0) at boardctl.c:400 | #8 0x021eb497 in cmd_poweroff (vtbl=0xef606280, argc=1, argv=0xef9b73e0) at nsh_syscmds.c:356 | #9 0x021cdb4d in nsh_command (vtbl=0xef606280, argc=1, argv=0xef9b73e0) at nsh_command.c:1164 | #10 0x021baa72 in nsh_execute (vtbl=0xef606280, argc=1, argv=0xef9b73e0, redirfile=0x0, oflags=0) at nsh_parse.c:845 | #11 0x021c6b0a in nsh_parse_command (vtbl=0xef606280, cmdline=0xef606708 "poweroff") at nsh_parse.c:2744 | #12 0x021c7166 in nsh_parse (vtbl=0xef606280, cmdline=0xef606708 "poweroff") at nsh_parse.c:2828 | #13 0x0221fa2f in nsh_session (pstate=0xef606280, login=1, argc=1, argv=0xef7a7860) at nsh_session.c:245 | #14 0x021f8c04 in nsh_consolemain (argc=1, argv=0xef7a7860) at nsh_consolemain.c:75 | #15 0x021b77eb in nsh_main (argc=1, argv=0xef7a7860) at nsh_main.c:74 | #16 0x02166ddf in nxtask_startup (entrypt=0x21b76ca , argc=1, argv=0xef7a7860) at sched/task_startup.c:70 | #17 0x020b363c in nxtask_start () at task/task_start.c:134 Signed-off-by: chao an --- drivers/rptun/rptun.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c index d3447d8448b95..ad1943caff311 100644 --- a/drivers/rptun/rptun.c +++ b/drivers/rptun/rptun.c @@ -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 @@ -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, @@ -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);