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/08/01 17:29:26 UTC

[incubator-nuttx] 22/22: driver/sensor: fix deadlock about sensor_rpmsg

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 78381f9fc439f2d9d84ed738a3405ed269fda0be
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Mon Jul 4 11:08:30 2022 +0800

    driver/sensor: fix deadlock about sensor_rpmsg
    
    task1:
    nuttx/arch/arm/src/common/arm_blocktask.c:151
    nxsem_wait
    nuttx/arch/arm/src/../../../sched/semaphore/sem_wait.c:155 (discriminator 2)
    sem_wait
    nuttx/arch/arm/src/../../../sched/semaphore/sem_wait.c:273
    nxmutex_lock.lto_priv.2
    nuttx/include/nuttx/mutex.h:161
    sensor_rpmsg_push_event_one
    nuttx/arch/arm/src/../../../drivers/sensors/sensor_rpmsg.c:748
    up_unblock_task
    nuttx/arch/arm/src/common/arm_unblocktask.c:75 (discriminator 2)
    sensor_rpmsg_push_event
    nuttx/arch/arm/src/../../../drivers/sensors/sensor_rpmsg.c:858
    write
    orb_publish_multi
    nuttx/arch/arm/src/../../../../apps/system/uorb/uORB/uORB.c:188
    
    task2:
    nxrmutex_lock.isra.0
    sensor_read
    nuttx/arch/arm/src/../../../drivers/sensors/sensor.c:753
    sem_post
    nuttx/arch/arm/src/../../../sched/semaphore/sem_post.c:224
    nxmutex_unlock.lto_priv.1
    nuttx/include/nuttx/mutex.h:259
    sensor_rpmsg_push_event_one
    nuttx/arch/arm/src/../../../drivers/sensors/sensor_rpmsg.c:787
    nxmutex_unlock.lto_priv.1
    nuttx/include/nuttx/mutex.h:259
    nuttx/arch/arm/src/../../../drivers/sensors/sensor.c:969
    sensor_rpmsg_alloc_stub
    nuttx/arch/arm/src/../../../drivers/sensors/sensor_rpmsg.c:549
    sensor_rpmsg_advack_handler
    
    Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
 drivers/sensors/sensor_rpmsg.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 0243119f3a..37351fd23d 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -541,13 +541,14 @@ sensor_rpmsg_alloc_stub(FAR struct sensor_rpmsg_dev_s *dev,
 
   sensor_rpmsg_lock(dev);
   list_add_tail(&dev->stublist, &stub->node);
-  sensor_rpmsg_unlock(dev);
 
   if (dev->lower.persist)
     {
       sensor_rpmsg_push_event_one(dev, stub);
     }
 
+  sensor_rpmsg_unlock(dev);
+
   return stub;
 }