From 033cd4d7df58d5b9b36e643199af83b3491b8161 Mon Sep 17 00:00:00 2001 From: ligd Date: Mon, 6 Jun 2022 11:52:23 +0800 Subject: [PATCH] rptun: use seperated lock Signed-off-by: ligd --- drivers/rptun/rptun.c | 94 ++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 37 deletions(-) diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c index e71f9ef5106..b39211f2b61 100644 --- a/drivers/rptun/rptun.c +++ b/drivers/rptun/rptun.c @@ -71,6 +71,7 @@ struct rptun_priv_s struct rpmsg_virtio_shm_pool tx_shpool; struct rpmsg_virtio_shm_pool rx_shpool; struct metal_list bind; + mutex_t lock; struct metal_list node; sem_t sem; unsigned long cmd; @@ -194,11 +195,12 @@ static struct image_store_ops g_rptun_storeops = }; #endif -static rmutex_t g_rptunlock = NXRMUTEX_INITIALIZER; - static METAL_DECLARE_LIST(g_rptun_cb); static METAL_DECLARE_LIST(g_rptun_priv); +static mutex_t g_rptun_lockcb = NXMUTEX_INITIALIZER; +static mutex_t g_rptun_lockpriv = NXMUTEX_INITIALIZER; + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -488,9 +490,7 @@ static void rptun_ns_bind(FAR struct rpmsg_device *rdev, bind->dest = dest; strlcpy(bind->name, name, RPMSG_NAME_SIZE); - rptun_lock(); - - metal_list_add_tail(&priv->bind, &bind->node); + nxmutex_lock(&g_rptun_lockcb); metal_list_for_each(&g_rptun_cb, node) { @@ -501,7 +501,11 @@ static void rptun_ns_bind(FAR struct rpmsg_device *rdev, } } - rptun_unlock(); + nxmutex_unlock(&g_rptun_lockcb); + + nxmutex_lock(&priv->lock); + metal_list_add_tail(&priv->bind, &bind->node); + nxmutex_unlock(&priv->lock); } } @@ -511,7 +515,7 @@ static void rptun_ns_unbind(FAR struct rpmsg_device *rdev, FAR struct rptun_priv_s *priv = rptun_get_priv_by_rdev(rdev); FAR struct metal_list *node; - rptun_lock(); + nxmutex_lock(&priv->lock); metal_list_for_each(&priv->bind, node) { @@ -527,7 +531,7 @@ static void rptun_ns_unbind(FAR struct rpmsg_device *rdev, } } - rptun_unlock(); + nxmutex_unlock(&priv->lock); } static int rptun_dev_start(FAR struct remoteproc *rproc) @@ -540,7 +544,7 @@ static int rptun_dev_start(FAR struct remoteproc *rproc) unsigned int role = RPMSG_REMOTE; int ret; - ret = remoteproc_config(&priv->rproc, NULL); + ret = remoteproc_config(rproc, NULL); if (ret) { return ret; @@ -685,18 +689,14 @@ static int rptun_dev_start(FAR struct remoteproc *rproc) return ret; } - rptun_lock(); - /* Register callback to mbox for receiving remote message */ RPTUN_REGISTER_CALLBACK(priv->dev, rptun_callback, priv); - /* Add priv to list */ - - metal_list_add_tail(&g_rptun_priv, &priv->node); - /* Broadcast device_created to all registers */ + nxmutex_lock(&g_rptun_lockcb); + metal_list_for_each(&g_rptun_cb, node) { cb = metal_container_of(node, struct rptun_cb_s, node); @@ -706,7 +706,13 @@ static int rptun_dev_start(FAR struct remoteproc *rproc) } } - rptun_unlock(); + nxmutex_unlock(&g_rptun_lockcb); + + /* Add priv to list */ + + nxmutex_lock(&g_rptun_lockpriv); + metal_list_add_tail(&g_rptun_priv, &priv->node); + nxmutex_unlock(&g_rptun_lockpriv); virtqueue_enable_cb(priv->rvdev.svq); @@ -730,14 +736,16 @@ static int rptun_dev_stop(FAR struct remoteproc *rproc) RPTUN_UNREGISTER_CALLBACK(priv->dev); - rptun_lock(); - /* Remove priv from list */ + nxmutex_lock(&g_rptun_lockpriv); metal_list_del(&priv->node); + nxmutex_unlock(&g_rptun_lockpriv); /* Broadcast device_destroy to all registers */ + nxmutex_lock(&g_rptun_lockcb); + metal_list_for_each(&g_rptun_cb, node) { cb = metal_container_of(node, struct rptun_cb_s, node); @@ -747,7 +755,7 @@ static int rptun_dev_stop(FAR struct remoteproc *rproc) } } - rptun_unlock(); + nxmutex_unlock(&g_rptun_lockcb); /* Remote proc stop and shutdown */ @@ -1025,9 +1033,7 @@ int rpmsg_register_callback(FAR void *priv_, cb->device_destroy = device_destroy; cb->ns_bind = ns_bind; - rptun_lock(); - - metal_list_add_tail(&g_rptun_cb, &cb->node); + nxmutex_lock(&g_rptun_lockpriv); metal_list_for_each(&g_rptun_priv, node) { @@ -1041,6 +1047,8 @@ int rpmsg_register_callback(FAR void *priv_, if (ns_bind) { + nxmutex_lock(&priv->lock); + metal_list_for_each(&priv->bind, bnode) { struct rptun_bind_s *bind; @@ -1048,10 +1056,16 @@ int rpmsg_register_callback(FAR void *priv_, bind = metal_container_of(bnode, struct rptun_bind_s, node); ns_bind(&priv->rvdev.rdev, priv_, bind->name, bind->dest); } + + nxmutex_unlock(&priv->lock); } } - rptun_unlock(); + nxmutex_unlock(&g_rptun_lockpriv); + + nxmutex_lock(&g_rptun_lockcb); + metal_list_add_tail(&g_rptun_cb, &cb->node); + nxmutex_unlock(&g_rptun_lockcb); return 0; } @@ -1064,7 +1078,7 @@ void rpmsg_unregister_callback(FAR void *priv_, FAR struct metal_list *node; FAR struct metal_list *pnode; - rptun_lock(); + nxmutex_lock(&g_rptun_lockcb); metal_list_for_each(&g_rptun_cb, node) { @@ -1076,18 +1090,6 @@ void rpmsg_unregister_callback(FAR void *priv_, cb->device_destroy == device_destroy && cb->ns_bind == ns_bind) { - if (device_destroy) - { - metal_list_for_each(&g_rptun_priv, pnode) - { - struct rptun_priv_s *priv; - - priv = metal_container_of(pnode, - struct rptun_priv_s, node); - device_destroy(&priv->rvdev.rdev, priv_); - } - } - metal_list_del(&cb->node); kmm_free(cb); @@ -1095,7 +1097,23 @@ void rpmsg_unregister_callback(FAR void *priv_, } } - rptun_unlock(); + nxmutex_unlock(&g_rptun_lockcb); + + if (device_destroy) + { + nxmutex_lock(&g_rptun_lockpriv); + + metal_list_for_each(&g_rptun_priv, pnode) + { + struct rptun_priv_s *priv; + + priv = metal_container_of(pnode, + struct rptun_priv_s, node); + device_destroy(&priv->rvdev.rdev, priv_); + } + + nxmutex_unlock(&g_rptun_lockpriv); + } } int rptun_initialize(FAR struct rptun_dev_s *dev) @@ -1126,6 +1144,7 @@ int rptun_initialize(FAR struct rptun_dev_s *dev) remoteproc_init(&priv->rproc, &g_rptun_ops, priv); metal_list_init(&priv->bind); + nxmutex_init(&priv->lock); snprintf(name, sizeof(name), "/dev/rptun/%s", RPTUN_GET_CPUNAME(dev)); ret = register_driver(name, &g_rptun_devops, 0222, priv); @@ -1173,6 +1192,7 @@ int rptun_initialize(FAR struct rptun_dev_s *dev) return OK; err_driver: + nxmutex_destroy(&priv->lock); kmm_free(priv); err_mem: