From 8aa51452739ef1b2364841ce6b68e83614b23170 Mon Sep 17 00:00:00 2001 From: ligd Date: Mon, 31 Oct 2022 23:40:16 +0800 Subject: [PATCH] rptun: fix race-condition on g_rptun_cb & g_rptun_priv both rptun_dev_start() & rpmsg_register_callback() will use these two lists Signed-off-by: ligd --- drivers/rptun/rptun.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c index 8cdbc92109..e7b49740ca 100644 --- a/drivers/rptun/rptun.c +++ b/drivers/rptun/rptun.c @@ -196,8 +196,7 @@ static const struct image_store_ops g_rptun_storeops = static METAL_DECLARE_LIST(g_rptun_cb); static METAL_DECLARE_LIST(g_rptun_priv); -static rmutex_t g_rptun_lockcb = NXRMUTEX_INITIALIZER; -static rmutex_t g_rptun_lockpriv = NXRMUTEX_INITIALIZER; +static rmutex_t g_rptun_lockcb = NXRMUTEX_INITIALIZER; /**************************************************************************** * Private Functions @@ -746,13 +745,10 @@ static int rptun_dev_start(FAR struct remoteproc *rproc) } } - nxrmutex_unlock(&g_rptun_lockcb); - /* Add priv to list */ - nxrmutex_lock(&g_rptun_lockpriv); metal_list_add_tail(&g_rptun_priv, &priv->node); - nxrmutex_unlock(&g_rptun_lockpriv); + nxrmutex_unlock(&g_rptun_lockcb); virtqueue_enable_cb(priv->rvdev.svq); @@ -778,14 +774,11 @@ static int rptun_dev_stop(FAR struct remoteproc *rproc) /* Remove priv from list */ - nxrmutex_lock(&g_rptun_lockpriv); + nxrmutex_lock(&g_rptun_lockcb); metal_list_del(&priv->node); - nxrmutex_unlock(&g_rptun_lockpriv); /* Broadcast device_destroy to all registers */ - nxrmutex_lock(&g_rptun_lockcb); - metal_list_for_each(&g_rptun_cb, node) { cb = metal_container_of(node, struct rptun_cb_s, node); @@ -1075,7 +1068,7 @@ int rpmsg_register_callback(FAR void *priv_, cb->ns_match = ns_match; cb->ns_bind = ns_bind; - nxrmutex_lock(&g_rptun_lockpriv); + nxrmutex_lock(&g_rptun_lockcb); metal_list_for_each(&g_rptun_priv, node) { @@ -1115,9 +1108,6 @@ again: nxrmutex_unlock(&priv->lock); } - nxrmutex_unlock(&g_rptun_lockpriv); - - nxrmutex_lock(&g_rptun_lockcb); metal_list_add_tail(&g_rptun_cb, &cb->node); nxrmutex_unlock(&g_rptun_lockcb); @@ -1153,12 +1143,8 @@ void rpmsg_unregister_callback(FAR void *priv_, } } - nxrmutex_unlock(&g_rptun_lockcb); - if (device_destroy) { - nxrmutex_lock(&g_rptun_lockpriv); - metal_list_for_each(&g_rptun_priv, pnode) { struct rptun_priv_s *priv; @@ -1167,9 +1153,9 @@ void rpmsg_unregister_callback(FAR void *priv_, struct rptun_priv_s, node); device_destroy(&priv->rvdev.rdev, priv_); } - - nxrmutex_unlock(&g_rptun_lockpriv); } + + nxrmutex_unlock(&g_rptun_lockcb); } int rptun_initialize(FAR struct rptun_dev_s *dev)