You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/07/27 12:37:01 UTC

[incubator-nuttx] 04/06: rptun: use seperated lock

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 033cd4d7df58d5b9b36e643199af83b3491b8161
Author: ligd <li...@xiaomi.com>
AuthorDate: Mon Jun 6 11:52:23 2022 +0800

    rptun: use seperated lock
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 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 e71f9ef510..b39211f2b6 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: