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

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 3183d5e1abbaa2afd9016f72f439963c5877e253
Author: Bowen Wang <[email protected]>
AuthorDate: Wed Jun 25 10:58:47 2025 +0800

    rpmsg/rpmsg_virtio: take the PM lock with the nopreempt spinlock
    
    pm_wakelock_stay() and pm_wakelock_relax() can switch context, which
    must not happen while priv->lock is held with only interrupts disabled.
    Use spin_lock_irqsave_nopreempt(), and take the lock in
    rpmsg_virtio_pm_callback() as well so the PM state cannot race with the
    TX path on SMP.
    
    Signed-off-by: Bowen Wang <[email protected]>
---
 drivers/rpmsg/rpmsg_virtio.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/rpmsg/rpmsg_virtio.c b/drivers/rpmsg/rpmsg_virtio.c
index a1f542e9fe8..62ebede1817 100644
--- a/drivers/rpmsg/rpmsg_virtio.c
+++ b/drivers/rpmsg/rpmsg_virtio.c
@@ -154,6 +154,9 @@ static void rpmsg_virtio_pm_callback(wdparm_t arg)
 {
   FAR struct rpmsg_virtio_priv_s *priv =
     (FAR struct rpmsg_virtio_priv_s *)arg;
+  irqstate_t flags;
+
+  flags = spin_lock_irqsave_nopreempt(&priv->lock);
 
   if (rpmsg_virtio_buffer_nused(&priv->rvdev, false))
     {
@@ -164,6 +167,8 @@ static void rpmsg_virtio_pm_callback(wdparm_t arg)
     {
       pm_wakelock_relax(&priv->wakelock);
     }
+
+  spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
 }
 #endif
 
@@ -179,7 +184,7 @@ rpmsg_virtio_pm_action(FAR struct rpmsg_virtio_priv_s 
*priv, bool stay)
   irqstate_t flags;
   int count;
 
-  flags = spin_lock_irqsave(&priv->lock);
+  flags = spin_lock_irqsave_nopreempt(&priv->lock);
 
   count = pm_wakelock_staycount(&priv->wakelock);
   if (stay && count == 0)
@@ -204,7 +209,7 @@ rpmsg_virtio_pm_action(FAR struct rpmsg_virtio_priv_s 
*priv, bool stay)
     }
 #endif
 
-  spin_unlock_irqrestore(&priv->lock, flags);
+  spin_unlock_irqrestore_nopreempt(&priv->lock, flags);
 }
 
 /****************************************************************************

Reply via email to