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