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 2021/07/27 02:38:14 UTC

[incubator-nuttx] branch master updated (2d676f5 -> 7e39376)

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

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


    from 2d676f5  xtensa/esp32: Enable configuration of GPIO pad's  drive strength
     new 068353b  drivers/rptun: Start/stop remote processor in the background thread
     new 7e39376  sim/rptun: optimize multi-core startup and don't need to wait each other.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 arch/sim/src/sim/up_hostmemory.c |  31 ++++--------
 arch/sim/src/sim/up_rptun.c      | 106 +++++++++++++++++++++------------------
 drivers/rptun/rptun.c            |  94 +++++++++++++++++++++++-----------
 3 files changed, 130 insertions(+), 101 deletions(-)

[incubator-nuttx] 02/02: sim/rptun: optimize multi-core startup and don't need to wait each other.

Posted by xi...@apache.org.
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 7e393762a719c54fb866e62ba7d720268ba05b99
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Tue Jul 20 15:57:55 2021 +0800

    sim/rptun: optimize multi-core startup and don't need to wait each other.
    
    Change-Id: I6172823c84a96e4082fa5f33bdb05d7bd1d3b056
    Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
 arch/sim/src/sim/up_hostmemory.c |  31 ++++--------
 arch/sim/src/sim/up_rptun.c      | 106 +++++++++++++++++++++------------------
 2 files changed, 66 insertions(+), 71 deletions(-)

diff --git a/arch/sim/src/sim/up_hostmemory.c b/arch/sim/src/sim/up_hostmemory.c
index 07cad25..0d8ddb1 100644
--- a/arch/sim/src/sim/up_hostmemory.c
+++ b/arch/sim/src/sim/up_hostmemory.c
@@ -86,28 +86,17 @@ void *host_alloc_shmem(const char *name, size_t size, int master)
       oflag |= O_CREAT | O_TRUNC;
     }
 
-  while (1)
+  fd = shm_open(name, oflag, S_IRUSR | S_IWUSR);
+  if (fd < 0)
     {
-      fd = shm_open(name, oflag, S_IRUSR | S_IWUSR);
-      if (fd >= 0)
-        {
-          if (!master)
-            {
-              /* Avoid the second slave instance open successfully */
-
-              shm_unlink(name);
-            }
-          break;
-        }
-
-      if (master || errno != ENOENT)
-        {
-          return NULL;
-        }
-
-      /* Master isn't ready, sleep and try again */
-
-      usleep(1000);
+      return NULL;
+    }
+
+  if (!master)
+    {
+      /* Avoid the second slave instance open successfully */
+
+      shm_unlink(name);
     }
 
   ret = ftruncate(fd, size);
diff --git a/arch/sim/src/sim/up_rptun.c b/arch/sim/src/sim/up_rptun.c
index 8af25e7..b4a3e5d 100644
--- a/arch/sim/src/sim/up_rptun.c
+++ b/arch/sim/src/sim/up_rptun.c
@@ -52,6 +52,7 @@ struct sim_rptun_dev_s
   struct sim_rptun_shmem_s *shmem;
   struct simple_addrenv_s   addrenv[2];
   char                      cpuname[RPMSG_NAME_SIZE + 1];
+  char                      shmemname[RPMSG_NAME_SIZE + 1];
 };
 
 /****************************************************************************
@@ -82,9 +83,61 @@ sim_rptun_get_resource(struct rptun_dev_s *dev)
 {
   struct sim_rptun_dev_s *priv = container_of(dev,
                                  struct sim_rptun_dev_s, rptun);
-  struct sim_rptun_shmem_s *shmem = priv->shmem;
 
-  return &shmem->rsc;
+  if (priv->shmem)
+    {
+      return &priv->shmem->rsc;
+    }
+
+  while (priv->shmem == NULL)
+    {
+      priv->shmem = host_alloc_shmem(priv->shmemname, sizeof(*priv->shmem),
+                                     priv->master);
+      usleep(1000);
+
+      /* Master isn't ready, sleep and try again */
+    }
+
+  if (priv->master)
+    {
+      struct rptun_rsc_s *rsc = &priv->shmem->rsc;
+
+      rsc->rsc_tbl_hdr.ver          = 1;
+      rsc->rsc_tbl_hdr.num          = 1;
+      rsc->offset[0]                = offsetof(struct rptun_rsc_s,
+                                               rpmsg_vdev);
+      rsc->rpmsg_vdev.type          = RSC_VDEV;
+      rsc->rpmsg_vdev.id            = VIRTIO_ID_RPMSG;
+      rsc->rpmsg_vdev.dfeatures     = 1 << VIRTIO_RPMSG_F_NS
+                                    | 1 << VIRTIO_RPMSG_F_ACK
+                                    | 1 << VIRTIO_RPMSG_F_BUFSZ;
+      rsc->rpmsg_vdev.num_of_vrings = 2;
+      rsc->rpmsg_vring0.align       = 8;
+      rsc->rpmsg_vring0.num         = 8;
+      rsc->rpmsg_vring1.align       = 8;
+      rsc->rpmsg_vring1.num         = 8;
+      rsc->config.rxbuf_size        = 0x800;
+      rsc->config.txbuf_size        = 0x800;
+
+      priv->shmem->base              = (uintptr_t)priv->shmem;
+    }
+  else
+    {
+      /* Wait untils master is ready */
+
+      while (priv->shmem->base == 0)
+        {
+          usleep(1000);
+        }
+
+      priv->addrenv[0].va          = (uintptr_t)priv->shmem;
+      priv->addrenv[0].pa          = priv->shmem->base;
+      priv->addrenv[0].size        = sizeof(*priv->shmem);
+
+      simple_addrenv_initialize(priv->addrenv);
+    }
+
+  return &priv->shmem->rsc;
 }
 
 static bool sim_rptun_is_autostart(struct rptun_dev_s *dev)
