drivers/rptun: replace the notification mech from signal to semaphore

Change-Id: Ic06b945effa876f5aff2f8ddc1fe5775c75f77b1
Signed-off-by: chao.an <anchao@xiaomi.com>
(cherry picked from commit 8df58e5675cab032da16e371c4686929a19ee897)
This commit is contained in:
chao.an 2021-06-17 18:03:07 +08:00 committed by Gustavo Henrique Nihei
parent 73a0c1d095
commit 80bfe13b54

View File

@ -31,9 +31,9 @@
#include <nuttx/arch.h>
#include <nuttx/kmalloc.h>
#include <nuttx/kthread.h>
#include <nuttx/semaphore.h>
#include <nuttx/rptun/openamp.h>
#include <nuttx/rptun/rptun.h>
#include <nuttx/signal.h>
#include <metal/utilities.h>
/****************************************************************************
@ -60,7 +60,7 @@ struct rptun_priv_s
struct rpmsg_virtio_shm_pool shm_pool;
struct metal_list bind;
struct metal_list node;
int pid;
sem_t sem;
};
struct rptun_bind_s
@ -167,22 +167,13 @@ static METAL_DECLARE_LIST(g_rptun_priv);
static int rptun_thread(int argc, FAR char *argv[])
{
FAR struct rptun_priv_s *priv;
sigset_t set;
int ret;
priv = (FAR struct rptun_priv_s *)((uintptr_t)strtoul(argv[2], NULL, 0));
sigemptyset(&set);
nxsig_addset(&set, SIGUSR1);
nxsig_procmask(SIG_BLOCK, &set, NULL);
while (1)
{
ret = nxsig_timedwait(&set, NULL, NULL);
if (ret == SIGUSR1)
{
remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
}
nxsem_wait_uninterruptible(&priv->sem);
remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
}
return 0;
@ -191,8 +182,15 @@ static int rptun_thread(int argc, FAR char *argv[])
static int rptun_callback(FAR void *arg, uint32_t vqid)
{
FAR struct rptun_priv_s *priv = arg;
int semcount;
return nxsig_kill(priv->pid, SIGUSR1);
nxsem_get_value(&priv->sem, &semcount);
if (semcount < 1)
{
nxsem_post(&priv->sem);
}
return OK;
}
static FAR struct remoteproc *rptun_init(FAR struct remoteproc *rproc,
@ -821,6 +819,9 @@ int rptun_initialize(FAR struct rptun_dev_s *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,
@ -832,7 +833,6 @@ int rptun_initialize(FAR struct rptun_dev_s *dev)
return ret;
}
priv->pid = ret;
priv->dev = dev;
metal_list_init(&priv->bind);