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:16 UTC

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

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);
     }