@@ -199,63 +252,16 @@ int up_rptun_init(const char *shmemname, const char *cpuname, bool master)
       return -ENOMEM;
     }
 
-  dev->shmem = host_alloc_shmem(shmemname, sizeof(*dev->shmem),
-                                master);
-  if (dev->shmem == NULL)
-    {
-      kmm_free(dev);
-      return -ENOMEM;
-    }
-
   dev->master = master;
   dev->rptun.ops = &g_sim_rptun_ops;
   strncpy(dev->cpuname, cpuname, RPMSG_NAME_SIZE);
+  strncpy(dev->shmemname, shmemname, RPMSG_NAME_SIZE);
   list_add_tail(&g_dev_list, &dev->node);
 
-  if (master)
-    {
-      struct rptun_rsc_s *rsc = &dev->shmem->rsc;
-
-      rsc->rsc_tbl_hdr.ver          = 1;
-      rsc->rsc_tbl_hdr.num          = 1;
-      rsc->offset[0]                = offsetof(struct rptun_rsc_s,
-                                               rpmsg_vdev);
-      rsc->rpmsg_vdev.type          = RSC_VDEV;
-      rsc->rpmsg_vdev.id            = VIRTIO_ID_RPMSG;
-      rsc->rpmsg_vdev.dfeatures     = 1 << VIRTIO_RPMSG_F_NS
-                                    | 1 << VIRTIO_RPMSG_F_ACK
-                                    | 1 << VIRTIO_RPMSG_F_BUFSZ;
-      rsc->rpmsg_vdev.num_of_vrings = 2;
-      rsc->rpmsg_vring0.align       = 8;
-      rsc->rpmsg_vring0.num         = 8;
-      rsc->rpmsg_vring1.align       = 8;
-      rsc->rpmsg_vring1.num         = 8;
-      rsc->config.rxbuf_size        = 0x800;
-      rsc->config.txbuf_size        = 0x800;
-
-      dev->shmem->base              = (uintptr_t)dev->shmem;
-    }
-  else
-    {
-      /* Wait untils master is ready */
-
-      while (dev->shmem->base == 0)
-        {
-          host_sleep(1000);
-        }
-
-      dev->addrenv[0].va          = (uintptr_t)dev->shmem;
-      dev->addrenv[0].pa          = dev->shmem->base;
-      dev->addrenv[0].size        = sizeof(*dev->shmem);
-
-      simple_addrenv_initialize(dev->addrenv);
-    }
-
   ret = rptun_initialize(&dev->rptun);
   if (ret < 0)
     {
       list_delete(&dev->node);
-      host_free_shmem(dev->shmem);
       kmm_free(dev);
     }
 

[incubator-nuttx] 01/02: drivers/rptun: Start/stop remote processor in the background thread

Posted by xi...@apache.org.
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 068353bba735e84656c4a30ce75261be683e6268
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Thu Jul 15 15:47:42 2021 +0800

    drivers/rptun: Start/stop remote processor in the background thread
    
    to avoid blocking the main thread initialization process
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
    Change-Id: Ib8ab2a661ee9540bb03d9d4d851a8d8ee212404e
---
 drivers/rptun/rptun.c | 94 +++++++++++++++++++++++++++++++++++----------------
 1 file changed, 64 insertions(+), 30 deletions(-)

diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c
index 14a115b..3711952 100644
--- a/drivers/rptun/rptun.c
+++ b/drivers/rptun/rptun.c
@@ -48,6 +48,8 @@
 #  define ALIGN_UP(s, a)        (((s) + (a) - 1) & ~((a) - 1))
 #endif
 
+#define RPTUNIOC_NONE           0
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
@@ -61,6 +63,7 @@ struct rptun_priv_s
   struct metal_list            bind;
   struct metal_list            node;
   sem_t                        sem;
+  unsigned long                cmd;
 };
 
 struct rptun_bind_s
@@ -169,19 +172,37 @@ static int rptun_thread(int argc, FAR char *argv[])
   FAR struct rptun_priv_s *priv;
 
   priv = (FAR struct rptun_priv_s *)((uintptr_t)strtoul(argv[2], NULL, 0));
+  remoteproc_init(&priv->rproc, &g_rptun_ops, priv);
 
   while (1)
     {
       nxsem_wait_uninterruptible(&priv->sem);
-      remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
+      switch (priv->cmd)
+        {
+          case RPTUNIOC_START:
+            if (priv->rproc.state == RPROC_OFFLINE)
+              {
+                rptun_dev_start(&priv->rproc);
+              }
+            break;
+
+          case RPTUNIOC_STOP:
+            if (priv->rproc.state != RPROC_OFFLINE)
+              {
+                rptun_dev_stop(&priv->rproc);
+              }
+            break;
+        }
+
+        priv->cmd = RPTUNIOC_NONE;
+        remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
     }
 
   return 0;
 }
 
-static int rptun_callback(FAR void *arg, uint32_t vqid)
+static void rptun_wakeup(FAR struct rptun_priv_s *priv)
 {
-  FAR struct rptun_priv_s *priv = arg;
   int semcount;
 
   nxsem_get_value(&priv->sem, &semcount);
@@ -189,7 +210,11 @@ static int rptun_callback(FAR void *arg, uint32_t vqid)
     {
       nxsem_post(&priv->sem);
     }
+}
 
+static int rptun_callback(FAR void *arg, uint32_t vqid)
+{
+  rptun_wakeup(arg);
   return OK;
 }
 
@@ -553,22 +578,18 @@ static int rptun_dev_ioctl(FAR struct file *filep, int cmd,
 {
   FAR struct inode *inode = filep->f_inode;
   FAR struct rptun_priv_s *priv = inode->i_private;
-  int ret = -ENOTTY;
+  int ret = OK;
 
   switch (cmd)
     {
       case RPTUNIOC_START:
-        if (priv->rproc.state == RPROC_OFFLINE)
-          {
-            ret = rptun_dev_start(&priv->rproc);
-          }
+      case RPTUNIOC_STOP:
+        priv->cmd = cmd;
+        rptun_wakeup(priv);
         break;
 
-      case RPTUNIOC_STOP:
-        if (priv->rproc.state != RPROC_OFFLINE)
-          {
-            ret = rptun_dev_stop(&priv->rproc);
-          }
+      default:
+        ret = -ENOTTY;
         break;
     }
 
@@ -802,7 +823,7 @@ int rptun_initialize(FAR struct rptun_dev_s *dev)
   int ret;
 
   ret = metal_init(&params);
-  if (ret)
+  if (ret < 0)
     {
       return ret;
     }
@@ -810,18 +831,32 @@ int rptun_initialize(FAR struct rptun_dev_s *dev)
   priv = kmm_zalloc(sizeof(struct rptun_priv_s));
   if (priv == NULL)
     {
-      return -ENOMEM;
+      ret = -ENOMEM;
+      goto err_mem;
     }
 
-  snprintf(arg1, 16, "0x%" PRIxPTR, (uintptr_t)priv);
+  priv->dev = dev;
+  if (RPTUN_IS_AUTOSTART(dev))
+    {
+      priv->cmd = RPTUNIOC_START;
+    }
+
+  metal_list_init(&priv->bind);
+  nxsem_init(&priv->sem, 0, RPTUN_IS_AUTOSTART(dev) ? 1 : 0);
+  nxsem_set_protocol(&priv->sem, SEM_PRIO_NONE);
+
+  snprintf(name, 32, "/dev/rptun/%s", RPTUN_GET_CPUNAME(dev));
+  ret = register_driver(name, &g_rptun_devops, 0666, priv);
+  if (ret < 0)
+    {
+      goto err_driver;
+    }
 
+  snprintf(arg1, 16, "0x%" PRIxPTR, (uintptr_t)priv);
   argv[0] = (void *)RPTUN_GET_CPUNAME(dev);
   argv[1] = arg1;
   argv[2] = NULL;
 
-  nxsem_init(&priv->sem, 0, 0);
-  nxsem_set_protocol(&priv->sem, SEM_PRIO_NONE);
-
   ret = kthread_create("rptun",
                        CONFIG_RPTUN_PRIORITY,
                        CONFIG_RPTUN_STACKSIZE,
@@ -829,22 +864,21 @@ int rptun_initialize(FAR struct rptun_dev_s *dev)
                        argv);
   if (ret < 0)
     {
-      kmm_free(priv);
-      return ret;
+      goto err_thread;
     }
 
-  priv->dev = dev;
+  return OK;
 
-  metal_list_init(&priv->bind);
-  remoteproc_init(&priv->rproc, &g_rptun_ops, priv);
+err_thread:
+  unregister_driver(name);
 
-  if (RPTUN_IS_AUTOSTART(dev))
-    {
-      rptun_dev_start(&priv->rproc);
-    }
+err_driver:
+  nxsem_destroy(&priv->sem);
+  kmm_free(priv);
 
-  snprintf(name, 32, "/dev/rptun/%s", RPTUN_GET_CPUNAME(dev));
-  return register_driver(name, &g_rptun_devops, 0666, priv);
+err_mem:
+  metal_finish();
+  return ret;
 }
 
 int rptun_boot(FAR const char *cpuname)